참고
junit api
테스트 코드는 빠를 수록 좋다. 물론 정확한 실행과 결과를 가진다는 전제 하에 빠를 수록 좋다는 것이다. 테스트코드를 빠르게 만들기 위한 방법 중 하나로는 코드를 병렬로 실행하도록 하는 것인데. 이것이 class 단위의 병렬 처리
를 진행할지 혹은 class 내의 method 단위의 병렬 처리
로 진행할지 또는 class와 method 모두 병렬 처리
로 진행할지에 대해 개발자가 고민할 수 있다.
물론 전체적으로 병렬 처리로 설정하고 각 테스트에 맞게 순차적으로 진행하도록 어노테이션을 추가해준다면 해당 테스트 클래스만 순차진행할 수 있도록 설정할 수 있다.
공식 문서에서 해당 부분을 참고하자면 Lifecycle.PER_CLASS 가 적용된 부분도 제외된다.
이 점을 알고 진행하며 만약 병렬 처리시 해당 클래스와 메서드에 대해 개발자는 쓰레드 세이프하다는 것을 확인하고 진행할 것을 권장한다.
junit의 경우 yml 설정은 안먹고 properties 설정만 먹는다.
모든 테스트를 병렬로 실행하기
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
최상위 클래스를 병렬로 실행하지만 동일한 스레드에서 메서드를 실행하기
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = same_thread
junit.jupiter.execution.parallel.mode.classes.default = concurrent
최상위 클래스를 순차적으로 실행하지만 해당 메서드는 병렬로 실행하기
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
junit.jupiter.execution.parallel.mode.classes.default = same_thread
위 설정 중 골라서 해도 되고 mode만 class 마다 변경하고 싶을 경우에는 어노테이션을 통해 진행할 수 있다.
만약 어노테이션을 통해 병렬 설정을 주고 싶다면 위의 설정을 진행하지 않고
클래스 내 메서드 병렬 실행하기
@Execution(ExecutionMode.CONCURRENT)
클래스 내 메서드 동일한 스레드에서 실행하기
@Execution(ExecutionMode.SAME_THREAD)
설정을 통해 진행할 수 있다.
나는 이제 모든 테스트를 병렬로 실행하도록 설정을 진행하고 만약 필요하다면 class 별로 동일 스레드에서 작동하도록 어노테이션을 통해 작성하려고 한다. 우선 properties부터 작성해보자!
test/resources/junit-platform.properties
파일을 생성해서 위의 설정을 넣어주면 된다.
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
나의 경우에는 이렇게 설정했다.
그 후 필요한 부분에는
@Execution(ExecutionMode.SAME_THREAD)
설정을 통해 진행했다. 나의 경우 위 어노테이션을 사용한 곳은 통합테스트와 인수테스트 쪽이였는데 그 이유는 해당 부분들이 병렬로 실행되었을 때 db가 뜨기도 전에 실행되는 경우가 있어서 하나의 쓰레드로 테스트할 수 밖에 없었다. 정확한 이유는 나중에 찾아보는게 좋을거 같다!
기존의 큰 테스트 없이도 평균 35초 정도 걸리던 빌드가
20초까지 줄어든 것을 확인할 수 있었다. bdd와 병렬을 잘 이해해서 테스트 시간을 줄여버려 다른 개발자들이 더 많은 테스트를 진행할 수 있도록 도와보자!