Surefire 이용하여 병렬로 테스팅 하기

대부분의 유닛테스팅에서는 병렬로 실행하지는 않을 것이다. 하지만, 속도를 올리기위해 병렬로 실행할 필요가 있다 (아래 유투브 예시arrow-up-right).

여기선, 단일 JVM 프로세스에서 모든 테스트를 실행한 다음 다중 모듈 프로젝트로 시도해본다.

  • Surefire는 2가지 방식으로 병렬 테스팅을 지원한다.

    • 단일 JVM 프로세스 안에서 Multithreading 하는 방식

    • 여러 JVM 프로세스들을 Forking 하는 방식

종속성 추가

pom.xml 에서 Surefire에서 병렬 설정

  • parallel: suites, classes, methods 모두 별도의 스레드에서 실행하도록 설정

  • threadCount: 쓰레드 개수 제한

    • 개수는 CPU의 1개의 코어 기준

    • CPU 코어만큼 쓰려면, threadCount 대신에 useUnlimitedThreads 이용

  • method, class, suite 레벨에서 쓰레드 개수를 제한하고자 할 때: threadCountSuites, threadCountClasses, threadCountMethods

    • 단, threadCount >= threadCountClasses + threadCountSuites + threadCountMethods 를 만족해야 한다.

    • 때때로, (useUnlimitedThreads 이용하여) 쓰레드를 무한으로 해놓고도, 특정 레벨의 쓰레드를 제한할때도 사용된다.

  • 시간 제한 줄때: parallelTestTimeoutInSeconds와 parallelTestTimeoutForcedInSeconds

    • parallelTestTimeoutForcedInSeconds가 현재 쓰레드와 큐에 있는 것까지 모두 멈침 (더 강력).

주의

Surefire 는 @Parameters, @BeforeClass, @AfterClass 어노테이션들이 붙은 static 메소드를 호출하는데, memory inconsistencies 이나 race conditions 이 발생하지 않게 조심하자.

실행하기

모듈이 여러개 있다면, 각 모듈의 테스트들이 sequential 하게 테스트 되기에, 이조차 병렬로 실행하게 할 수 있다. -T 인수로 설정 해준다.

문제점 해결하기

병렬 기능을 사용하게 되면, 빠르다는 장점이 있지만, 쓰레드들이 동일 메모리를 사용함으로, race conditions 같은 문제가 생길 수 있다.

이를 예방하기 위해, Surefire 는 다른 병렬 실행 모드를 제공한다. 이는, 프로세스들을 Surefire가 직접 생성하여 관리해준다. 프로세스들 끼리 공유 메모리를 사용할 필요 없게 된다.

C를 붙이면, CPU 코어 개수를 곱하여 생성해준다.

기본적으로, 생선된 fork 들은 재사용하는데, reuseForks를 false로 주면 disable 가능하다.

참고자료

  • https://www.baeldung.com/maven-junit-parallel-tests

Last updated