본문 바로가기
Spring

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

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

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

 

반응형

댓글