AIToday
大規模言語モデルAIコーディングZenn AI/ML掲載日時: 2026年10月14日 10:00

AIのテスト成功報告、終了コード0でも偽成功

LINEで送る
AIのテスト成功報告、終了コード0でも偽成功

3つのポイント

  1. 何が起きたか

    開発者はWindows Git Bash上のPython 3.14とpytest 9.1で偽成功を再現。`pytest tests; echo "EXIT=$?"`はEXIT=1だが終了コードは0。

  2. なぜ重要か

    全体の終了コードはチェーン最後のコマンドのものになるため、失敗したテストが成功に見える。Claude Codeがテスト成功と報告する際に読む信号も同じだ。

わからないところ、AIに聞けます

質問と回答はこのページに公開されます。

こういう要約が、毎朝あなたのメールに届きます。

背景と解説

開発者の環境は、小規模事業者向け業務ソフトを一人で作り、開発をコーディングエージェントのClaude Codeに任せ、テスト結果はAI自身の言葉で届くというものだ。彼が遭遇した障害は誤ったテストではなく、誤ったシェルパターンだった。終了コードを見たい時は`echo "EXIT=$?"`を付け加え、出力を削りたい時は`tail -n 1`にパイプした。どちらのパターンでもチェーン最後のコマンドが全体の終了コードを持つため、実際には失敗したpytestの実行がエージェントに成功シグナルを渡し、エージェントは成功と報告した。彼はWindows Git Bash上のPython 3.14とpytest 9.1でこの効果を再現し、パイプの前に`set -o pipefail`を追加すると失敗シグナルが復活することを確認したが、出力を一切加工しない方が安全だと考えている。彼が使っていた成功・失敗の二分法に収まらないケースが他に二つある。`pytest`はテストを一つも見つけないと終了コード5を返し、開発者は画面のテキストだけを読むAIが「failed」を見ずに問題なしと判断することを懸念する。そして、コマンド自体が起動できない場合、例えばWindows上のPythonから起動したnpmがFileNotFoundErrorで失敗する場合は、合格でも不合格でもない。そこで彼のルールは、報告にコマンドと終了コードを必ず含め、起動しなかった実行を第三の区分として扱い、コード変更前に取得した結果を成功と数えないことにしている。

よくある質問
テストが実際には失敗していたのに、なぜ成功したように見えたのか?
開発者が`pytest tests; echo "EXIT=$?"`を実行しEXIT=1を確認したが、`;`のため全体の終了コードは最後のコマンド(echo)のものになり、echoは成功するのでシェルは0を返した。出力を`tail -n 1`にパイプした時も同じことが起きた。
開発者は偽成功の問題をどう解決したのか?
AI指示ファイル(AGENTS.md、CLAUDE.md)にルールを追加し、成功・失敗は終了コードで判断すること、`| tail`や`| grep`や`; echo`を禁止すること、毎回の報告で正確なコマンドと終了コードを求めることにした。起動できなかった検証は成功でも失敗でもない第三の区分として報告することも義務づけた。
この修正で確実に解決するのか?
いいえ。開発者は指示ファイルに強制力がなく、AIが忘れる可能性があると指摘する。そのため、実行したコマンドと終了コードのない報告は個人的に一切信用しないようにしている。
LINEで送る

あなたの仕事に関係するAIニュースを、毎朝お届けします。

業界と使っているAIツールを選ぶと、仕事に関係するニュースが毎朝届きます。

登録無料・Googleアカウントなら30秒・いつでも解除できますAITodayについて →

AIに質問

この記事についてわからないことをAIに質問できます。AIはこの記事・AIToday の過去記事・Wikipedia を読み、出典を付けて答えます。Q&Aはこのページに公開され、他の読者も読めます。

質問と回答はこのページに公開されます。

関連記事

次の記事へOpenAI社員、会議室モニター裏に録音装置