[Android]/[Kotlin]
Kotest - 코틀린 기반의 테스트 코드 작성하기
Hevton
2023. 11. 2. 19:45
반응형
코틀린은 많은 테스트 라이브러리 중 Kotest가 가장 많이 쓰입니다.
JAVA 방식이 아닌, Kotlin 방식의 단위 테스트
@Test
fun `회원의 비밀번호와 다를 경우 예외가 발생한다`() {
val user = createUsesr()
assertThrows<UnidentifiedUserException> {
user.authenticate(WRONG_PASSWORD)
}
}
- 역따옴표로 묶인 함수 이름은 한글과 공백으로 표현할 수 있다.
- 예외 관련 테스트는 JUnit 5의 assertThrows 및 assertDoesNotThrow와 같은 Kotlin 함수를 사용하면 더 간결하다.
테스트 팩토리, Given 조건을 손쉽게 재사용하기
createMission(submittable = true) // 과제 제출 가능한 경우
craeteMission(submittable = false) // 과제 제출 불가능한 경우
createMission(title = "과제1", evaluationId = 1L) // 특정 과제
// 기본값을 잘 정해놓는게 중요
fun createMission(
title: String = MISSION_TITLE,
description: String = MISSION_DESCRIPTION,
evaluationId: Long = 1L,
startDateTime: LocalDateTime = START_DATE_TIME,
endDateTime: LocalDateTime = END_DATE_TIME,
submittable: Boolean = true,
hidden: Boolean = false,
id: Long = 0L
): Mission {
return Mission(title, description, evaluationId, startDateTime, endDateTime, submittable, hidden, id)
}
JAVA 방식의 어설션이 아닌, Kotest 이용 방식
Kotest 어설션은 간결하고, 기존 Junit 5와 혼용할 수 있습니다.
기존 Java 방식에서는 이렇게 작성했다면
val expected = Speaker("Jason", "Mraz", 45)
val actual = Speaker("Jason", "Park", 29)
assertThat(actual).isEqualTo(expected)
Kotest를 이용하면 다음과 같이 작성할 수 있습니다
val expected = Speaker("Jason", "Mraz", 45)
val actual = Speaker("Jason", "Park", 29)
actual shouldBe expected
또한 다음과 같은 활용도 있습니다
val actual = userRepository.findByEmail("jason@woowahan.com")
actual.shouldNotBeNull()
actual.name shouldBe "박재성"
// JUnit 5
class AuthenticationCodeTest {
@Test
fun `인증 코드를 생성한다`() {
val authenticationCode = AuthenticationCode(EMAIL)
assertAll(
{ assertThat(authenticationCode.code).isNotNull() },
{ assertThat(authenticationCode.authenticated).isFalse() },
{ assertThat(authenticationCode.createdDateTime).isNotNull },
)
}
}
// Kotest
class AuthenticationCodeTest: StringSpec ({
"인증 코드를 생성한다" {
val authenticationCode = AuthenticationCode(EMAIL)
assertSoftly(authenticationCode) {
code.shouldNotBeNull()
authenticated.shouldBeFalse()
createdDateTime.shouldNotBeNull()
}
}
})
StringSpec을 사용하면 어노테이션 작성 없이도 가능하다.
https://youtu.be/PqA6zbhBVZc?si=PuTU1VEhN0GOYh24
반응형