mutation-testing について
Mutation Testingは、mewtとmutonの利用者を、キャンペーン設定、生存ミュータントの調査、結果報告の各ワークフローへ案内するスキルです。変異結果の解釈方法と、コードの文脈に基づく調査の優先順位付けも示します。
主な機能
- 01変異テストのワークフローへ振り分け
- 02キャンペーンの設定と最適化
- 03検出・生存ミュータントの解釈
- 04等価ミュータントと重大度の評価
- 05正式な結果報告の支援
活用シーン
- 01変異テストの範囲設定や実行時間の短縮
- 02未検出ミュータントから潜在的な不具合を調査
- 03構成化された変異分析レポートの作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trailofbits/ skills --skill mutation-testingインストール後、Claude Code で/mutation-testingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlassets/trail-of-bits-mark.svgreferences/blockchain-patterns.mdequivalent-mutants.mdinput-formats.mdoptimization-strategies.mdreport-template.mdseverity-classification.mdworkflows/analyzing-results.mdbug-hunter.mdconfiguration.md詳細
Mutation Testing(mewt/muton)
適切なミューテーションテストのワークフローに案内し、そのワークフローに必要なリファレンスを読み込みます。
注:muton と mewt のインターフェースは同一です。例では
mewtを使用しています。muton のプロジェクトでは、mutonとそのファイル名(muton.toml、muton.sqlite)に置き換えてください。
コマンドラインの動作については、mewt --help と mewt <subcommand> --help が正確な情報源です。以下の例は mewt 4.x API に基づいています。フラグの意味がわからない場合やコマンドが失敗する場合は、--help を実行してください。
使用する場合
次のような場合にこのスキルを使用します。
- ユーザーが「mewt」「muton」または「mutation testing」に言及している
- ミューテーションテストのキャンペーンを設定、範囲指定、または高速化したい
- ミューテーションの結果(生き残った/検出されなかったミュータント、等価ミュータント、キル率)を分析したい
- ミューテーションの結果を使ってソースコードのバグを見つけたい
使用しない場合
ユーザーがミューテーションテストに触れずに、テストや行カバレッジについて尋ねている場合は、このスキルを使用しないでください。
ルーティング
ワークフローを選び、そのワークフローと、一覧に記載されたリファレンスを読み込みます。ワークフローとリファレンスが互いを読み込むことはありません。その判断はここで行います。
キャンペーンの設定、範囲指定、または高速化 → workflows/configuration.md → キャンペーンの見積もりが長く、短縮が必要な場合、またはユーザーが高速化を求めている場合は、references/optimization-strategies.md も読み込みます。
キャンペーンが完了し、未テストのコードからバグを探す → workflows/bug-hunter.md
結果を正式な分析レポートにまとめる → workflows/analyzing-results.md と、以下を読み込みます。
- references/equivalent-mutants.md — 等価性のカタログと検証手順
- references/severity-classification.md — 重大度レベルの基準
- references/report-template.md — レポートの構成
- references/blockchain-patterns.md — Solidity、Move、FunC/Tolk、Cairo、または Solana Rust の対象に限り読み込みます
- references/input-formats.md — 結果が mewt または muton からのものでない場合に読み込みます。外部ツールの出力は、形式が自己記述的でない場合があります。このリファレンスでは slither-mutate、mull、dextool-mutate の解析に使う手掛かりを説明します
その他の場合 → mewt --help または mewt <subcommand> --help を実行してから、直接支援します。
基本コマンド
# Set up and run
mewt init # Create config and database
mewt mutate [paths] # Generate mutants without testing them
mewt run [paths] # Generate mutants and run the campaign
# Read results
mewt status # Overview with per-file breakdown
mewt results # Uncaught mutants (default view)
mewt results --all # Every outcome, not just uncaught
mewt results --format json # json | sarif | ids | table
# Narrow down (these filters work on both `results` and `print mutants`)
mewt results --target 'src/auth/**' # Quote globs so the shell does not expand them
mewt results --severity high,medium
mewt results --mutation-types ER,CR
mewt results --status Uncaught # Uncaught | TestFail | Skipped | Timeout
mewt results --line 42
# Investigate and re-test
mewt print mutant --id [id] # View the mutated code
mewt test --ids [ids] # Re-test specific mutants
mewt test --ids-file uncaught_ids.txt # Re-test IDs from a file, or '-' for stdin
# Inspect configuration
mewt print config # Effective config
mewt print targets # Files actually mutated
mewt print mutations --language [lang] # Mutations and severities for a language
言語ラベルには、mewt 4.x の正式な family または family/dialect の値を使用します。例:rust、javascript/ts、move/sui、move/iota。
結果の意味
- Caught/TestFail:テストがミューテーションを検出しました(良好)
- Uncaught:テストが変更を検出できませんでした。コードを調べて、テストの不足か等価ミューテーションかを見分けてください。
- Timeout:テストに時間がかかりすぎました。結果は確定できず、カバレッジの証拠にはなりません
- Skipped:同じ行にある、より重大度の高いミュータントが検出されなかったため、より重大度の低いミュータントがスキップされました
ミューテーションの種類を解釈する
mewt print mutations --language [lang] は、ある言語のすべてのミューテーションスラッグ、説明、重大度を一覧表示するもので、これが正式な情報源です。演算子のセットはリリースごとに増えていきます。ただし、この出力からは、生き残ったミュータントが何を意味するのかは分かりません。優先順位を決めるには、その解釈が必要です。
| 重大度 | 代表的なスラッグ | 検出されなかったミュータントが示すこと |
|---|---|---|
| 高 | ER(エラーの置換) | テストは注入されたエラーを許容しています。そのパスが実行されるか、エラー処理によって変更が隠されていないか、アサーションが結果を検証しているかを調べてください。 |
| 中 | CR(コメントの置換) | 文を削除してもテストは失敗しません。その文の効果が重要か、アサーションで確認されているかを確認してください。 |
| 中 | IF/IT(If False/True)、NR(否定の削除) | テストは変更された条件を区別できていません。両方の定数置換が生き残る場合、その条件が実行されていないか、分岐の結果に対するアサーションが弱い可能性があります。 |
| 低 | 演算子の入れ替え(AOS、COS、LOS、BOS、シフト/代入のバリエーション)、BL、AS、LC、WF | 境界値の入力、算術演算のアサーション、意味的な等価性を確認してください。ミューテーションの結果だけでは、コードが実行されたかどうかは判断できません。 |
重大度はリスクではなく、ミューテーションの順位を示します。手数料の計算における重大度の低いミュータントが生き残るほうが、ログ出力における重大度の高いミュータントが生き残るよりも重要です。変更されたコードの働きを考慮してください。--severity で絞り込むと、優先順位に沿って結果を確認できます。