티스토리 뷰

https://www.ankushchoubey.com/spring-boot-junit-faster/

 

Use Right Test Slice (Saved 25% running time)

여러 runner가 Spring Boot와 함께 제공됩니다.

SpringBootTest가 가장 일반적입니다. 주로 @DirtiesContent와 함께 사용되는데, 기본적으로 모든 테스트 클래스 후에 Springboot을 다시 시작하므로 이상적이지 않습니다.

스프링부트테스트는 통합 테스트에 사용됩니다. 모든 테스트가 이를 사용하는 것은 바람직하지 않습니다.
가능한 한 최소한의 스프링 부팅 인프라를 로드하면서도 정확한 테스트를 보장하고자 합니다.

몇 가지 도움이 될 수 있습니다:

  1. 테스트가 DB와 관련된 경우. 데이터몽고테스트 또는 @Import 어노테이션이 있는 동등한 JPA runner를 사용합니다.
  2. 테스트가 웹/컨트롤러와 관련된 경우. WebFluxTest 또는 이와 동등한 Spring MVC 런너를 사용합니다. 임베디드 MongoDB를 함께 사용하려면 @AutoConfigureDataMongo를 사용하세요. 대부분의 다른 시스템에도 @AutoConfigure{systemName}으로 시작하는 어노테이션이 있습니다.
  3. 중요: 테스트에서 단일 빈을 초기화해야 하는 경우. @import와 함께 @ExtendWith(SpringRunner.class)를 사용하여 초기화할 빈을 지정하세요.
  4. 가장 좋은 경우: 순전히 자바 기반이며 스프링 부팅을 포함하지 않는 테스트를 목표로 하되, 모든 시나리오에서 가능한 것은 아닙니다.

 

Speeding up @SpringBootTest and avoiding @DirtiesContext (Saved 25% running time)

DirtiesContext는 각 테스트 또는 각 테스트 클래스 후에 Spring 컨텍스트를 다시 생성하는 어노테이션입니다. DirtiesContext를 사용하지 않으려면 모든 테스트가 동일한 데이터에 의존하지 않도록 하세요. 이를 위해 테스트 데이터 팩토리에서 데이터 생성을 래핑하고 생성된 데이터가 무작위인지 확인할 수 있습니다.

앞서 언급했듯이 @SpringBootTest를 사용하지 않는 것이 좋지만, 어쩔 수 없이 사용해야 하는 경우 @DirtiesContext 없이 WebEnvironment.MOCK을 사용해야 합니다.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)

빈 생성을 제한하려면 @Import 또는 @ContextConfiguration과 함께 사용하세요.

 

Run tests in parallel (Saved 37% running time)

test/resource/junit-platform.propertiesjunit-platform.properties 파일을 생성하고 다음 최소값을 추가합니다.

junit.jupiter.execution.parallel.enabled = true

이제 다음 중 하나를 사용할 수 있습니다,

  1. 병렬로 실행하려는 모든 클래스에 다음을 추가합니다. @Execution(CONCURRENT)
  2. junit-platform.properties에 추가하기
junit.jupiter.execution.parallel.mode.default = same_thread|concurrent
junit.jupiter.execution.parallel.mode.classes.default =  same_thread|concurrent

일부 테스트는 병렬로 실행할 수 없으므로 @Execution(CONCURRENT)를 수동으로 추가하는 것을 선호합니다.
다른 데이터에 대해 asserting하여 @DataMongoTest로 데이터 테스트를 찾았습니다.
@Execution(CONCURRENT)의 또 다른 긍정적인 효과는 이러한 테스트가 먼저 실행된다는 것입니다. 그리고 이러한 테스트는 SAME_THREAD mode보다 빠르기 때문에 즉각적인 피드백으로 이어집니다.

공지사항