TestCode

테스트 Spring boot 띄어지는 수 줄이기

salmon16 2024. 7. 18. 01:32

개요

테스트 코드를 실행하면 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