일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- Effective Java
- bytecode
- Final
- try-with-reources
- Unchecked Exception
- 자바스터디
- 파라미터 그룹
- Checked Exception
- JVM
- 예외
- Spring
- java
- AWS
- springboot
- Annotation
- 피리티어
- spring-security
- 이펙티브자바
- ec2
- 자바
- 보안 그룹
- 바이트코드
- 생각정리
- RDS
- error
- https
- 이펙티브 자바
- exception
- Today
- Total
개발 일지
테스트 환경 통합하기 본문
통합테스트 코드를 작성할 때 각 테스트 클래스마다 `@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를 사용하고 각 클래스에서 이를 상속 받는 방법으로 테스트 환경을 통합을 시켰고 유의미한 시간 단축의 결과를 확인할 수 있었습니다.