Kotest 단서(Clues)

Kotest에슨 단서(Clues)를 사용하면, Assertion에 대해 상세한 설명 제공할 수 있다.

단서

경험상 실패한 테스트는 좋은 버그 보고서처럼 보여야 한다. 즉, 무엇이 잘못되었는지, 그리고 이상적으로는 왜 잘못되었는지를 알려주어야 한다.

때로는 실패한 단언문에 오류 메시지에 무엇이 잘못되었는지 알 수 있는 충분한 정보가 포함되어 있는 경우도 있다.

예를 들어:

username shouldBe "devkuma"

다음과 같은 오류가 발생할 수 있다:

expected:<"devkuma"> but was:<"devkuma@devkuma.com">

이것이 실패하면 간단히 얻을 수 있다:

<null> should not equal <null>

이는 그다지 도움이 되지 않는다. 바로 이 부분에서 withClue가 활용할 수 있다.

withClueasClue 헬퍼는 단언문에 추가 컨텍스트를 추가하여 실패를 스스로 설명할 수 있도록 한다:

예를 들어, 문자열 메시지와 함께 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
}

이 메시지는 테스트가 실패한 경우에만 생성이 되므로, 비용이 많이 드는 작업과 함께 사용해도 안전하다.

도메인 객체를 단서로 사용할 수도 있다:

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

중첩된 단서

단서는 중첩될 수 있으며, 실패한 단언문 메시지에서 모두 볼 수 있다:

{ "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