TDD和BDD与适用于Android的mockk

TDD和BDD与适用于Android的mockk,android,unit-testing,tdd,bdd,clean-architecture,Android,Unit Testing,Tdd,Bdd,Clean Architecture,我试图在开发带有用例和存储库的干净架构的Android应用程序时,区分TDD和BDD 我已经用登录测试和JUnit5和Mock编写了一个简单的测试。我创建的登录状态是 enum class LoginState { SUCCESS, EMPTY_FIELD_ERROR, CREDENTIALS_ERROR } 并且有一个UseCase具体类,它有一个模拟本地或远程存储库的接口 private val loginRepository:loginRepository=moc

我试图在开发带有用例和存储库的干净架构的Android应用程序时,区分TDD和BDD

我已经用登录测试和JUnit5和Mock编写了一个简单的测试。我创建的登录状态是

enum class LoginState {
    SUCCESS,
    EMPTY_FIELD_ERROR,
    CREDENTIALS_ERROR
}
并且有一个UseCase具体类,它有一个模拟本地或远程存储库的接口

private val loginRepository:loginRepository=mockk()

测试呢

/**
 *  Scenario: Login check with empty fields:
 * * Given I am on the login page
 * * When I enter empty username
 *   And I enter empty password
 *   And I click on the "Login" button
 * * Then I get empty fields error.
 */
@Test
fun `Empty fields result empty fields error`() {

    // Given
    every { loginRepository.login(any(), any()) } returns LoginState.CREDENTIALS_ERROR

    // When
    val expected = loginUseCase.login("", "")

    // Then
    verify(exactly = 0) { loginRepository.login(any(), any()) }
    assertEquals(expected, LoginState.EMPTY_FIELD_ERROR)

}
  • 当我们使用verify时,这个测试是否算作行为驱动的开发测试,如果我只使用了assert,它被认为是TDD吗
  • 我还有另一个测试来检查用户名,我实际上没有得到用户名和密码是否应该包含在同一个测试中,长度在6到10之间

    /**
     *  Scenario: Login check with valid length username:
     * * Given I am on the login page
     * * When I enter valid username
     *   And I enter any password
     *   And I click on the "Login" button
     * * Then I get ???
     */
    @ParameterizedTest
    @ValueSource(strings = ["abcdef", "abcdefgh", "abcabcabcd"])
    fun `User name should have between 6 and 10 characters`(userName: String) {
    
        // Given
        val slot = slot<String>()
        every {
            loginRepository.login(
                capture(slot),
                any()
            )
        } returns (LoginState.CREDENTIALS_ERROR)
    
        // When
        val expected = loginUseCase.login(userName, "abcdefg")
    
        // Then
        verify(exactly = 1) { loginRepository.login(slot.captured, any()) }
    
        assertEquals(expected, LoginState.CREDENTIALS_ERROR)
        assertTrue(slot.captured.length in 6..10)
        confirmVerified(loginRepository)
    
    }
    
    /**
    *场景:使用有效长度用户名进行登录检查:
    **如果我在登录页面上
    **当我输入有效用户名时
    *我输入任何密码
    *我点击“登录”按钮
    **然后我得到了???
    */
    @参数化测试
    @ValueSource(字符串=[“abcdef”、“abcdefgh”、“ABCABCD”])
    fun`用户名应包含6到10个字符'(用户名:字符串){
    //给定
    val插槽=插槽()
    每一个{
    loginRepository.login(
    捕获(插槽),
    任何()
    )
    }返回(LoginState.CREDENTIALS\u错误)
    //什么时候
    val expected=loginUseCase.login(用户名“abcdefg”)
    //然后
    验证(正好=1){loginRepository.login(slot.captured,any())}
    assertEquals(应为LoginState.CREDENTIALS\u错误)
    assertTrue(插槽长度为6..10)
    确认已验证(登录回复)
    }
    
  • 此测试应返回什么状态以检查用户名是否有效?如果返回SUCCESS,例如,如果输入少于6个字符的无效密码,则实现可能会失败。如果我返回凭证\u错误,我将在BDD的then部分返回什么
  • 在这种情况下,用户名和密码应该包含在同一个测试中吗

  • 我想,你想做的是把两种不同的东西混合在一起,它们应该分开。您应该有一个用于编写单元测试(TDD)的项目(dll),用于验证类和方法。和另一个用于自动化场景(BDD)的项目(dll),用于验证应用程序的总体行为或多个服务之间的行为。@StefanZivkovic,我正在尝试了解TDD和BDD是如何相互关联的。不应该在单元测试中进行验证以确认调用了注入接口的方法吗?这里有一些文章可以帮助您更好地理解模拟。我知道你问过TDD和BDD之间的区别,但听起来这些文章仍然可以给你一些很好的见解。
    /**
     *  Scenario: Login check with valid length username:
     * * Given I am on the login page
     * * When I enter valid username
     *   And I enter any password
     *   And I click on the "Login" button
     * * Then I get ???
     */
    @ParameterizedTest
    @ValueSource(strings = ["abcdef", "abcdefgh", "abcabcabcd"])
    fun `User name should have between 6 and 10 characters`(userName: String) {
    
        // Given
        val slot = slot<String>()
        every {
            loginRepository.login(
                capture(slot),
                any()
            )
        } returns (LoginState.CREDENTIALS_ERROR)
    
        // When
        val expected = loginUseCase.login(userName, "abcdefg")
    
        // Then
        verify(exactly = 1) { loginRepository.login(slot.captured, any()) }
    
        assertEquals(expected, LoginState.CREDENTIALS_ERROR)
        assertTrue(slot.captured.length in 6..10)
        confirmVerified(loginRepository)
    
    }