KazaKago’s LGTM

個人的な書き物置き場

Kotlinファーストなテストフレームワークについて

Kotlinにおけるテストフレームワークについて断片的な知識しかなく今まで雰囲気で技術選定していたので、主要なものを軽く調べてみた結果を備忘録として簡単にまとめてみます

調査対象

Kotest

https://kotest.io/

Kotlin Multiplatformにも対応した包括的なテストフレームワーク
Kotlin JVMの場合はテストフレームワークJunitを利用してアサーションライブラリだけを利用することも可能
フレームワークとしては複数のスタイルが定義されており様々な書き方に対応している 混乱を招かないかこれ
アサーションとしては拡張関数や中置関数を利用した記述が特徴で流れるように書ける

class StringSpecTest : StringSpec() {
    private val calc = Calc() 
    init {
        "10 割る 5 は 2 になる" {
            calc.divide(10, 5) shouldBe 2
        }
        "10 割る 0 は例外(ArithmeticException)が起きる" {
            shouldThrow<ArithmeticException> { calc.divide(10, 0) }
        }
    }
}

Spek

https://www.spekframework.org/

こちらはテストフレームワーク、2.0からMultiplatform対応がされたようだがいかんせんドキュメントが少ない
フレームワークとしてはカッコでネストしていく記法で一部Hookっぽい部分もありちょっと癖を感じる
アサーション機構はなくHamcrestやkotlin.test など別のアサーションライブラリと組み合わせて使っていくっぽい

class SimpleTest : Spek({
    describe("a calculator") {
        val calculator = SampleCalculator()
 
        it("should return the result of adding the first number to the second number") {
            val sum = calculator.sum(2, 4)
            assertEquals(6, sum)
        }

        it("should return the result of subtracting the second number from the first number") {
            val subtract = calculator.subtract(4, 2)
            assertEquals(2, subtract)
        }
    }
})

Kluent

https://markusamshove.github.io/Kluent/

アサーションのみを担うライブラリ、一部Multiplatformにも対応しているが中途半端
書き味はKotestに非常に近くて個人的には好み、ただだいぶ放置気味でメンテ不安なのでKotestのほうが個人的にはおすすめ

class SampleTest {
    @Test
    fun test {
        val value = 10
        value shouldBeInstanceOf Int::class
    }
}

atrium

https://docs.atriumlib.org/

こちらもMultiplatform対応のアサーションライブラリ、公式サイトが無駄に渋い
expect()を軸としたメソッドチェーンを多用してアサーションを組み立てていくのが特徴

 class SampleTest {
     @Test
     fun test {
         expect(4 + 6) {
             toBeLessThan(5)
             toBeGreaterThan(10)
         }
     }
 }

所感

いくつか調べてみた感じ、私のようなJunit+Hamcrestに慣れきった人が今から新規採用するなら下記の技術群がいいのではないかと感じました