본문 바로가기
Java & Kotlin/Java

gradle multi module test 속도를 높여보자 (with parallel)

by devson 2021. 7. 29.

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

 

 

위와 같이 테스트를 실행할 경우 아래와 같이 모듈 하나 씩 테스트를 하는 것을 확인할 수 있다.

clean 은 다음 테스트 시 영향을 주지 않기 위해 추가하였다

결과적으로 테스트가 완료되는데 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

댓글