이번 포스팅에선 Kotest의 DescribeSpec, BehaviorSpec에서 isolation mode에 따라 어떻게 동작하는지 알아보려고 한다.
아래 설명은 DescribeSpec 기준으로 하려고 한다. BehaviorSpec이 궁금하면 describe = given, context = when, it = then으로 생각하며 보면된다.
Isolation Mode란?
Kotest의 Isolation Mode는 테스트 간 변수, 테스트 객체, 목 객체 등을 어떤 단위로 공유할지에 대한 전략이다.
Isolation Mode에 따라 생성되는 테스트 단위를 인스턴스라고 한다.
공식 홈페이지에서는 Isolation Mode에 따라 새로운 스펙(Spec)이 생성된다고 말을 한다.
SingleInstance, InstancePerLeat, InstancePerTest 총 3개의 Isolation Mode를 제공한다.
설정 방법을 알아보고 각 모드에 대해 설명하곘다.
Isolation Mode 설정 방법
Isolation Mode는 Spec 단위 (DescribeSpec, BehaviorSpec 등)로 적용된다.
각 테스트 성격에 맞는 모드를 설정해서 사용할 수도 있고 글로벌 설정도 할 수 있다.
1. 테스트에 직접 설정
class KotestTest : DescribeSpec({
isolationMode = IsolationMode.SingleInstance
...
})
2. 글로벌 설정
AbstarctProjectConfig를 상속받는 클래스를 만들어 글로벌 설정을 할 수 있다.
class ProjectConfig: AbstractProjectConfig() {
override val isolationMode = IsolationMode.InstancePerLeaf
}
Isolation Mode 설명
설명은 공유된 변수의 값 변화를 하나하나 찍어서 설명할 수도 있지만 describe, context, test의 이름을 찍어서 어떤 식으로 인스턴스를 만드는지 보는 게 이해하기 더 좋은 거 같다.
1. SingleInstance (Default)
테스트당 1개만 인스턴스를 만드는 방법이다.
class KotestTest : DescribeSpec({
describe("describe") {
println("describe")
context("context1") {
println("context1")
it("it1") {
println("it1")
}
}
context("context2") {
println("context2")
it("it2") {
println("it2")
}
}
}
})
인스턴스가 1개라 위에서부터 하나씩 찍힌 걸 볼 수 있다.
describe
context1
it1
context2
it2
2. InstancePerTest
InstancePerTest에서 Test는 describe, context, test의 test를 말하는 게 아니다.
describe, context, test 각각이 Test다.
각 Test를 기준으로 인스턴스가 만들어지는 모드다.
class KotestTest : DescribeSpec({
isolationMode = IsolationMode.InstancePerTest
describe("describe") {
println("\ndescribe")
context("context1") {
println("context1")
it("it1") {
println("it1")
}
}
context("context2") {
println("context2")
it("it2") {
println("it2")
}
}
}
})
결과를 보면 이해가 간다.
// describe 기준 (describe)
describe
// context1 기준 (describe-context1)
describe
context1
// it1 기준 (describe-context1-it1)
describe
context1
it1
// context2 기준 (describe-context2)
describe
context2
// it2 기준 (describe-context2-it2)
describe
context2
it2
3. InstancePerLeaf
InstacePerLeaf에서 Leaf는 it을 말한다.
it 기준으로 인스턴스가 생성된다.
class KotestTest : DescribeSpec({
isolationMode = IsolationMode.InstancePerLeaf
describe("describe") {
println("\ndescribe")
context("context1") {
println("context1")
it("it1") {
println("it1")
}
}
context("context2") {
println("context2")
it("it2") {
println("it2")
}
}
}
})
결과를 보고 이해하자
// it1 기준 (describe-context1-it1)
describe
context1
it1
// it2 기준 (describe-context2-it2)
describe
context2
it2
어떤 Isolation Mode를 사용해야 할까?
여기에 정답은 없다. 하지만 알아야 할 게 있다.
1. Isolation Mode가 SingleInstance -> InstancePerLeaf -> InstancePerTest로 갈수록 인스턴스 생성 수가 많기 때문에 성능이 안 좋아질 수 있다.
2. SingleInstance는 속도가 빠른 대신 테스트 간 모든 상태를 공유하기 때문에 사용하기 까다로울 수 있다.
'Spring' 카테고리의 다른 글
[Spring] Gradle Test events were not received 해결 방법 (21) | 2023.12.28 |
---|---|
[Spring] Kotest와 Mockk를 사용할 때 주의할 점 (26) | 2023.12.26 |
[Spring] Kotest context, when 단위로 @Transactional 동작하게 하는 방법 (18) | 2023.12.11 |
[Spring] Kotest에서 @Transactional을 사용하는 방법 (3) | 2023.12.10 |
[Spring] Exceeded limit on max bytes to buffer : 262144 해결책 (3) | 2023.12.03 |
댓글