🐦
Kotlinでテストを書いた話 (kotest)
概要
Kotlin初学者の私がテストコードを触ってみたので作業記録も兼ねて、記事として残したいと思います。
もし同じようなKotlin初学者の手助けになれると嬉しいです。
実行環境
- Windows 10
- IntelliJ IDEA 2021.2
- kotlin 1.4.21
- ktor 1.5.1
- kotest 4.6.1
準備
- 依存関係を追加build.gradle.kts
dependencies { testImplementation("io.kotest:kotest-runner-junit5-jvm:4.6.1") }
- テストのRunnerとしてJUnitを使用するbuild.gradle.kts
tasks.test { useJUnitPlatform() }
- Kotestのプラグインをインストール
テストコードの書き方(Spec)
Specは10種類ありますが、今回はKotestオリジナルのString Spec
と私が実際に利用したFun Spec
を紹介します。
他のSpecは公式サイトをご参照ください。
-
StringSpec
- 恐らく階層化ができない(方法があれば教えてください)
- 記述が少なくて済む。
StringSpecTestimport io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe class StringSpecTest : StringSpec( { "array.size should return size of array" { val result = arrayOf("a", "b", "c") val expected = 3 result.size shouldBe expected } })
-
FunSpec
- 個人的に記述がしっくりきた。
- Jestを触っていたので
DescribeSpec
と迷った。
FunSpecTestimport io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe class FunSpecTest : FunSpec ({ context("array"){ test("array.size should return size of array") { val result = arrayOf("a", "b", "c") val expected = 3 result.size shouldBe expected } test("array.maxOf should return max in array") { val result = arrayOf(3, 5, 2) val expected = 5 result.maxOf { it } shouldBe expected } } })
テストの実行
-
行番号の隣の
右向きの三角形
をクリックして、Run(実行) を選択
-
テスト結果の表示がされれば(テストの実行が)成功です
条件付きテスト(Conditional Evaluation)
詳しくは公式サイトをご参照ください。
- テストケースの無効化
configでenabled = false
を設定することで無効化できます。FunSpecTesttest("array.minOf should return min in array").config(enabled = false) { val result = arrayOf(3, 5, 2) val expected = 2 result.minOf { it } shouldBe expected }
- 特定の条件下で実行(Linux上でのみ実行)
enabled = false
の応用で特定の条件下でのみ実行させることができます。FunSpecTest- test("array.minOf should return min in array").config(enabled = false) + test("array.minOf should return min in array").config(enabled = IS_OS_LINUX)
- もっと単純な無効化(X-メソッド)
test
やcontext
にx
をつけることで無効化できます。FunSpecTest- test("array.sum should return sum of array") + xtest("array.sum should return sum of array")
検証の記述
この他にももっとたくさんの検証があります。
ぜひ公式サイトをご参照ください。
- A == B
A shouldBe B
- A != B
A shouldBe B
- A > B
A shouldBeGreaterThan B
- A >= B
A shouldBeGreaterThanOrEqual B
- A < B
A shouldBeLessThan B
- A <= B
A shouldBeLessThanOrEqual B
- A in B(範囲)
shouldBeInRange
A shouldBeInRange B
- A(配列) contains B
val A = arrayOf("a", "b", "c") val B = "c" A shouldContain B
- A(配列) not contains B
val A = arrayOf("a", "b", "c") val B = "d" A shouldContain B
- A contains B(正規表現)
A shouldMatch B
- A start with B(から始まる)
A shouldStartWith B
- A end with B(で終わる)
A shouldEndWith B
- A.callException()で何らかの例外が発生
shouldThrowAny{ A.callException() }
- 特定の例外が発生
shouldThrow<NumberFormatException>{ "string".toInt() }
最後に
まだモック(Mockk)
の話もできてないですし、データ駆動
の話もできてないので、時間が許せばまた書きたいと思います。
「名前がかわいい」というのが主な動機で触りはじめたKotlinでしたが、少ない記述で正しく書けるのは楽しいです。
ことりん普及のために書いていきたいと思います。
Discussion