미루고 미루던 테스트코드 작성
막상 시작하려니 막막해서 정리를 해 보려고 한다.
Intellij에서 테스트 클래스 생성은 아래와 같이 생성한다.
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 |
---|