라이브러리 프레임워크

Kotest Parameterized Test 하는 법

Octoping 2024. 4. 11. 21:37

JUnit에는 Parameterized Test라는 것이 있다.

이걸로 같은 테스트에 대해 여러 개의 input으로 테스트를 진행할 수 있다.

 

Kotest에서는 어떻게 할까?

 

https://kotest.io/docs/framework/datatesting/data-driven-testing.html

 

Introduction | Kotest

Before data-driven-testing can be used, you need to add the module kotest-framework-datatest to your build.

kotest.io

Data Driven Testing 이라는 이름으로 제공하고 있다.

 

internal class EmailInfoTest : BehaviorSpec({
    Given("이메일 형식이 올바르지 않을 경우") {
        When("EmailInfo를 생성하면") {
            withData(
                nameFn = { "예외가 발생한다 ($it)" },
                "@kw.ac.kr",
                " @kw.ac.kr",
                "@@kw.ac.kr",
                "%^%^@kw.ac.kr",
                "a$%b123@kw.ac.kr",
                "duo@kw.ac.kr@kw.ac.kr",
            ) { invalidEmail ->
                val exception = shouldThrow<IllegalArgumentException> {
                    EmailInfo(invalidEmail)
                }

                exception.message shouldBe "이메일 형식이 올바르지 않습니다."
            }
        }
    }
})

다음과 같이, withData 키워드를 이용해서 사용할 수 있다.

하지만, 이걸 위해서는 어쩔 수 없이 kotest-framework-datatest 라이브러리를 import 해와야 한다.

 

테스트를 위해 이렇게 라이브러리가 늘어나는 것은 뭔가 귀찮다.

 

하지만 코틀린에서 제공하는 기본 문법을 이용해서 간단히 Parameterized Test를 할 수 있는 방법이 있다!

 

internal class EmailInfoTest : BehaviorSpec({
    Given("이메일 형식이 올바르지 않을 경우") {
        val invalidEmails = arrayOf(
            "@kw.ac.kr",
            " @kw.ac.kr",
            "@@kw.ac.kr",
            "%^%^@kw.ac.kr",
            "a$%b123@kw.ac.kr",
            "duo@kw.ac.kr@kw.ac.kr",
        )

        When("EmailInfo를 생성하면") {
            invalidEmails.forEach {
                Then("예외가 발생한다 $it") {
                    val exception = shouldThrow<IllegalArgumentException> {
                        EmailInfo(it)
                    }

                    exception.message shouldBe "이메일 형식이 올바르지 않습니다."
                }
            }
        }
    }
})

이렇게 forEach를 사용하면 깔끔해진다