Go1.25新機能 testing/synctest で高速&確実な並列テストを実現する方法
https://gocon.jp/2025/talks/958977/
https://zenn.dev/canary_techblog/articles/ec8a96b4541685
idea.icon bubble と durably blocked が synctest を理解する上での重要なコンセプト
v1.24 で testing/synctest パッケージが導入された経緯
非同期なテストは難しく、時間がかかる(time.Sleep) or Flaky test になりやすい
そのため、処理を待つ時間は無駄なので短くしたい
これを実現するのが testing/synctest の Test 関数
この関数内では、
渡ってきた関数を f を bubble 内で実行する
全てのゴルーチンがブロックされ、タイマーがスケジュールされていないなら、panic を起こす
bubble 内では
初期時間は UTC 2000-01-01 で設定されている(fake clock)
すべてのゴルーチンが durably block になったら、bubble 内の時間が進む
time.Sleep や チャネル の送受信などはゴルーチンを durably block する
bubble 外から操作すると panic
また、非同期処理が完了したことを担保しつつ、チェックを実行する必要がある
これを実現するのが、testing/synctest の Wait 関数
詳細
現在の bubble 内の現在の ゴルーチン 以外のすべてのゴルーチンが durably block されるまで block する
warning.icon ゴルーチンの終了を待つわけではない
bubble の外や同じ bubble 内の 2 つのゴルーチンが同時に Wait は呼べない(panic)
v1.24 からの変更点
Run から Test へ(引数で *testing.T を受け取れるように)
bubble のルートゴルーチンが終了したら時刻の進行を停止するように
スタックトレース の改善
参考
https://pkg.go.dev/testing/synctest
https://go.dev/blog/synctest
https://future-architect.github.io/articles/20250805a/
#Go #Go_Conference_2025