개요
테스트 코드를 실행하면 Spring boot 서버가 여러 번 다시 띄어지게 된다.
이에 Test 실행 시간이 길어져 서버를 통합하여 Spring boot가 실행되는 수를 줄이고자 한다.
방법
기존에는 대략 6번 정도의 서버가 실행되었다.
이는 각 Test가 다른 SpringBootTest가 되어있기 때문이었다. (환경이 조금이라도 달라지면 새로 띄운다 ex) MockBean이 있으면 다른 환경이라고 생각)
이를 공통 클래스로 빼어서 상속받는 구조로 바꾸어 서버 실행 수를 줄이고자 한다.
기존
각 Test마다 아래와 같이 되어있다.
@ActiveProfiles("test")
@SpringBootTest
class OrderServiceTest {
Test 하위에 IntegrationTestSupport를 두고 이 클래스를 상속을 받는 Test클래스를 작성할 것이다.
@ActiveProfiles("test")
@SpringBootTest
public abstract class IntegrationTestSupport {
@MockBean
protected MailSendClient mailSendClient;
//protected로 해주어야 상속받았을 때 사용가능하다.
}
만약 다른 서비스에서 MailSendClient를 MockBean으로 사용하기 원하지 않으면 다른 클래스로 분리해서 상속하면 된다.
@DataJpaTest vs @SpringBootTest
DataJpaTest 어노테이션을 사용하면 JPA관련 빈들만 띄워주므로 SpringBootTest보다 가볍게 사용할 수 있다는 장점이 있고
@Transaction이 자동으로 사용되는 이점이 있다.
하지만 통합을 하기 위해서 SpringBootTest를 사용해서 위의 IntergrationTestSupport를 상속받아서 사용하는 것이 장점이 있다고 판단이 되었다.
이때 주의점은 SpringBootTest는 @Transaction이 없으므로 트랜젝션 어노테이션을 추가해주어야 한다.
그래야 테스트 수행 후 롤백에 진행되어 테스트 간 서로 의존하지 않게 된다. (데이터 클렌징 필요하기 때문에)
@WebMcvTest
WebMcvTest이란 : Spring Boot에서 웹 레이어 테스트를 쉽게 작성할 수 있도록 제공되는 어노테이션이다. 이 어노테이션은 전체 애플리케이션 컨텍스트를 로드하지 않고, 웹 관련 컴포넌트만 로드하여 테스트 속도를 높여준다.
WebMcvTest는 SpringBootTest와 통합하기 어려우므로 추가적인 클래스를 만들어야 한다.
이를 위해 ControllerTestSupport클래스를 아래와 같이 만들어 준다.
@WebMvcTest(controllers = {
OrderController.class,
ProductController.class
})
public abstract class ControllerTestSupport {
@Autowired
protected MockMvc mockMvc;
@Autowired
protected ObjectMapper objectMapper;
@MockBean
protected OrderService orderService;
@MockBean
protected ProductService productService;
}
결론
Test에서 6번에서 2번으로 Spring Boot가 띄어지는 것을 줄일 수 있었다.
'TestCode' 카테고리의 다른 글
테스트에서만 필요한 메서드가 생겼을 때는? (0) | 2024.07.18 |
---|---|
private 메서드 테스트 (0) | 2024.07.18 |
테스트 팁 (0) | 2024.07.17 |
classicist vs mockist (0) | 2024.07.17 |
Mockito.verify (0) | 2024.07.16 |