본문 바로가기
[Android]/[Kotlin]

Kotest - 코틀린 기반의 테스트 코드 작성하기

by Hevton 2023. 11. 2.
반응형

코틀린은 많은 테스트 라이브러리 중 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

 

 

 

반응형

'[Android] > [Kotlin]' 카테고리의 다른 글

[발표] 고차함수 정리  (0) 2024.03.14
Google In app billing 6 - All products should be of the same product type.  (1) 2023.10.24
코루틴 예외처리 주의  (0) 2023.07.01
Kotlin combine  (0) 2023.05.07
[Kotlin / 코틀린] Setter  (0) 2023.03.29