영호

[Junit] 병렬 실행을 통해 빌드 시간 단축해보기 본문

Test/JUnit

[Junit] 병렬 실행을 통해 빌드 시간 단축해보기

0h0 2023. 11. 12. 15:13

들어가면서

평소 길어진 빌드 시간을 개선하기 위해 방법을 찾아보다가 Junit 병렬 실행에 대해 알게됐고 이를 적용해봤습니다. 이 글에서는 Junit 병렬 실행 설정을 통해 테스트 실행 시간을 줄인 방법에 대해서 작성해보려고 합니다.

설정 방법

junit-platform.properties 파일을 생성해서 병렬 실행 설정을 해주면 됩니다.

junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.classes.default = concurrent
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=6

매우 다양한 설정 옵션이 있지만, 저는 위 설정으로 진행했습니다.

 

우선 junit.jupiter.execution.parallel.enabled=true 이 설정을 통해 병렬 실행을 허용해줍니다.

junit.jupiter.execution.parallel.mode.classes.default = concurrent 이 설정을 통해 각 클래스 파일들을 기본적으로 병렬 실행으로 설정해줍니다.

junit.jupiter.execution.parallel.config.strategy=fixed junit.jupiter.execution.parallel.config.fixed.parallelism=6 이 2가지 옵션은 병렬로 수행할 스레드 개수를 설정한 것입니다. 저는 6개의 스레드로 병렬 수행하도록 설정했습니다.

 

그 이유는 싱글 스레드로 돌아가야 하는 부류의 클래스들이 3개 있었습니다. (인수 테스트, 컨트롤러 테스트, docs 테스트) 이 클래스들은 각각 싱글 스레드로 돌리고, 나머지 클래스들은 남은 3개의 스레드를 통해 병렬 수행하기 위해서였습니다.

주의점

다만 Junit 을 병렬로 실행할 때는 thread-safe 한 코드들만 병렬로 수행해야 합니다. 예를 들면 RestAssured를 이용하는 인수테스트의 경우 병렬로 실행하면 동시성 문제로 인해 테스트에 실패하게 됩니다.

이 경우 싱글 스레드로 돌려야 하는 클래스에 @Execution(ExecutionMode.*SAME_THREAD*) 어노테이션을 붙여 싱글 스레드로 동작하도록 설정할 수 있습니다.

@Execution(ExecutionMode.SAME_THREAD)
@SpringBootTest(webEnvironment = RANDOM_PORT)
public abstract class AcceptanceTest { ... }

결과

제 로컬(인텔 맥) 에서 빌드 시간이 1분 9초 에서 45초 줄어들었습니다.

병렬 실행 X

병령 실행 O

 

더 다양한 옵션은 공식문서에 있습니다~

Comments