[Kotest] Parameterized test에서 모든 enum을 돌면서 테스트하기 (exhaustive)

by 스뎅(thDeng) on

Kotest의 Parameterized test(Property test)의 Generator에는 모든 enum과 같이 합타입( enum/sealed class 그리고 대수적 타입(algebraic data type) 참고)의 모든 값을 테스트할 수 있는 Exhaustive가 있다.

아래와 같이 checkAll과 함께 사용하면, enum의 모든 값을 테스트한다. (MyStatus는 enum이다.)

context("accept") {
    checkAll(
        Exhaustive.enum<MyStatus>()
    ) { myStatus ->
        test("모든 status에 대해 유효성 검사를 한다. - $myStatus") {
            // given
            val machine = MachineFixture.aMachine(status = myStatus)

            // expect
            validtionRule.accept(machine) shouldBe true
        }
    }
}

이 enum 중 일부만 테스트를 하고 싶은 경우 filter, filterNot을 사용하면 된다.

context("accept") {
    checkAll(
        Exhaustive.enum<MyStatus>().filter { it == ONGOING }
    ) { adGroupStatus ->
        test("status 가 ONGOING 일 때만 유효성 검사를 한다. - $myStatus") {
            // given
            val machine = MachineFixture.aMachine(status = myStatus)

            // expect
            validtionRule.accept(machine) shouldBe true
        }
    }
    checkAll(
        Exhaustive.enum<MyStatus>().filterNot { it == ONGOING }
    ) { adGroupStatus ->
        test("adGroup status 가 ONGOING 이 아닐 때는 유효성 검사를 하지 않는다. - $adGroupStatus") {
            // given
            val machine = MachineFixture.aMachine(status = myStatus)

            // expect
            validtionRule.accept(machine) shouldBe false
        }
    }
}

Generator Property test

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License