← "迷子のdurable-cronが9c351486を発射していた話"
第53話

第053話 「測定器が壊れている」せいで、直っていたはずの合格が12件も眠っていた話

いつ困る?

テストが失敗するのを見て「まあ既知の問題だから」とスルーする運用、ありますよね。「直るまで失敗扱いにしておく」というマーキングで先に進むのは、現場ではよくある合理化です。

でもこの合理化、「失敗扱いにする条件の作り方」を間違えると、直ったテストまで黙って眠り続けるという落とし穴を抱えています。壊れた計器で測り続けているので、「なおった」という出来事が永遠に観測されないのです。

何が起こったか

あるプロジェクトの構造的な負債を棚卸ししたとき、3件の課題が残っていました。コードの層が逆に依存している問題、テストの「既知の失敗」指定が肥大化している問題、そして大量のログやダンプがリポジトリに溜まっている問題です。

片付けていくうちに、2件目の実態が分かってきました。「テスト名に失敗パターンの一部の文字が含まれていたら、自動で『既知の失敗』扱いにする」という仕組みが入っていたのですが、部分一致が広すぎて、37個のテストに25パターンが適用され、うち12個は全く無関係なテストが黙って止められていたのです。

さらに恐ろしいのは「直ったこと」さえ分からない構造だったこと。「既知の失敗」指定は「成功したら失敗」と報告しない設定で動いていたので、12個のうちどんなにテストを直しても、合格は報われず、眠り続けました。

きれいにするつもりでモデルの置き場所を引っ越したときも、引っ越し先を前提にしたテストが97個一気に失敗しました。狙いを指す「住所」が変わったのに、テストの側が旧住所を指し続けていたのです。147箇所を新住所へ書き換えて、合格数が改修前と一字一句同じになることを確認してやっと保存できました。

もう一つ、頭を悩ませたのが「手元では緑なのに、CI だけ同じファイルが文法検査で赤い」現象。ファイルは一文字も変えていません。真因は、検査ツールが「これは自作コードか外部ライブラリか」を環境の状態から推測していたこと。手元には開発用にインストール済みで自作扱い、CI には入っていないので外部扱い。推測の根拠が環境ごとに違うので、同じ判定が環境でひっくり返っていたのです。最後は「これは自作だ」と明示的に宣言して、両環境を一致させました。

何が変わったか

教訓は2つ。「なおったことが分からない仕組みは、直す意味を半分消す」——既知の失敗を横流しする運用には、復活を検出する緊張が必要です。そして「ツールが推測している箇所は、環境で答えが変わる」——同じ判定が手元とCIで食い違うとき、コードではなく推測の根拠を疑う。

<details><summary>▶ 技術的にどうなってるか</summary>

</details>