gradle multi module 기반으로 개발을 할 때 각 모듈의 테스트 속도가 오래 걸릴 경우 전체 테스트 시간이 길어져서 전체적인 개발 사이클이 그만큼 느려지게 되는데,
multi module 환경에서 모듈 별 테스트를 병렬로 실행시켜 테스트 속도를 높일 수 있는 방안에 대해 알아보자.
테스트에 사용된 코드는 여기에서 확인할 수 있다.
다음과 같이 test1, test2, test3 모듈을 생성하고
각 모듈의 테스트가 일부러 오래걸리도록 Testcontainers를 사용하여 테스트를 실행하도록 하였다.
@SpringBootTest
class Test1ApplicationTests {
companion object {
private val mysqlContainer = MySQLContainer<Nothing>("mysql:8.0").apply {
withCommand("mysqld", "--character-set-server=utf8mb4")
start()
}
@JvmStatic
@DynamicPropertySource
fun registerProperties(registry: DynamicPropertyRegistry) {
registry.add("spring.datasource.url", mysqlContainer::getJdbcUrl)
registry.add("spring.datasource.username", mysqlContainer::getUsername)
registry.add("spring.datasource.password", mysqlContainer::getPassword)
}
}
@Test
fun contextLoads() {
}
}
위와 같이 3개의 모듈 각각에 실행이 오래걸리는 테스트가 있을 때,
단순하게 테스트를 실행할 경우 아래와 같이 테스트 스크립트를 실행할 것이다.
$ ./gradlew test
위와 같이 테스트를 실행할 경우 아래와 같이 모듈 하나 씩 테스트를 하는 것을 확인할 수 있다.
결과적으로 테스트가 완료되는데 1분이 넘는 시간이 걸렸다.
위와 같이 테스트를 할 때 각각 모듈이 순차적이 아니라 병렬로 테스트가 실행된다면 테스트 시간이 많이 단축이 될 것같다.
테스트를 병렬로 실행하기 위해서는 아래와 같이 --parallel 옵션을 추가해주면 된다.
$ ./gradlew test -parallel
--parallel 옵션을 추가하면 아래와 같이 각 모듈이 병렬적으로 테스트를 실행하는 것을 확인할 수 있다.
테스트 시간은 다음과 약 30초가 줄어드는 것을 확인할 수 있었다.
--max-workers 옵션을 사용하면 worker 수를 정할 수 있어 테스트 환경에 맞춰 CPU 코어 수를 설정하는 것도 좋을 것 같다.
다음과 같이 --max-worker=2로 실행했을 때 3개의 모듈 중 2개의 모듈만 테스트가 돌아가는 것을 확인할 수 있다.
참고
- https://discuss.gradle.org/t/parallel-tests-in-subprojects/34978
- https://discuss.gradle.org/t/relationship-between-forkevery-maxparallelfork-and-parallel/25126/2
'Java & Kotlin > Java' 카테고리의 다른 글
[Java] List, Set, Map 구현체들 (0) | 2023.01.06 |
---|---|
BigDecimal이 소수를 다루는 방법 (0) | 2022.12.08 |
jabba global JDK 설정하기 (0) | 2022.04.09 |
JUnit5 - @TestInstance에 대해 알아보자 (0) | 2021.07.25 |
Servlet Filter의 response의 PrintWriter를 close 해야할까? (0) | 2021.02.24 |
댓글