Kotest 단서(Clues)
Kotest에슨 단서(Clues)를 사용하면, Assertion에 대해 상세한 설명 제공할 수 있다.
단서
NOTE
단서(clues)는 Kotest 단언문 라이브러리를 사용하는 경우에만 작동한다.경험상 실패한 테스트는 좋은 버그 보고서처럼 보여야 한다. 즉, 무엇이 잘못되었는지, 그리고 이상적으로는 왜 잘못되었는지를 알려주어야 한다.
때로는 실패한 단언문에 오류 메시지에 무엇이 잘못되었는지 알 수 있는 충분한 정보가 포함되어 있는 경우도 있다.
예를 들어:
username shouldBe "devkuma"
다음과 같은 오류가 발생할 수 있다:
expected:<"devkuma"> but was:<"devkuma@devkuma.com">
이것이 실패하면 간단히 얻을 수 있다:
<null> should not equal <null>
이는 그다지 도움이 되지 않는다. 바로 이 부분에서 withClue
가 활용할 수 있다.
withClue
및 asClue
헬퍼는 단언문에 추가 컨텍스트를 추가하여 실패를 스스로 설명할 수 있도록 한다:
예를 들어, 문자열 메시지와 함께 withClue
를 사용할 수 있다.
withClue("Name should be present") {
user.name shouldNotBe null
}
이와 같은 오류가 발생한다:
Name should be present
<null> should not equal <null>
오류 메시지가 많이 개선되었지만 여전히 완벽하지는 않다. 예를 들어, 데이터베이스를 확인하려면 사용자의 아이디를 알고 있으면 도움이 될 수 있다.
asClue
를 사용하여 오류 메시지에 사용자 ID를 추가할 수 있다:
withClue({ "Name should be present (user_id=${user.id})" }) {
user.name shouldNotBe null
}
또한 asClue
확장 함수를 사용하여 모든 객체를 단서 메시지로 변환할 수도 있다.
{ "Name should be present (user_id=${user.id})" }.asClue {
user.name shouldNotBe null
}
이 메시지는 테스트가 실패한 경우에만 생성이 되므로, 비용이 많이 드는 작업과 함께 사용해도 안전하다.
TIP
테스트 실패에는 실패한 단언문, 테스트 이름, 단서 및 스택 추적이 포함된다. 실패한 항목과 실패한 이유를 모두 알 수 있도록 이러한 방식으로 사용하는 것을 권장한다. 이렇게 하면 특히 테스트 작성자의 의도를 리버스 엔지니어링할 때 테스트를 유지 관리하기가 더 쉬워진다.TIP
단언문 위에 코드 주석이 표시될 때마다asClue
또는 withClue
를 대신 사용하는 것을 권장한다. 테스트 실패, 특히 CI에서는 단서가 표시되지만 테스트 실패에서는 주석이 표시되지 않는다.
도메인 객체를 단서로 사용할 수도 있다:
data class HttpResponse(val status: Int, val body: String)
val response = HttpResponse(404, "the content")
response.asClue {
it.status shouldBe 200
it.body shouldBe "the content"
}
다음과 같이 출력된다:
HttpResponse(status=404, body=the content)
Expected :200
Actual :404
NOTE
Kotest는 모든() -> Any?
와 같은 단서는 지연 단서로 간주하여 이를 계산하고 함수 자체에서 .toString()
을 호출하는 대신 결과 값에 .toString()
을 사용한다. 대부분의 경우 필요한 작업을 정확히 수행하지만, 단서 객체가 () -> Any?
를 구현하고 clue.toString()
을 사용하려는 경우 단서를 { clue.toString() }.asClue {... }
로 수동으로 래핑하는 것을 권장한다.
중첩된 단서
단서는 중첩될 수 있으며, 실패한 단언문 메시지에서 모두 볼 수 있다:
{ "Verifying user_id=${user.name}" }.asClue {
"email_confirmed should be false since we've just created the user".asClue {
user.emailConfirmed shouldBe false
}
"login".asClue {
user.login shouldBe "sksamuel"
}
}
실패는 다음과 같이 나타날 수 있다.
Verifying user_id=42
email_confirmed should be false since we've just created the user
<true> should equal <false>
실패는 다음과 같이 나타날 수 있다.
참조
최종 수정 : 2024-04-21