Spring MVC - Testing(2)
Hamcrest
JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다.
- Assertion을 위한 Matcher가 이해하기 쉬운 문장이므로, 가독성이 좋다.
- 다양한 Matcher를 제공한다.
- 테스트 실패 메시지를 이해하기 쉽다.
JUnit의 Assertion 메서드를 사용한 클래스를 Hamcrest의 Matcher를 이용한 클래스로 변환
Hamcrest의 Matcher를 이용한 코드 줄을 보면, 'assert that actual is equal to expected'라고 이어 읽을 수 있다.
'결과 값이 기대 값과 같다는 것을 검증한다'라고 해석할 수 있고, 이것이 가독성이 좋다는 것이다.
(Custom Matcher를 직접 구현해서 사용할 수도 있다)
Ref)
- Hamcrest에서 지원하는 다양한 Matcher
http://hamcrest.org/JavaHamcrest/javadoc/2.2/
http://hamcrest.org/JavaHamcrest/tutorial - Hamcrest에서 Custom Mathcer를 구현하는 방법
http://hamcrest.org/JavaHamcrest/tutorial
슬라이스 테스트(Slice Test)
각 계층에 구현해놓은 기능들이 잘 작동하는지 특정 계층만 잘라서 테스트하는 것을 말한다.
API 계층 테스트
테스트의 대상은 대부분 클라이언트의 요청을 받아들이는 핸들러인 Controller이다.
테스트를 위한 클래스 구조는 다음과 같다.
- @SpringBootTest 애너테이션이 Spring Boot 기반의 애플리케이션을 테스트하기 위한 Application Context를 생성해준다.
- @AutoConfigureMockMvc 애너테이션은 Controller 테스트를 위한 애플리케이션의 자동 구성 작업을 해준다.
- MockMvc는 Tomcat 같은 서버를 실행하지 않고, Spring 기반 애플리케이션의 Controller를 테스트할 수 있는 완벽한 환경을 제공해주는 일종의 Spring MVC 테스트 프레임워크이다.
Ref)
- 스모크 테스트(Smoke Test)에 대해
https://en.wikipedia.org/wiki/Smoke_testing_(software) - MockMvc의 기능에 대해
https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#spring-mvc-test-framework - MockMvc에서 지원하는 post()와 같이 request를 수행하는 메서드에 대해
https://docs.spring.io/spring-framework/docs/5.3.21/reference/html/testing.html#spring-mvc-test-server-performing-requests - MockMvcResultMatchers와 jsonPath()에 대해
https://www.baeldung.com/guide-to-jayway-jsonpath
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/MockMvcResultMatchers.html#jsonPath-java.lang.String-java.lang.Object
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/JsonPathResultMatchers.html
https://github.com/json-path/JsonPath
데이터 액세스 계층 테스트
이 계층의 테스트 같은 경우는, 테스트 종료 직전에 DB의 상태를 테스트 이전의 상태로 되돌려서 깨끗하게 만들 수 있도록 구현하는 것이 좋다.
Spring에서 데이터 액세스 계층을 테스트하기 위한 가장 핵심적인 방법은 @DataJpaTest 애너테이션을 적용하는 것이다.
이 애너테이션은 Repository의 기능을 정상적으로 사용하기 위한 Configuration을 Spring이 자동으로 해준다.
또, @Transaction 애너테이션을 포함하고 있기 때문에, 하나의 테스트 케이스 실행이 종료되는 시점에 데이터베이스에 저장된 데이터는 rollback 처리된다.
(Spring JDBC에서는 @JdbcTest, Spring Data JDBC에서는 @DataJdbcTest 사용)
Ref)