Я пытаюсь получить разницу между 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)
}
- Когда мы используем команду «Проверить», считается ли этот тест тестом, основанным на поведении, если я использовал только «Утверждение», считается ли он 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)
}
- Какое состояние должно быть возвращено из этого теста, чтобы проверить правильность имени пользователя? Если я верну SUCCESS, моя реализация может завершиться неудачей, если я введу неверный пароль, например, с менее чем 6 символами. Если я верну CREDENTIALS_ERROR, что я буду возвращать, тогда раздел BDD?
- В таком случае должны ли имя пользователя и пароль включаться в один и тот же тест?