mehvetero/move-test-gen

GitHub: mehvetero/move-test-gen

为 Sui Move 智能合约自动生成边缘测试用例并配备覆盖率检查、变异测试和安全 lint 的质量保障工具。

Stars: 3 | Forks: 0

# move-test-gen ![gate-selftest](https://static.pigsec.cn/wp-content/uploads/repos/cas/ba/ba9fef94f96b48251ff2b7dc93c742292959555c23bcb4e8d416bb6060df3fb2.svg) 一个用于为 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区块链, 代码覆盖率, 变异测试, 智能体技能, 智能合约审计, 自动化测试生成