Go1.25新機能 testing/synctest で高速&確実な並列テストを実現する方法
idea.icon bubble と durably blocked が synctest を理解する上での重要なコンセプト
v1.24 で testing/synctest パッケージが導入された経緯
非同期なテストは難しく、時間がかかる(time.Sleep) or Flaky test になりやすい そのため、処理を待つ時間は無駄なので短くしたい
これを実現するのが testing/synctest の Test 関数
この関数内では、
渡ってきた関数を f を bubble 内で実行する
全てのゴルーチンがブロックされ、タイマーがスケジュールされていないなら、panic を起こす
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 のルートゴルーチンが終了したら時刻の進行を停止するように
参考