kdnakt blog

hello there.

Kotlin/NativeでHTTPサーバーを作るアドベントカレンダー(9日目:テスト)

この記事は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())
    }
}

 

JavaJUnitを利用する場合には、JUnitのライブラリを依存関係に含める必要があります。Kotlinの場合も、JVM用のプロジェクトの場合にはkotlin-test-junitライブラリなどを依存関係に含める必要があるようです。

しかし、Kotlin/Nativeの場合、依存関係の追加は不要で、デフォルトでkotlin.testAPIを利用できるようです。

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ファイルを以下の内容で実装します。サンプルコードから、assertTrueassertEqualsに変えたシンプルなテストです。

import kotlin.test.Test
import kotlin.test.assertEquals

class MySumTest {
    @Test
    fun testMySum() {
        assertEquals(10, mySum(2, 8))
    }
}

 

IntelliJでRun 'MySumTest.testMySum ...'をクリックして、テストを実行してみます。

f:id:kidani_a:20201209094609p:plain

 

テストが失敗しました。

kotlin.AssertionError: Expected <10>, actual <0>.とあるので、期待値と実際の結果が合っていないことがわかります。

f:id:kidani_a:20201209094825p:plain

 

mySum()関数をfun mySum(a: Int, b: Int): Int = a + bと修正して、再度テストを実行すると、今度はグリーンのチェックマークが表示されます。テストが通過しました。

f:id:kidani_a:20201209095137p:plain

 

[ターミナルからテストを実行する]

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

 

[まとめ]

  • Kotlin/Nativeでテストを実装する場合は依存関係の追加は不要
  • 通常のKotlinと同様に、JUnit風のAPIでテストを実装できる
  • 実装中のコードは以下のリポジトリにまとめてある 

github.com