TDD и BDD с макетом для Android - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь получить разницу между TDD и BDD при разработке Android приложений с чистой архитектурой с использованием UseCase и репозиториями.

Я написал простой тест с проверкой входа и использованием JUnit5 и Mockk. Я создал состояния входа в систему

enum class LoginState {
    SUCCESS,
    EMPTY_FIELD_ERROR,
    CREDENTIALS_ERROR
}

и имеет конкретный класс UseCase, который имеет интерфейс для имитации локальных или удаленных репозиториев.

private val loginRepository: LoginRepository = mockk ()

private lateinit var loginUseCase: LoginUseCase

@BeforeEach
fun setUp() {
    clearMocks(loginRepository)
    loginUseCase = LoginUseCase(loginRepository)
}

И тест

/**
 *  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)

}
  1. Когда мы используем команду «Проверить», считается ли этот тест тестом, основанным на поведении, если я использовал только «Утверждение», считается ли он 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)

}
  1. Какое состояние должно быть возвращено из этого теста, чтобы проверить правильность имени пользователя? Если я верну SUCCESS, моя реализация может завершиться неудачей, если я введу неверный пароль, например, с менее чем 6 символами. Если я верну CREDENTIALS_ERROR, что я буду возвращать, тогда раздел BDD?
  2. В таком случае должны ли имя пользователя и пароль включаться в один и тот же тест?
...