テック技報最新号へ →
AIコーディング

AI が書いたテストの「効き目」をミューテーションテストで測る(@mizchi/mutator)

AI はテストを大量に書けるが、通るだけで何も守っていないテストも混ざる。コードをわざと少し壊し(ミュータント)、テストが落ちるかを見て、検出できなかった箇所を AI に直させる。

@mizchi · 投稿 2026-10-27
#testing#mutation-testing#typescript#ci#品質

どんな時に使う?

  • エージェントにテストを書かせたが、カバレッジが高いのにバグを見逃している気がする
  • >= と > のような境界条件を本当に検査しているか知りたい
  • PR ごとに「テストが弱くなっていないか」を CI で止めたい

手順

bash
pnpm add -D @mizchi/mutator
pnpm exec mutator                         # 全体を一度走らせる
pnpm exec mutator --since main            # main からの差分だけ(HEAD も指定可)
pnpm exec mutator --scope <scope>         # 範囲を絞る
pnpm exec mutator --only <対象>           # 特定の対象だけ
pnpm exec mutator --since origin/main --fail-on-survived   # 生き残りがあれば exit 2(CI 用)
pnpm exec mutator --reporter agent        # text / html / json / agent
pnpm exec mutator accept                  # 等価ミュータント(壊しても意味が同じ)を承認して除外
  • 結果は「到達しない(not reached)」「壊れても値が変わらない(not infected)」「値は変わったがテストが落ちない(not detected)」に分かれる。直すべきは主に not detected
  • 結果は .mutator/snapshot.json と .mutator/report/ に残る。2回目以降は差分だけを回すので速い(作者のベンチでは StrykerJS 10 と比べ、差分実行は約1秒)
  • 例: isAdult の age >= 18 を > 18 に変えても落ちなければ、18歳ちょうどのテストが無い

エージェントとの回し方

  1. 実装とテストをエージェントに書かせる
  2. mutator --since main --reporter agent の出力をそのまま渡し「生き残ったミュータントを殺すテストを足して。実装は変えない」と頼む
  3. 等価ミュータントだと判断したものだけ人が見て mutator accept
  4. CI には --fail-on-survived を入れる

注意点

出典

X の元の投稿を開く