Spring

[Spring] Kotest DescribeSpec, BehaviorSpec에서 Isolation Mode에 따른 동작 방법 알아보기

노력남자 2023. 12. 25. 22:29
반응형

이번 포스팅에선 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는 속도가 빠른 대신 테스트 간 모든 상태를 공유하기 때문에 사용하기 까다로울 수 있다.

 

반응형