Spring TestContext 프레임워크는 단일 JVM 내에서 테스트를 병렬로 실행하기 위한 기본적인 지원을 제공한다.
테스트 스위트에 동시성을 도입하면 예기치 않은 부작용, 이상한 런타임 동작, 간헐적으로 또는 무작위로 실패하는 테스트가 발생할 수 있다. 따라서 Spring 팀은 테스트를 병렬로 실행하지 않는 경우에 대한 다음과 같은 일반적인 지침을 제공한다.
병렬로 테스트하는 것을 권장하지 않는 경우
테스트가 다음과 같은 경우 테스트를 병렬로 실행하지 말자.
- Spring 프레임워크의
@DirtiesContext
를 사용하는 경우 - Spring Framework의
@MockitoBean
또는@MockitoSpyBean
을 사용하는 경우 - Spring Boot의
@MockBean
또는@SpyBean
을 사용하는 경우 - 테스트 메서드가 특정 순서로 실행되도록 설계된 테스트 프레임워크 기능 또는 JUnit 4의
@FixMethodOrder
을 사용하는 경우
병렬 실행 시 여러 개의 테스트가 같은 ApplicationContext를 공유할 수 있다. 하지만 1~3번의 경우 기존의 Context가 ContextCache에서 제거되고 새로운 Context를 생성하기 때문에 병렬로 실행하는 것을 권장하지 않는 것 같다.
테스트가 병렬로 실행되면 하나의 클래스에서 테스트를 실행하는 도중에 다른 테스트가 실행될 수 있다는 말이다. 4번에서와 같이 하나의 클래스에서 테스트가 특정 순서대로 실행하도록 설정하였다면 그 순서는 유지될 수 있다. 하지만 A의 'test1 실행 -> B의 test1 실행 -> A의 test2 실행'과 같이 실행될 수도 있다. 순차적으로 테스트를 실행하는 경우에는 'A의 test1 실행 -> A의 test2 실행'이 보장되는지만 그 사이 'B의 test1 실행'이 추가된다면 기존의 테스트가 실패할 수 있다. 아마 4번의 경우 이러한 이유로 병렬로 실행하지 않는 것을 권장하는 것 같다.
TIP
병렬 테스트 실행이 실패하면서 현재 테스트의 ApplicationContext
가 더 이상 활성화되지 않았다는 예외가 발생하면 일반적으로 다른 스레드의 ContextCache
에서 ApplicationContext
가 제거되었음을 의미한다.
이는 @DirtiesContext
를 사용하거나 ContextCache
에서 자동으로 제거되었기 때문일 수 있다. DirtiesContext
가 원인인 경우 @DirtiesContext
를 사용하지 않는 방법을 찾거나 해당 테스트를 병렬 실행에서 제외해야 한다. 컨텍스트 캐시의 최대 크기를 초과한 경우 캐시의 최대 크기를 늘릴 수 있다.
WARNING
Spring TestContext 프레임워크에서 병렬 테스트 실행은 TestContext
에 대한 자바독에 설명된 대로 기본 TestContext
구현이 복사 생성자를 제공하는 경우에만 가능하다. Spring에서 사용되는 DefaultTestContext
는 이러한 생성자를 제공한다. 그러나 사용자 지정 TestContext
구현을 제공하는 타사 라이브러리를 사용하는 경우 병렬 테스트 실행에 적합한지 확인해야 한다.
병렬 실행에서 제외하는 방법
JUnit 5
JUnit 5에서는 @Execution(ExecutionMode.SAME_THREAD)
을 사용하면 해당 클래스만 병렬 실행을 방지하고 순차적으로 실행된다.
'스프링' 카테고리의 다른 글
내가 이해한 스프링의 빈 생명 주기 (0) | 2025.03.17 |
---|---|
트랜잭션 커밋과 AOP 중 어떤 것이 먼저 실행 될까? (0) | 2025.03.15 |
Spring Modulith Scenario (0) | 2025.03.10 |
@EnableJpaRepositories (0) | 2025.03.03 |
BeanPostProcessor (1) | 2025.01.16 |