본문 바로가기
Spring

[Spring] Kotest 병렬 테스트 설정 방법

by 노력남자 2023. 12. 31.
반응형

이번 포스팅에선 Kotest로 작성한 테스트를 병렬로 실행하는 방법에 대해 알아보겠다.

 

Kotest 병렬 테스트 설정 방법

 

AbstractProjectConfig를 상속받은 클래스를 만든 후 parallelism level을 설정해서 테스트를 몇 개씩 동시에 실행할 건지 설정할 수 있다.

 

class KotestProjectConfig : AbstractProjectConfig() {
    override val parallelism = 3
}

 

병렬로 실행되는 단위는 Spec 단위다.

 

병렬로 실행한다고 해서 @SpringBootTest, @DataJpaTest 테스트를 돌릴 때 애플리케이션이 테스트마다 올라가지 않으니 걱정 안 해도 된다.

 

병렬 테스트 예제

 

먼저 parallelism 설정을 하지 말고, 아래와 같은 테스트를 똑같이 복사해서 이름 뒤에 2, 3을 붙여준 뒤 테스트를 돌려보자.

 

class ThreadSleepTest : DescribeSpec({

    describe("Thread.sleep") {
        context("2초간 sleep을 하면") {
            val now = LocalDateTime.now()
            Thread.sleep(2000)
            it("2초 후에 테스트를 실행한다.") {
                LocalDateTime.now() shouldBeGreaterThanOrEqualTo now
            }
        }
    }
})

 

parallelism을 설정하지 않아 테스트마다 2초씩 걸리는 걸 볼 수 있다.

 

 

parallelism을 3으로 설정하고 돌려보자.

 

class KotestProjectConfig : AbstractProjectConfig() {
    override val parallelism = 3
}

 

한 번에 테스트 3개가 병렬로 실행된 걸 볼 수 있다.

 

 

 

아마 위까지만 설정하고 parallelism을 아무리 크게 늘려도 속도가 개선되지 않는 문제가 있을 거다.

 

concurrentSpec를 추가하자. 값은 Int.MAX_VALUE로 주자. 신세계를 경험할 수 있다.

 

class KotestProjectConfig : AbstractProjectConfig() {
    @ExperimentalKotest
    override val concurrentSpecs = Int.MAX_VALUE
    override val parallelism = 8
}

 

특정 테스트는 병렬로 돌리고 싶지 않다면?

 

모든 테스트를 병렬로 돌리로 싶지 않을 수도 있다. 그럴 땐 @DoNotParalleize를 붙여주면 된다.

 

typealias로 정의된 걸 사용하면 된다.

 

@DoNotParallelize
class ThreadSleepTest : DescribeSpec({
	...
})

 

적절한 parallelism level은?

 

사실 이건 정확하게 모르겠다. cpu 코어 수에 따라 달라지기 때문에 조금씩 조정하면서 테스트를 해보는 게 좋겠다.

반응형

댓글