Deep Dive Into testing/synctest

Room 1 13:30 - 13:50

テスト中に time.Sleep を使って数秒待った経験やそれによりテストが不安定になったり悩まされたことはありませんか? 例えば、「数秒後にキャッシュが期限切れになるか確認したい」といったテストでは、sleep を使うことでCIの実行時間が増えたり、flaky(不安定)になったりする原因になります。 Go 1.24 で実験的に導入された testing/synctest パッケージは、こうした並行処理+時間依存のテストを高速かつ安定して書けるようにするものです。また、Go 1.25のリリースノートでは testing/synctest パッケージは standard library として提供される予定で今後開発者間でも頻繁に使われるであろうものです。 このセッションでは、以下を中心に紹介・解説します: 1: synctest.Run による「バブル(Bubble)」とは何か? 2: 合成時間(synthetic time)の進み方と time.Sleep との連携 3: synctest.Run と synctest.Wait の使いどころ 4: durably blocked とは? 5: synctestの制約 また、具体例を通して、goroutineの同期と合成時間の制御周りを深掘りします。 そして、CI等で発生しやすい flaky テストの再現例と、synctest によってどれほど安定化するかのベンチマーク結果もご紹介したいと思います。