SpringBoot 유닛테스트 - 1

박찬규·2023년 7월 3일

GoodJobProject

목록 보기
1/9

이번에 프로젝트를 진행하면서 구현한 기능이 잘 돌아가는지 유닛테스트를 실시할 필요성을 느꼈다. 평소에 겉핥기만 하던 테스트 방식은
src/test/... 경로에서 @SpringBootTest를 사용하던 통합테스트 방식이었는데, 난 이게 통합테스트인줄도 모르고 사용하고 있었다.

통합테스트와 유닛테스트의 차이

통합테스트

통합테스트는 간단히 말해 모든 빈을 로딩하여 테스트를 실행하는 방식이다. 때문에 운영환경과 같은 의존성을 갖춰 놔야 원활한 테스트가 가능하다.

@SpringBootTest를 사용하면 @SpringBootApplication을 찾아서 어플리케이션이 실행되며 모든 Bean을 로딩한 후, Test용 Application Context를 만들어 Bean을 추가하고, MockBean을 찾아 교체하는 식으로 작동한다.

유닛테스트

유닛테스트는 하나의 기능 또는 메소드에 대한 테스트로 볼 수 있다. 하나의 기능이 올바르게 동작하는지 독립적으로 테스트하는 것이다.
그러나 어플리케이션은 다른 객체와 연관되어 메시지를 주고 받기 때문에 독립적인 테스트를 위해선 실제 작동하는 객체 대신 가짜 객체(Mock Object)가 필요하다. 의존성이 있는 객체의 동작 결과를 미리 설정해놓고 테스트하면 해당 기능에 대한 독립적인 테스트가 가능하다.
이렇게 가짜 객체를 주입하여 미리 정해진 결과를 반환하는 것을 stub 이라고 한다.

@ExtendWith와 @WebMvcTest

이번 프로젝트에서는 통합테스트 대신 유닛테스트로 기능을 테스트해보고자 한다. Junit을 이용하여 진행할 것이다.
유닛테스트를 진행할 때는 @ExtendWith, @WebMvcTest(className.class)를 사용하는데,
@ExtendWith 어노테이션은 메인으로 실행될 class를 지정할 수 있고,
@WebMvcTest 어노테이션은 () 안에 작성된 클래스만 로드해서 테스트를 진행한다. 이때 매개변수를 지정해주지 않으면 @Controller, @RestController, @RestControllerAdvice 등 Controller와 연관된 Bean이 모두 로드된다. 즉 스프링의 모든 Bean을 로딩하는 @SpringBootTest와 달리, 특정 Controller 관련 코드만 테스트할 때 사용하는 것이 @WebMvcTest 다.
나는 @WebMvcTest는 사용하지 않고 @ExtnedWith와 @Mock을 이용해 테스트를 구현하고자 한다.

참고:
https://mangkyu.tistory.com/143
https://ws-pace.tistory.com/92
https://thalals.tistory.com/273

0개의 댓글