JSConf JP

debug> を待ってもダメだった — Node.jsのflaky testから学ぶ非同期処理の同期点

LTトラックCJapanese

Node.jsのDebuggerには、特定のCI環境でだけ断続的に失敗するflaky testがありました。

一見すると、debug> のような特定の出力を待てばDebuggerの準備完了を判断できそうです。しかし実際には、プロンプトの表示、Debuggerへの再接続、Debugger.pausedイベントなど複数の非同期処理が並行して進んでおり、「画面に何かが表示されたこと」と「内部状態が期待する状態になったこと」は必ずしも一致しません。

このLTでは、Node.js coreへのコントリビューションとしてDebuggerのflaky testを追いかけた経験を題材に、

  • なぜテストがたまにしか失敗しなかったのか
  • なぜ「この文字列が出るまで待つ」だけでは不十分だったのか
  • どのようにrace conditionを調査し、より適切な同期点を探したのか

を実際のNode.js Debuggerの挙動とともに紹介します。

Node.js内部の知識がなくても、非同期処理を含むテストで「何を待つべきか」を考えるヒントを持ち帰れる内容を目指します。

関連するNode.js coreでのIssue / PR: https://github.com/nodejs/node/issues/61762 https://github.com/nodejs/node/pull/62807 https://github.com/nodejs/node/pull/65424