読者です 読者をやめる 読者になる 読者になる

Kotlin Advent Calendar 2012 (全部俺)

JavaプログラマのためのKotlin入門

23日目:JUnitを使う

f:id:ngsw_taro:20121221223856j:plain

アドベントカレンダー23日目です。今日はJavaユニットテストフレームワークデファクト・スタンダードであるJUnitを使って、Kotlinのユニットテストを走らせる方法を紹介します。Kotlinの標準ライブラリに含まれているパッケージ kotlin.test にはJUnitで使える便利な関数群が用意されていますので、それを使ったテストの書き方も併せて紹介します。

JUnitを用意する

まずJUnitを好きな方法で用意してください。そして使える状態にしてください。なお今回は、IntelliJ IDEA上でテストを走らせます。

はじめてのテストコード

KotlinでJUnit用テストコードを書きましょう。

import org.junit.Test as test

class Test {
    test fun myFirstTest() {
    }
}

注目すべき1点目は最初のインポート文です。JUnitの提供するアノテーション Test をインポートして、test という別名を付けています。

次に注目すべき点はテスト対象の関数がクラスのメンバとなっている点です。Kotlinでは名前空間レベルに関数を置くことができるので、わざわざクラスを定義してそのメンバとするのは面倒なので避けたいところです。しかし残念ながら避けることはできません。昨日説明したとおり、名前空間レベルに関数を置くとクラス namespace が自動生成され、そのメンバとなります。実は namespace はコンストラクタまったく持ちません*1。そのためJUnitがnamespaceをインスタンス化しようとすると例外が投げられてしまいます*2。このような理由でテスト対象の関数は必ずクラス内に置く必要があります。

テストを実行する

さて、テストコードを書いたので実行させてみます。この手順はIntelliJ IDEA固有の話なので、Kotlinとは関係ありませんが、現時点で唯一KotlinをサポートするIDEなので丁寧に紹介したいと思います。

メニューやショートカットキーにより「Run...」を選択します。

f:id:ngsw_taro:20121221232600p:plain

すると次のような選択を迫られますので、実行対象を選びます。

f:id:ngsw_taro:20121221232825p:plain

テストが実行され、結果が表示されます。

f:id:ngsw_taro:20121221232853p:plain

グリーンを得られました!

パッケージ kotlin.test を使ってテストを書く

パッケージ kotlin.test にはJUnitユニットテストを書くのに便利な関数がいくつか含まれています。次に示す、引数に与えられた数を +1 した値を返すだけの退屈な関数のテストを書いてみます(すべてのテストをパスします)。

fun next(i : Int = 0) : Int {
    require(i >= 0)
    return i + 1
}
import kotlin.test.assertEquals
import kotlin.test.expect
import kotlin.test.todo

import org.junit.Test as test

class Test {
    test(expected = javaClass<IllegalArgumentException>())
    fun 引数に負数を渡すと例外が投げられるはず() {
        next(-1)
    }

    test fun 正数を渡すとプラス1された値が返されるはず() {
        assertEquals(1, next(0))
        assertEquals(2, next(1))
        assertEquals(3, next(2))
    }

    test fun ゼロから始めて100回繰り返すと結果は100のはず() {
        expect(100) {
            (1..100).fold(0) {
                (a : Int, e : Int) -> next(a)
            }
        }
    }

    test fun おまけ() {
        todo {
            // ここはテスト結果には影響しないんだぜ
            throw Exception()
        }
    }
}

まだまだ提供されている関数は少ないですが、Kotlinの特性(特に関数リテラル)を活かした関数があるので使ってみると面白いかも知れません。

まとめと次回予告

今日はKotlinコードをJUnitでテストする方法を学びました。パッケージ kotlin.test が提供する関数を使ったテストコードの簡単な例を見ました。このパッケージは発展途上なので今後の展開に期待です。

明日はKotlinコードからサードパーティ製のJavaライブラリやフレームワークを使う例をご覧に入れたいと思います。

日記

昨日は会社の友達と飲みました。

*1:文字通りコンストラクタを持ちません。生成されたクラスファイルを javap コマンドで読んでみてください。

*2:ちょっと自信がありません。現在、調査中。