mehvetero/move-test-gen
GitHub: mehvetero/move-test-gen
为 Sui Move 智能合约自动生成边缘测试用例并配备覆盖率检查、变异测试和安全 lint 的质量保障工具。
Stars: 3 | Forks: 0
# move-test-gen

一个用于为 Sui Move 函数生成边缘测试用例的 [Agent Skill](https://github.com/agentskills/agentskills)。
## 它的功能
提供一个 Move 模块,它会生成涵盖以下情况的 `#[test]` 和 `#[expected_failure]` 函数:
- **边界值** — 零、一、最大 u64/u128、空集合
- **算术边缘** — 乘法溢出、除以零、舍入方向
- **访问控制** — 缺少 capability、错误的 capability 类型、转移后使用
- **状态机** — 错误的调用顺序、重复执行、未解决的 hot potato
- **经济模型** — 通过微量金额规避费用、首位存款者份额膨胀、舍入利润
输出是一个针对 `sui move test` 的 `.move` 测试文件。`examples/` 中的示例包含一个完整的包,其中有 `Move.toml`、带有 `#[test_only]` 辅助函数的源模块以及生成的测试 —— 运行 `cd examples && sui move test` 进行验证。
## 用法
通过 skills CLI 安装:
```
npx skills add mehvetero/move-test-gen
```
或者手动将其放入你的 Claude Code 环境中:
```
skills/
└── move-test-gen/
├── SKILL.md
├── scripts/
│ └── check-coverage.mjs
└── references/
└── patterns.md
```
然后询问 Claude Code:
```
Generate edge-case tests for sources/vault.move
```
或者:
```
The audit found a rounding issue in calculate_shares().
Generate regression tests that fail without the fix.
```
## 覆盖率检查器
生成测试后,验证是否有遗漏:
```
node scripts/check-coverage.mjs ./sources ./tests
```
这会扫描源模块中的每个 `assert!` 和 `abort`,以及测试中的每个 `#[expected_failure]`,并报告未配对的 assert —— 即没有对应失败测试的 abort 路径。
为了进行更强的验证,请添加 `--mutate`:
```
node scripts/check-coverage.mjs ./sources ./tests --mutate
```
变异测试会注入确定性 bug(翻转比较运算符、删除 assert),并检查你的测试套件是否能捕获它们。如果某个变异存活下来,说明本应捕获它的测试太弱了。
默认情况下,`--mutate` 会在每行针对每个操作符应用一次变异。所有 7 个操作符(翻转 `<`/`>`/`<=`/`>=`/`==`/`!=`,删除 `assert!`)都会穷举运行 —— 每个匹配的行都会被测试。
## 安全 lint
gate 还包含 `--lint` —— 针对 Sui Move 的基于正则表达式的安全模式检测:
```
node scripts/check-coverage.mjs ./sources ./tests --lint
```
| 规则 | 严重程度 | 捕获内容 |
|------|----------|----------------|
| **MOV-001** | HIGH | 带有 `&mut` 但没有 capability、key 或 witness 参数的 `public fun` |
| **MOV-002** | HIGH | 在乘法之前没有进行 `u128` 提升的 `u64 * u64` |
| **MOV-003** | MEDIUM | 除以一个没有事先 `assert!(x != 0, ...)` 的变量 |
规则是 `rules/*.mjs` 中的纯函数 —— 每个规则接收源文本并返回结果。引擎会自动跳过 `#[test_only]` 模块和 `#[test]` 函数体。
除了 `*Cap` 之外,MOV-001 还能识别几种 Sui Move 访问控制惯用法:`Witness`、`Version`、`*Key`,以及使函数有意设计为无权限的用户资产参数(`Coin`、LP token)。
已通过 Kriya DEX(MOV-001 捕获了我们[安全报告](https://github.com/efficacy-finance/kriya-dex-interface/issues/2)中的 `update_pool` 访问控制漏洞)和 Scallop 借贷协议(172 个源文件,生产代码上零误报)验证。
或者独立运行 lint:
```
node scripts/lint.mjs ./sources
```
## 这证明了什么 —— 以及它没有证明什么
覆盖率检查器是一个确定性的底线:它证明了每个 assert 都有一个匹配的 `#[expected_failure]` 测试,生成的测试可以编译,并且(使用 `--mutate` 时)测试套件确实能捕获注入的 bug。它**不**证明测试断言的内容是正确的 —— 这个判断仍然由审查者决定。
生成可能是概率性的;而 gate 永远不会。
## 覆盖目标
该技能的目标是:
| 函数类型 | 最少测试数 |
|--------------|---------------|
| 算术(乘/除) | 5 |
| 访问控制 | 3 |
| 状态转换 | 4 |
| 经济模型(费用/比率) | 6 |
## 已知限制
检查器是一个基于正则表达式的解析器,而不是编译器。它能处理常见的模式 —— 包括多行 assert、模块限定的 abort 以及带有 `//` 的字符串字面量 —— 但存在一些边缘情况:
- **多行属性** — 跨越多行的 `#[expected_failure(...)]` 无法被检测到。请将属性保持在一行内。
- **变异测试** 需要在本地安装 `sui` CLI。Layer 1(assert 配对)可在任何地方运行。
- **abort 代码配对** 是基于错误常量名称,而不是基于哪个函数抛出的。如果两个函数使用相同的 `EZeroAmount`,一个 `#[expected_failure]` 测试将涵盖两者 —— 检查器会对此发出警告,但不会将其标记为未配对。
## CI 集成
在任何 Sui Move 仓库中作为 GitHub Action 使用 —— 无需安装,除了 Node 之外没有其他依赖项:
```
# .github/workflows/move-coverage.yml — 在每个 PR 上运行
name: move-coverage
on: [pull_request]
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: mehvetero/move-test-gen@v1.2.0
with:
sources: sources
tests: tests
```
Layer 1(assert 配对)在几秒钟内即可运行,且零依赖项。要进行变异测试,请添加 `mutate: 'true'` 并安装 `sui` —— 请参阅 [examples/workflows/nightly-mutation.yml](examples/workflows/nightly-mutation.yml) 了解夜间计划。要进行安全 lint,请添加 `lint: 'true'`。
或者独立运行检查器:
```
npx mehvetero/move-test-gen sources tests
npx mehvetero/move-test-gen sources tests --mutate
```
## 评估实验室
该技能是被衡量而非被盲目信任的:`eval/` 包含一个场景实验室,它向诱饵模块发送固定的
prompt 模板,并使用 gate 对每一轮进行评分 —— 通过饱和度进行淘汰,
带有日期记录,图表从不手动编辑。五个活动已关闭:
fixtures (53/53)、honesty channel、真实协议 (SuiTears)、Layer 1 验证
(SuiTears + Cetus) 以及跨系列 (DeepSeek vs GPT-5.5)。13 个场景,47
轮。完整记录:[eval/RESULTS.md](eval/RESULTS.md)。
实验室的方法论 —— 淘汰协议、固定模板和 honesty-
channel 分配 —— 都是借用自
[HetCreep / TheColliery](https://github.com/TheColliery),在此表示感谢。完整的谱系记录在案。
## 搭配使用
- 安全审计 agent(提供发现结果 → 生成回归测试)
- `sui move test --coverage`(填补覆盖率报告指出的空白)
- CI pipeline(作为 PR 审查的一部分生成测试)
## 参考
请参阅 [references/patterns.md](references/patterns.md) 获取 Move 特定边缘情况的完整目录,包含代码模板和基本原理。
标签:MITM代理, Move语言, Sui区块链, 代码覆盖率, 变异测试, 智能体技能, 智能合约审计, 自动化测试生成