UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Kotlin】kotestについて

Kotlin製のテスティングフレームワークKotestについて調べた

kotest.io

元々は「KotlinTest」として知られていたようで、リブランディングされて「Kotest」になったらしい

Kotlinの言語特性を活かしながら、簡単かつ強力にユニットテスト、インテグレーションテスト、プロパティベースのテスト、そして動作確認を行うために設計されている

Kotestの特徴

Kotestはいくつかのコーディングスタイルを提供していて、プロジェクトや開発者の好みに応じてテストスタイルを選択することができる

10種類のコーディングスタイルが用意されているうち、主なものは以下

  • StringSpec: 文字列ベースでテストケースを書くシンプルなスタイル
  • FunSpec: より標準的な関数ベースのスタイル
  • DescribeSpec: BDD(振る舞い駆動開発)に適したスタイル
  • ShouldSpec: BDDスタイルを補完する、shouldで始まる表現を使ったテスト
  • WordSpec: 人間の言語に近い形でテストを書くスタイル
  • BehaviorSpec: BDDスタイルに特化した構造化されたテスト

さまざまな組み込みのマッチャーがあり、これを使って多くの異なる条件を簡単にテストできる

数値の比較、コレクションの内容確認、例外の検証など、幅広い種類のアサーションが可能

例:

   val list = listOf(1, 2, 3)
   list shouldHaveSize 3
   list shouldContain 2

テストの意味が理解しやすい

プロパティベーステスト

Kotestは、プロパティベースのテストもサポートしている

これは特定の条件や制約の下で無数の入力をランダムに生成し、それらがすべて正しく動作することを確認するためのテスト方法

通常のテストでは思いつかないような入力パターンも検証できるため、バグの発見率を高めることができる

Kotestの基本的な使用例

1. シンプルなユニットテスト

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

class SampleTest : StringSpec({
    "addition should work correctly" {
        val sum = 1 + 1
        sum shouldBe 2
    }
})

2. コルーチンを使用した非同期テスト

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import kotlinx.coroutines.delay

class CoroutineTest : StringSpec({
    "should complete after delay" {
        val result = doSomethingAsync()
        result shouldBe "Completed"
    }
})

suspend fun doSomethingAsync(): String {
    delay(1000) // Simulate async work
    return "Completed"
}

3. BDDスタイルのテスト(BehaviorSpec)

import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe

class SampleBehaviorTest : BehaviorSpec({
    given("a number") {
        val num = 10
        `when`("it is multiplied by 2") {
            val result = num * 2
            then("the result should be 20") {
                result shouldBe 20
            }
        }
    }
})

Kotestのユースケース

  • ユニットテスト: 単純なビジネスロジックや関数単位のテストに最適
  • インテグレーションテスト: DBや外部APIとの連携をテストするためのツールやフックが豊富に用意されている
  • プロパティベーステスト: 入力範囲やランダムなデータを使ってロジックの健全性をチェックできる
  • Kotlinコルーチンのテスト: 非同期処理やコルーチンを活用するアプリケーションのテストに最適