Spring & SpringBoot/Testing

JUnit Assertion 대신 Hamcrest를 이용하여 테스트 코드 작성하기

Hyeonni 2022. 11. 9. 18:42

 

Hamcrest

Hamcrest는 JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다.

  • Assertion을 위한 Matcher가 자연스러운 문장으로 이어지므로 가독성이 향상된다.
  • 테스트 실패 메시지를 이해하기 쉽다.
  • 다양한 Matcher를 제공한다.

이러한 이유로 JUnit에서 지원하는 Assertion 메서드보다 많이 사용된다.

 

 

Hamcrest의 Matcher 이용하기

assertionTest1()은 JUnit의 Assertion을 이용하여 작성한 테스트 코드이다. assertionTest2()는 Hamcrest의 Matchers를 이용하여 작성한 테스트 코드이다. 두 코드 모두 같은 테스트를 하고 있는 테스트이다. 하지만 Assertion을 사용하는 부분에서 차이가 있다.

JUnit의 Assertion을 사용해도 코드만 보고 무슨 테스트를 하고 싶은지 알 수 있을 것이다.

하지만 Hamcrest의 Matchers를 사용한 것은 코드를 그대로 해석하면 해당 테스트 코드가 무엇을 하고 싶은지 보다 더 쉽게 알 수 있다. 'Assert that actual is equal to expected'는 '결과 값(actual)이 기대 값(expected)과 같다는 것을 검증(assertion)한다'라고 해석할 수 있어 해당 코드를 단순히 해석하는 것만으로도 원하는 테스트가 무엇인지를 바로 알 수 있다.

 

  • assertThat(결과 값, 기대 값) 

 

 

두 테스트에 대해서 failed이 되는 경우의 메시지를 확인해 보면 아래와 같다.

  • JUnit의 Assertion 메서드를 사용한 경우

 

  • Hamcrest의 Matchers를 사용한 경우

두 에러 메시지를 확인해 보면 Hamcrest의 경우, 에러 메시지가 하나의 문장으로 연결되어 하나의 문장으로 가독성이 좋은 메시지를 띄워준다는 것을 알 수 있다. 

 

 

(1)은 JUnit의 Assertion을 이용한 것이고, (2), (3)은 Hamcrest를 이용한 것이다. Hamcrest가 테스트 내용을 좀 더 명확하게 나타내고 있는 것을 볼 수 있다.

 

 

Hamcrest를 알기 전에는 JUnit도 상당히 이해하기 쉽게 테스트 케이스를 작성할 수 있게 해준다고 생각했다. 근데 Hamcrest를 접하고 이게 가독성을 높이는 거구나 싶었다. 직관적인 함수명들을 통해 개발을 함에 있어서 변수명과 함수명을 짓는 것의 중요성을 여기서 더 깨달은 것 같다!

 


Hamcrest API 문서

Hamcrest 튜토리얼&custom matchers