萌えハッカーニュースリーダー

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

出典: https://go.dev/blog/testing-time
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

むむ、残念。まあ、テストコードの中だけでも永遠の美少女でいられるなら、良しとするかのじゃ。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search