この記事はkdnaktの1人 Advent Calendar 2020の9日目の記事です。
2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、Kotlin/NativeでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。
[Kotlin/Nativeのテスト]
Kotlin/Nativeのコードをテストする場合、Kotlin標準のテストフレームワークを利用できるようです。
Run tests - Kotlin Programming Language
サンプルとして、以下のようなテストコードが紹介されています。@Test
や、assertTrue
など、JUnitと同様のAPIでテストを実装できそうです。
import kotlin.test.Test import kotlin.test.assertTrue class SampleTests { @Test fun testProxy() { assertTrue(Proxy().proxyHello().isNotEmpty()) } }
JavaでJUnitを利用する場合には、JUnitのライブラリを依存関係に含める必要があります。Kotlinの場合も、JVM用のプロジェクトの場合にはkotlin-test-junit
ライブラリなどを依存関係に含める必要があるようです。
しかし、Kotlin/Nativeの場合、依存関係の追加は不要で、デフォルトでkotlin.test
APIを利用できるようです。
Kotlin/Native targets do not require additional test dependencies, and the kotlin.test API implementations are built-in.
Using Gradle - Kotlin Programming Language
空のKotlin/Nativeプロジェクトを作って、src/nativeMain/kotlin/MySum.kt
ファイルを以下の内容で実装します。
// 与えられた2つの数の和を返す関数、未実装 fun mySum(a: Int, b: Int): Int = 0
つぎに、src/nativeTest/kotlin/MySumTest.kt
ファイルを以下の内容で実装します。サンプルコードから、assertTrue
をassertEquals
に変えたシンプルなテストです。
import kotlin.test.Test import kotlin.test.assertEquals class MySumTest { @Test fun testMySum() { assertEquals(10, mySum(2, 8)) } }
IntelliJでRun 'MySumTest.testMySum ...'をクリックして、テストを実行してみます。
テストが失敗しました。
kotlin.AssertionError: Expected <10>, actual <0>.
とあるので、期待値と実際の結果が合っていないことがわかります。
mySum()
関数をfun mySum(a: Int, b: Int): Int = a + b
と修正して、再度テストを実行すると、今度はグリーンのチェックマークが表示されます。テストが通過しました。
[ターミナルからテストを実行する]
IntelliJでのテスト結果のメッセージから判断するに、gradle nativeTest
でターミナルからテストを実行できそうです。
実際にコマンドを実行してみると、ビルドは通りましたが実行されたテストが分かりづらいです。この辺りは別のプラグインなどを探して追加する必要がありそうです。
$ gradle nativeTest --tests "MySumTest.testMySum" > Configure project : Kotlin Multiplatform Projects are an Alpha feature. See: https://kotlinlang.org/docs/reference/evolution/components-stability.html. To hide this message, add 'kotlin.mpp.stability.nowarn=true' to the Gradle properties. Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 18s 4 actionable tasks: 4 executed