개발 일지

테스트 환경 통합하기 본문

카테고리 없음

테스트 환경 통합하기

junjun_ 2024. 5. 3. 16:53

통합테스트 코드를 작성할 때 각 테스트 클래스마다 `@SpringBootTest` 어노테이션을 사용했습니다.

그러나 각 테스트 클래스마다 `@SpringBootTest`를 사용하면 각 클래스마다 독립적인 Spring Boot 애플리케이션 컨텍스트가 생성됩니다. 이는 테스트마다 서버를 다시 시작하고 컨텍스트를 로딩해야 하는데, 이 과정은 상당한 시간이 소요됩니다. 시간은 비용입니다. 간단한 토이 프로젝트에서도 테스트를 실행하면 Spring Boot 서버가 7번 재시작됩니다. 대규모 프로젝트에서는 더 많이 발생할 수 있습니다. 이를 해결하기 위해서는 테스트 환경을 통합하여 Spring 서버가 최소한으로 재시작되도록 해야 합니다.

 

 


적용하기

@SpringBootTest 어노테이션을 붙인 abstract 클래스를 작성하고 다른 클래스에서 이를 상속받는 구조로 구현하겠습니다.

 

IntegrationTestSupport.java

@ActiveProfiles("test")
@SpringBootTest
public abstract class IntegrationTestSupport {

    @MockBean
    protected MailSendClient mailSendClient;
}

 

 

컨트롤러 테스트의 경우 mocking 사용해서 @SpringBootTest 가 아닌 @WebMvcTest 어노테이션을 사용했기 때문에 @WebMvcTest을 붙인  컨트롤러용 abstract를 따로 만들어주겠습니다

 

ControllerTestSupport.java

@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;
}

 

결과 확인하기

통합테스트를 돌리면 

 

before

  • Springboot 서버가 7번 띄워졌고 4.519초

 

after

  • Springboot 서버가 2번 띄워졌고 3.162초

 

정리

각각의 테스트 클래스에  @SpringBootTest 를 사용하면 테스트마다 독립적인 Spring Boot 애플리케이션 컨텍스트가 생성됩니다. 이는 테스트하는 데 걸리는 시간을 증가시키고 시간은 비용이기 때문에 결과적으로 비용을 증가시킵니다. 이를 막기 위하여 추상클래스의 @SpringBootTest를 사용하고 각 클래스에서 이를 상속 받는 방법으로 테스트 환경을 통합을 시켰고 유의미한 시간 단축의 결과를 확인할 수 있었습니다.