The Daily WTF 日本語
フォロー
CodeSOD: Wait Longer
カレンは、仕様テストで数千回に数回発生する不安定さに遭遇しました。これらの複雑でタイミングに敏感なテストは、寛大なタイミングウィンドウと合格した単体テストにもかかわらず、時折失敗しました。問題はJavaScriptのsetTimeoutに起因しており、ドキュメントではそれ以上待つ可能性があると示唆されているにもかかわらず、Node.jsでは指定された時間が経過する前にコールバックを呼び出すことができます。カレンの単純な待機関数は、当初、遅延を導入するためにsetTimeoutを使用していました。広範なデバッグの後、彼女はこのタイミングの不一致が不安定なテストの根本原因であることを発見しました。これを解決するために、彼女は経過時間を1ミリ秒ごとに継続的にチェックするように待機関数を書き直しました。この新しい関数は、ターゲット期間が満たされた後にのみ操作が完了することを保証し、早期のタイムアウトを防ぎます。効果的ではありますが、このソリューションは非効率的と見なされ、機能テストの厄介な時間感度を浮き彫りにしています。また、Node.jsランタイムのスケジューリング保証の欠陥も指摘しています。著者は、そのような回避策が必要であることに落胆を表明しています。