前言¶
行覆蓋率能告訴你「哪些行被執行過」,卻很難說明斷言是否真的抓住了行爲變化。變異測試通過在源碼裏注入小改動、再跑測試套件,看有多少變異體被測試「殺死」——存活下來的變異體往往指向測試缺口或等價變異,需要人工甄別。
mewt 與 muton 是常用的變異測試工具,但戰役配置、範圍裁剪、超時調優和結果解讀步驟多、文檔分散。Trail of Bits 在 skills 倉庫裏把這套流程做成 mutation-testing Skill:按場景路由到配置、挖 bug、寫報告等工作流,並附帶命令與結果含義的參考說明。下面介紹它是什麼、能做什麼,以及如何安裝與典型用法。
這是什麼¶
mutation-testing 是 Trail of Bits Skills 中 Verification 類插件下的一個 Skill。官方描述爲:配置 mewt 或 muton 戰役、分析存活變異體、並針對測試薄弱處追查源碼問題。
Skill 聲明可用工具爲:Read、Write、Bash、Grep。它會根據你的意圖加載對應 workflow 與 reference,而不是一次性塞滿全部文檔。官方註明:muton 與 mewt 接口一致;下文示例以 mewt 爲準,使用 muton 時替換爲 muton 及 muton.toml、muton.sqlite 等文件名。命令行行爲以 mewt --help 與 mewt <subcommand> --help 爲準;示例反映 mewt 4.x API。
核心功能¶
場景路由¶
Skill 先判斷你要做哪類事,再加載列出的文檔(workflow 與 reference 不會自動互相加載):
| 場景 | 加載內容 |
|---|---|
| 搭建、限定範圍或加速戰役 | workflows/configuration.md;若預估耗時很長或明確要求加速,另加 references/optimization-strategies.md |
| 戰役結束,在未充分測試的代碼裏找 bug | workflows/bug-hunter.md |
| 把結果整理成正式分析報告 | workflows/analyzing-results.md,以及等價變異、嚴重度、報告模板等 reference;區塊鏈目標另加 blockchain-patterns.md;非 mewt/muton 產出的結果可參考 input-formats.md |
| 其他 | 以 mewt --help 爲準,直接協助 |
何時使用 / 不必使用¶
適合在對話裏提到 mewt、muton 或 mutation testing;需要配置、限定範圍或加速戰役;需要分析存活/未捕獲變異體、等價變異、擊殺率;或希望用變異結果在源碼裏找 bug。
不必使用當用戶只問測試或行覆蓋率、且完全沒有變異測試上下文時。
結果狀態含義¶
- Caught / TestFail:測試發現了變異(期望行爲)。
- Uncaught:測試未發現改動——需區分是測試缺口還是等價變異。
- Timeout:測試超時,結論不確定,不能當作覆蓋證據。
- Skipped:同一行上已有更嚴重變異體未捕獲時,較低嚴重度的變異可能被跳過。
嚴重度描述的是變異類型的優先級,不是業務風險;低嚴重度變異若落在計費等關鍵路徑,仍應優先人工審查。
安裝與啓用¶
mutation-testing 隨 trailofbits/skills 市場發佈,與具體編輯器/CLI 的安裝方式以官方倉庫爲準。
Claude Code
/plugin marketplace add trailofbits/skills
通過 /plugin menu 瀏覽並安裝對應插件。
Codex
codex plugin marketplace add trailofbits/skills
codex plugin list
codex plugin add <plugin-name>@trailofbits
本地開發時,在 skills 倉庫的父目錄執行:
/plugins marketplace add ./skills
安裝市場後,在插件列表中選擇 mutation-testing 所在插件(路徑:plugins/mutation-testing/)即可啓用 Skill。Cursor 側若通過兼容 Claude 插件市場的能力加載同一市場,步驟與上述市場添加方式一致;未在資料中單獨列出的客戶端差異不在此文展開。
典型用法¶
1. 初始化與跑戰役¶
先做初始化,再生成變異體或一次性跑完整戰役:
mewt init # 創建配置與數據庫
mewt mutate [paths] # 只生成變異體,不跑測試
mewt run [paths] # 生成變異體並執行戰役
2. 查看進度與結果¶
mewt status # 總覽及按文件拆分
mewt results # 默認:未捕獲的變異體
mewt results --all # 全部結果
mewt results --format json # json | sarif | ids | table
按路徑、嚴重度、變異類型、狀態或行號縮小範圍(results 與 print mutants 共用過濾語義):
mewt results --target 'src/auth/**' # glob 建議加引號,避免 shell 展開
mewt results --severity high,medium
mewt results --mutation-types ER,CR
mewt results --status Uncaught # Uncaught | TestFail | Skipped | Timeout
mewt results --line 42
3. 深入單條變異與複測¶
mewt print mutant --id [id] # 查看變異後代碼
mewt test --ids [ids] # 複測指定 ID
mewt test --ids-file uncaught_ids.txt # 從文件或 stdin('-')複測
4. 檢查配置與語言變異集¶
mewt print config # 當前生效配置
mewt print targets # 實際被變異的文件
mewt print mutations --language [lang] # 某語言的變異算子與嚴重度
語言標籤爲 mewt 4.x 的 canonical family 或 family/dialect,例如 rust、javascript/ts、move/sui、move/iota。
5. 結合 Skill 解讀未捕獲變異¶
mewt print mutations --language [lang] 是算子與嚴重度的權威列表。資料中給出的優先級示例如下(具體 slug 以工具輸出爲準):
| 嚴重度 | 代表 slug | 未捕獲時通常意味着什麼 |
|---|---|---|
| High | ER(Error Replacement) |
測試容忍了注入的錯誤;需看路徑是否執行、錯誤處理是否掩蓋變化、斷言是否檢查結果 |
| Medium | CR(Comment Replacement) |
刪掉語句測試仍通過;需判斷語句副作用是否被斷言觀察到 |
| Medium | IF/IT、NR |
分支或條件變化未被區分;雙分支常量替換都存活可能表示條件未執行或斷言偏弱 |
| Low | AOS、COS 等算子_shuffle、BL、AS 等 |
關注邊界輸入與算術斷言;單憑變異結果不能證明代碼是否執行 |
分析正式報告、等價變異目錄與驗證步驟、嚴重度分級、報告結構等,在啓用 Skill 並進入「分析報告」路由時會加載對應 reference。
適用場景與注意¶
適合:已在或計劃使用 mewt/muton 的團隊;需要在 AI 輔助下完成戰役配置、長時戰役優化、存活變異體 triage,或從變異結果反推測試與代碼問題;智能合約等場景可在 Skill 路由下加載區塊鏈相關 pattern 參考(Solidity、Move、FunC/Tolk、Cairo、Solana Rust 等)。
注意:
- 僅討論覆蓋率而不涉及變異測試時,不應依賴本 Skill 替代覆蓋率工具說明。
- 外部工具(如 slither-mutate、mull、dextool-mutate)的結果導入需參考
input-formats.md,格式可能與 mewt/muton 原生輸出不同。 - 超時條目不能當作「測到了」的證據;長戰役應結合 configuration 與 optimization-strategies 工作流做範圍與性能調優。
結尾¶
mutation-testing 把 mewt/muton 的配置、加速、結果分析與挖 bug 流程收斂成可路由的 Skill,降低變異測試這一進階主題的入門成本。官方 Skill 文檔:
https://github.com/trailofbits/skills/tree/main/plugins/mutation-testing/skills/mutation-testing
Skills 市場與安裝說明:
https://github.com/trailofbits/skills