前言¶
行覆盖率能告诉你「哪些行被执行过」,却很难说明断言是否真的抓住了行为变化。变异测试通过在源码里注入小改动、再跑测试套件,看有多少变异体被测试「杀死」——存活下来的变异体往往指向测试缺口或等价变异,需要人工甄别。
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