Kotlinファーストなテストフレームワークについて
Kotlinにおけるテストフレームワークについて断片的な知識しかなく今まで雰囲気で技術選定していたので、主要なものを軽く調べてみた結果を備忘録として簡単にまとめてみます
調査対象
Kotest
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
こちらもMultiplatform対応のアサーションライブラリ、公式サイトが無駄に渋い
expect()を軸としたメソッドチェーンを多用してアサーションを組み立てていくのが特徴
class SampleTest { @Test fun test { expect(4 + 6) { toBeLessThan(5) toBeGreaterThan(10) } } }
所感
いくつか調べてみた感じ、私のようなJunit+Hamcrestに慣れきった人が今から新規採用するなら下記の技術群がいいのではないかと感じました