🐦

Kotlinでテストを書いた話 (kotest)

2021/08/15に公開

概要

Kotlin初学者の私がテストコードを触ってみたので作業記録も兼ねて、記事として残したいと思います。
もし同じようなKotlin初学者の手助けになれると嬉しいです。

実行環境

  • Windows 10
  • IntelliJ IDEA 2021.2
  • kotlin 1.4.21
  • ktor 1.5.1
  • kotest 4.6.1

準備

  1. 依存関係を追加
    build.gradle.kts
    dependencies {
        testImplementation("io.kotest:kotest-runner-junit5-jvm:4.6.1")
    }
    
  2. テストのRunnerとしてJUnitを使用する
    build.gradle.kts
    tasks.test {
        useJUnitPlatform()
    }
    
  3. Kotestのプラグインをインストール
    plugin-install

テストコードの書き方(Spec)

Specは10種類ありますが、今回はKotestオリジナルのString Specと私が実際に利用したFun Specを紹介します。
他のSpecは公式サイトをご参照ください。

  1. StringSpec

    • 恐らく階層化ができない(方法があれば教えてください)
    • 記述が少なくて済む。
    StringSpecTest
    import 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
        }
    })
    
  2. FunSpec

    • 個人的に記述がしっくりきた。
    • Jestを触っていたので DescribeSpec と迷った。
    FunSpecTest
    import 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
            }
        }
    })
    

テストの実行

  1. 行番号の隣の右向きの三角形をクリックして、Run(実行) を選択
    SpecRun

  2. テスト結果の表示がされれば(テストの実行が)成功です
    TestResult

条件付きテスト(Conditional Evaluation)

詳しくは公式サイトをご参照ください。

  1. テストケースの無効化
    configでenabled = falseを設定することで無効化できます。
    FunSpecTest
    test("array.minOf should return min in array").config(enabled = false) {
        val result = arrayOf(3, 5, 2)
        val expected = 2
        result.minOf { it } shouldBe expected
    }
    
  2. 特定の条件下で実行(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) 
    
  3. もっと単純な無効化(X-メソッド)
    testcontextxをつけることで無効化できます。
    FunSpecTest
    - test("array.sum should return sum of array")
    + xtest("array.sum should return sum of array")
    

検証の記述

この他にももっとたくさんの検証があります。
ぜひ公式サイトをご参照ください。

  1. A == B
    A shouldBe B
    
  2. A != B
    A shouldBe B
    
  3. A > B
    A shouldBeGreaterThan B
    
  4. A >= B
    A shouldBeGreaterThanOrEqual B
    
  5. A < B
    A shouldBeLessThan B
    
  6. A <= B
    A shouldBeLessThanOrEqual B
    
  7. A in B(範囲) shouldBeInRange
    A shouldBeInRange B
    
  8. A(配列) contains B
    val A = arrayOf("a", "b", "c")
    val B = "c"
    A shouldContain B
    
  9. A(配列) not contains B
    val A = arrayOf("a", "b", "c")
    val B = "d"
    A shouldContain B
    
  10. A contains B(正規表現)
    A shouldMatch B
    
  11. A start with B(から始まる)
    A shouldStartWith B
    
  12. A end with B(で終わる)
    A shouldEndWith B
    
  13. A.callException()で何らかの例外が発生
    shouldThrowAny{ A.callException() }
    
  14. 特定の例外が発生
    shouldThrow<NumberFormatException>{ "string".toInt() }
    

最後に

まだモック(Mockk)の話もできてないですし、データ駆動の話もできてないので、時間が許せばまた書きたいと思います。

「名前がかわいい」というのが主な動機で触りはじめたKotlinでしたが、少ない記述で正しく書けるのは楽しいです。
ことりん普及のために書いていきたいと思います。

Discussion