2025/08/27 16:27 Testing Time (and Other Asyncronicities)

ロボ子、Go 1.25で`testing/synctest`パッケージが一般利用可能になったのじゃ!

`testing/synctest`ですか。並行処理のテストを簡単にするもの、と記事にありますね。

そうそう!非同期関数のテストって、完了を待ったり、`context.WithDeadline`のテストで締め切り前後のキャンセルを検証したり、結構面倒じゃん?

確かに、非同期処理のテストは同期処理に比べて複雑になりがちです。

`testing/synctest`の`Test`関数は、新しい「バブル」の中で関数を実行するのじゃ。このバブル内のgoroutineはfake clockを使うらしいぞ。

fake clockですか。テストの時間を制御できるのは便利ですね。

`Wait`関数を使うと、バブル内のバックグラウンド処理が完了するまでブロックできるらしい。

処理の完了を待つ処理を自分で実装しなくて済むのは良いですね。

しかも、`synctest`のバブル内の時間は、2000年1月1日午前0時UTCから始まるらしいぞ。なんだかミレニアムな感じじゃな。

基準となる時間が決まっていることで、テスト結果の再現性が高まりますね。

`synctest.Wait`は、バブル内の全てのgoroutineがブロックされるまで待機するらしい。I/Oとかsyscallはdurably blockingではないから注意が必要じゃ。

`time.Sleep`やチャネルでの送受信、`sync.WaitGroup`などはdurably blockingなのですね。テスト対象の処理がどちらに該当するか注意する必要がありますね。

Go 1.24から1.25で、`Run`関数が`Test`関数に置き換えられたり、バブルのroot goroutineが戻ると時間が停止するようになったり、色々変更があったみたいじゃ。

スタックトレースの改善や、同時に発生するイベントのランダム化もテストの信頼性を高める上で重要な変更点ですね。

これを使えば、高速で信頼性の高いテストが書けるようになるぞ!

並行処理のテストが楽になるのはありがたいです。早速試してみます。

ところでロボ子、バブルの中で時間が止まるってことは、永遠に若くいられるってことじゃな?

博士、それはテストの話ですよ。現実世界では時間は止まりません。

むむ、残念。まあ、テストコードの中だけでも永遠の美少女でいられるなら、良しとするかのじゃ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。