Kotlinの非同期処理(コルーチン)のテスト方法|初心者でもわかるコルーチンテスト入門
生徒
「Kotlinのコルーチンって非同期で動くって聞いたんですが、テストってどうするんですか?」
先生
「いい質問ですね。非同期処理はテストが難しそうに感じるかもしれませんが、実はちゃんとした仕組みを使えば簡単にテストできますよ。」
生徒
「えっ?どういう仕組みなんですか?」
先生
「KotlinにはrunTestというテスト専用の関数があって、コルーチンのテストがしやすくなっているんです。さっそく基本の書き方から見ていきましょう!」
1. コルーチンとは?Kotlinの非同期処理の基本
まず、非同期処理(ひどうきしょり)というのは、処理を待たずに次の作業を進める仕組みのことです。Kotlinでは、これを実現するためにコルーチン(coroutine)という機能があります。
たとえば、ネットからデータを取ってくるときに、結果を待っている間に別の処理を並行して動かすことができます。
2. 非同期処理をテストするには?
通常のテストはすぐに結果が出る処理を対象にしていますが、コルーチンを使った関数は時間がかかることがあり、テストには特別な工夫が必要です。
そこで活躍するのが、kotlinx-coroutines-testというライブラリです。このライブラリを使うと、非同期の処理も同期的(順番通り)にテストできます。
3. Gradleの依存関係を追加しよう
まずは、テスト用のライブラリを使えるように、build.gradle.ktsに以下のコードを追加します。
dependencies {
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3")
testImplementation("org.junit.jupiter:junit-jupiter:5.9.3")
}
4. runTestを使った基本的な書き方
テスト関数の中でrunTestという関数を使うことで、コルーチンを簡単にテストすることができます。
例として、一定時間後に「完了」と表示するような関数をテストしてみましょう。
import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
suspend fun fetchData(): String {
delay(1000)
return "完了"
}
class CoroutineTest {
@Test
fun `非同期関数が正しく結果を返す`() = runTest {
val result = fetchData()
assertEquals("完了", result)
}
}
delayは1秒待つ関数ですが、runTestを使うことで実際には待たずにすぐテストできます。
5. 実行結果の例
上記のテストを実行すると、次のように「完了」という結果が正しく返っているかをチェックできます。
CoroutineTest > 非同期関数が正しく結果を返す() PASSED
6. テストの中で複数のコルーチンを使うには?
コルーチンの中でさらに別のコルーチンを呼び出すこともあります。そのような場合でも、runTestの中にまとめて書くことができます。
suspend fun loadUserData(): String {
delay(500)
return "ユーザーA"
}
@Test
fun `複数の非同期処理をまとめてテスト`() = runTest {
val name = loadUserData()
assertEquals("ユーザーA", name)
}
7. テストで使える仮想時間とは?
非同期処理の中には「○秒後に何かする」というようなタイミングが重要な処理もあります。
そんなときは、仮想時間(テスト用の時計)を使って、時間を進めるテストもできます。
たとえば次のように書くと、実際には時間を待たずに、時間経過をシミュレートできます。
import kotlinx.coroutines.test.advanceTimeBy
@Test
fun `仮想時間を使ってdelayの動作を確認`() = runTest {
var result = "未実行"
launch {
delay(1000)
result = "完了"
}
assertEquals("未実行", result)
advanceTimeBy(1000)
assertEquals("完了", result)
}
advanceTimeByを使うことで、仮想的に時間を進めてコルーチンの処理を確認できます。
8. Kotlin初心者でも安心のテスト構文
コルーチンは一見むずかしそうに感じるかもしれませんが、runTestやadvanceTimeByを使えば、Kotlin初心者でも扱いやすくなります。
非同期処理のテストは、プログラムが正しく動作するかを確認するうえでとても大切です。実際の時間を使わずにテストできるので、効率よく安全なアプリを作ることができます。
今回紹介した基本的なやり方を使えば、複雑な非同期処理のテストも怖くありません。