개발/Kotlin

[Kotlin] Kotest 정리

YJ_Lee 2023. 3. 19. 20:08

미루고 미루던 테스트코드 작성

막상 시작하려니 막막해서 정리를 해 보려고 한다.

Intellij에서 테스트 클래스 생성은 아래와 같이 생성한다.

테스트를 만들 클래스명에 우클릭, Go To -> Test
테스트를 생성할 메서드와 Test style 선택

class AccountControllerTest : ShouldSpec({

    should("verify") { }

    should("test") { }
})

생성되면 이런 모습이다.

물론 수동으로 생성해도 된다. 테스트 코드 작성에 다른 클래스가 필요한 것은 아니며, 독립적으로 실행 가능하다.

 

[Test styles]

Kotest 에는 10가지의 테스트 작성 스타일이 존재하며 이는 코드 작성 스타일을 지정하는 것 뿐

기능상의 차이점은 없다.

사용하고 싶은 스타일을 테스트 클래스에서 상속받고, 

부모 클래스의 생성자로 작성한 테스트코드를 넘겨주면 된다.

 

https://kotest.io/docs/framework/testing-styles.html

나는 이 중 Kotest 오리지날 스타일인 ShouldSpec 을 사용하기로 했다.

이유는 그냥 보기 깔끔해보여서

 

class MyTest: ShouldSpec({
    val n = 3

    should("n은 3 이어야 한다") {
        n shouldBe 3
    }

    context("n에 1을 더하면") {
        should("4가 되어야 한다") {
            n + 1 shouldBe 4
        }
    }
})

 

 

[Matchers]

특정 상수, 변수, 함수의 리턴값 등의 예상값을 작성하여 테스트 할 수 있다.

should("n은 3 이어야 한다") {
    n shouldBe 3
    n.shouldBe(3).shouldBeIn(1..3)
}

n shouldBe 3 이나 n.shouldBe(3) 과 같은 방식으로 사용하며, 체이닝 방식으로 연결하여 사용할 수 있다. (리턴 타입이 Unit이어서 체이닝이 불가능한 메서드도 있다.)

한 테스트 내의 모든 Matcher가 적중해야 테스트를 통과하며, 하나라도 실패하면 테스트는 실패한다.

 

val n = 3
val s = "string"
val list = listOf(1, 2, 3, 4, 5)

should("n은 3 이어야 한다") {
    n shouldBe 3
}

should("s의 길이는 6 이어야 하며, 소문자로 이루어져 있어야 한다") {
    s.shouldHaveLength(6)
        .shouldBeLowerCase()
}

should("list 내의 정수들 중, 3 이상인 수가 3개 이상 있어야 한다") {
    list.forExactly(3) {
        it shouldBeGreaterThanOrEqual 3
    }
}

위의 예 외에도 아주 많은 Matcher들이 존재하므로 테스트에 필요한 것을 가져다 쓰면 된다.

https://kotest.io/docs/assertions/matchers.html

 

should("범위 밖의 수를 주면 IllegalArgumentException을 던진다") {
    shouldThrow<IllegalArgumentException> {
        test(4)
    }
}

private fun test(n: Int) =
    if (n in 1..3) n
    else throw IllegalArgumentException()

shouldThrow 블럭 내에서 발생한 예외를 테스트할 수 있다

 

shouldThrowExactly<FileNotFoundException> {
  // test here
}

상위 예외와 관계없이 정확히 특정 예외만 잡고싶으면 이렇게 작성한다.

 

shouldThrowAny {
  // test here can throw any type of Throwable!
}

아무 예외나 잡고싶으면 이렇게 작성한다.

 

 

[Lifecycle hooks]

 

'개발 > Kotlin' 카테고리의 다른 글

[Kotlin] Immutable Collections, Mutable Collections  (0) 2022.11.01