Unit Testing 깔끔하게 작성하기
Unit Testing을 깔끔하게 작성하기 위해서는 Unit Test의 이름, 테스트 내부의 작성 순서가 중요하다.
이름 작성 방법
가독성을 좋게 만들려면 [메서드명][결과][환경 설명] 순서로 작성한다.
예를 들어 LoginRepository에서 Login이 Success했을 때, LoginUseCase의 login이 Success 해야 한다면 [login][Success][WhenLoginRepositoryLoginSuccess]와 같이 같이 테스트 이름이 작성될 수 있다.
@Test
fun loginSuccessWhenLoginRepositoryLoginSuccess() {
val repositorySuccessResult = LoginRepositoryResult.Success("test_token")
Mockito.`when`(loginRepository.login(userName = "success", password = "success"))
.thenReturn(repositorySuccessResult)
val result = loginUseCase.logIn(userName = "success", password = "success")
Assert.assertEquals(LoginUseCaseResult.Success("test_token"), result)
}
예를 들어 LoginRepository에서 Login이 IllegalStateException을 생성했을 때, LoginUseCase의 login에서 애러가 발생 해야 한다면 [login][ThrowError][WhenLoginRepositoryLoginThrowError]와 같이 같이 테스트 이름이 작성될 수 있다.
@Test
fun loginThrowErrorWhenLoginRepositoryLoginThrowError() {
Mockito.`when`(loginRepository.login("error", "error"))
.doThrow(IllegalStateException())
Assert.assertThrows(IllegalStateException::class.java) { loginUseCase.logIn("error", "error") };
}
테스트 내부 작성 순서
환경 설정, 실행, 확인 순서로 작성한다. 이 순서가 가장 이해하기 편했다. 만약 중간에 환경 설정이 한 번 더 들어가야 한다고 생각되면 코드를 나누는 것이 좋다.
@Test
fun loginSuccessWhenLoginRepositoryLoginSuccess() {
// 환경 설정
val repositorySuccessResult = LoginRepositoryResult.Success("test_token")
Mockito.`when`(loginRepository.login(userName = "success", password = "success"))
.thenReturn(repositorySuccessResult)
// 실행
val result = loginUseCase.logIn(userName = "success", password = "success")
// 확인
Assert.assertEquals(LoginUseCaseResult.Success("test_token"), result)
}
가끔 실행과 확인이 겹쳐야 하는 경우도 있다.
@Test
fun loginThrowErrorWhenLoginRepositoryLoginThrowError() {
// 환경설정
Mockito.`when`(loginRepository.login("error", "error"))
.doThrow(IllegalStateException())
// 실행 + 확인
Assert.assertThrows(IllegalStateException::class.java) { loginUseCase.logIn("error", "error") };
}
이 방법이 가장 좋은 방법일까?
여기서의 이름 작성 방법과 코드 순서 작성 방법은 하나의 좋은 방법일 뿐이다. 더 나은 방법이 있을 수 있다.
실무에서 가장 중요한 것은 팀의 컨벤션이다. 팀의 코드 컨벤션을 설정하고 그에 맞추어 작성해야 가독성이 좋아진다. 항상 명심하자. 코드에서는 일관성이 가독성에 중요하기 때문에 코드 컨벤션을 잘 만들고 계속해서 개선해나가는 것이 중요하다. 만약 팀에 좋은 컨벤션이 없다면 위의 방법을 제안해도 괜찮고 다른 팀원들과 의견이 모아지면 사용하도록 하자.
'Unit Testing' 카테고리의 다른 글
[Unit Testing] 어떤 클래스에 테스트가 필요할까? data class 도 테스트가 필요한가? (0) | 2022.12.28 |
---|---|
[Unit Testing] Android의 정적 메서드를 사용하거나 Android 전용 클래스를 사용하면 테스트에 실패하는 이유 알아보기 (0) | 2022.12.26 |
[Unit Testing] Android Context 객체를 사용하는 클래스 테스트하기 (0) | 2022.12.25 |
코드 작성 시 정적 변수와 정적 메서드 사용을 지양해야 하는 이유 알아보기 (0) | 2022.12.24 |
MockitoJUnitRunner 사용해 Mockito 코드 깔끔하게 만들기 : @Mock (0) | 2022.12.23 |