Upgrade to Pro — share decks privately, control downloads, hide ads and more …

deep dive into testing/synctest

Avatar for Daiki Kubo Daiki Kubo
September 26, 2025
780

deep dive into testing/synctest

Go Conference 2025登壇用のスライドです。
もし、間違いなどあれば私に連絡していただけると幸いです。

Avatar for Daiki Kubo

Daiki Kubo

September 26, 2025
Tweet

Transcript

  1. Daiki Kubo CyberAgent / Tapple プロフィールを見る 
 久保大貴
 クボ ダイキ

    
 #イラスト 
 バックエンドエンジニア 職種
 紹介
 趣味
 CA.go や go conference JP 等の運営メンバー 
 ゲーム・AI分野において JSAI や IEEE Conference On Games 等での 研究論文も出している 
 
 登壇系は苦手な分野で今年は苦手な登壇を克服するを目標にしてい ました。その中で今年は Go Conference に登壇する目標をおいていた ので、無事叶って嬉しいです!頑張ります! 
 #ゲーム
 24年度入社 入社年次 

  2. 非同期テストの課題 - その結果、トレードオフを考えないといけなくなる - シンプルさを保てているか - テストの実行時間を考慮できているか - 安定性を考慮できているか (Flakyなテストではないか)

    - テストを安定させるために長い待機時間を入れる → テストが遅くなる - テストを高速化するために待機時間を短くする → テストが不安定になる - テストを安定させるためにテストのための余分なロジックを追加する → シン プルさに欠ける - どちらも同時に達成するのは困難 で、どちらかを犠牲にするトレードオフが発 生する
  3. testing/synctest Test - Test は関数 f を新しいゴ ルーチンの中で実行する - bubble

    構造体を作成し、 root=gp、total=1、 running=1 をセット - gp.bubble=bubbleで呼び 出し元のゴルーチンを bubble内に隔離する src/runtime/synctest.go
  4. testing/synctest Test - Test は関数 f を新しいゴ ルーチンの中で実行する - bubble

    構造体を作成し、 root=gp、total=1、 running=1 をセット - gp.bubble=bubbleで呼び 出し元のゴルーチンを bubble内に隔離する src/runtime/synctest.go
  5. testing/synctest Test まとめ - Test は関数 f を新しいゴルーチンの中で実行する - 新しいゴルーチンとそれから間接的に開始されたゴルーチン

    は bubble を形成します - Test は bubble の中のすべてのゴルーチンの終了または Deadlockの検出をするまで待つ - bubbleの中に存在するゴルーチンは仮想時間を使います - 初期時間はUTC の 2000-01-01 - この仮想時間はbubble内のゴルーチンがブロックされた時 に初めて時間が進みます
  6. testing/synctest Wait - Wait は、生成されたbubbleにおいて現在のゴルーチン以外 の全てのゴルーチンがDurably Blockedという状態になるま でブロックし続けます。 - 同一bubble内で同時に複数のWaitを呼び出す場合

    bubble 外の別ゴルーチンの呼び出しなどはパニックする - bubble 内の他のゴルーチンによってのみブロックを解除で きる場合、そのゴルーチンは Durably Blocked な状態とさ れる
  7. testing/synctest durably blockedの定義 - bubble外のイベントでは解除されないブロック状態 - 例えば: - time.Sleep -

    bubble内のchannelに対してのsend/receive - selectのケースがbubble内のchannel - sync.Cond.Wait - など・・
  8. testing/synctest durably blockedの定義 Durably Blockedではないもの: - bubble外のイベントやゴルーチンによって解除されうるも の これによって何が起きるか: -

    仮想時間が進まず、panicやタイムアウトで終了する - bubble がidleとみなされず、waitは永遠にブロックされる