分析 Sui Move 测试覆盖率,识别未测试代码,补充缺失测试,执行安全审计,并提供 Python 工具解析覆盖率输出和生成报告。
Sui 覆盖技能,分析并自动改进Sui 移动测试范围,并进行安全分析
功能概述
Sui 覆盖技能,分析并自动改进Sui 移动测试范围,并进行安全分析是一项面向实际任务的技能,主要用于GitHub: https://github.com/EasonC13-agent/sui-willing/tree/main/sui-coverage.Prerequisites.Inst。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
核心要点
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
- 实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
使用与执行
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
结果检查与注意事项
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
Sui 覆盖率技能(Sui Coverage Skill)
分析并自动提升 Sui Move 的测试覆盖率,同时集成安全分析能力。
GitHub: https://github.com/EasonC13-agent/sui-skills/tree/main/sui-coverage
前提条件
安装 Sui CLI
# macOS(推荐) brew install sui # 其他平台:参见官方文档 # https://docs.sui.io/guides/developer/getting-started/sui-install
验证安装:
sui --version
快速参考
# 工具所在路径(请根据你的技能安装路径调整) SKILL_DIR=/skills/sui-coverage # 完整工作流 cd /path/to/move/package sui move test --coverage --trace python3 $SKILL_DIR/analyze_source.py -m -o coverage.md
工作流:自动提升测试覆盖率
步骤 1:运行覆盖率分析
cdsui move test --coverage --trace python3 $SKILL_DIR/analyze_source.py -m -o coverage.md
步骤 2:阅读覆盖率报告
阅读生成的 coverage.md 文件,识别以下问题:
- 🔴 未调用的函数 —— 从未被执行的函数
- 🔴 未覆盖的断言 ——
assert!()的失败路径未被测试 - 🔴 未覆盖的分支 ——
if/else分支中未被执行的路径
步骤 3:编写缺失的测试
针对每一项未覆盖内容,编写对应测试:
A. 未调用的函数
#[test] fun test_() { // 初始化 let mut ctx = tx_context::dummy(); // 调用该未覆盖函数 (...); // 断言预期行为 }
B. 断言失败路径(expect_failure)
#[test] #[expected_failure(abort_code =)] fun test_ _fails_when_ () { let mut ctx = tx_context::dummy(); // 构造触发断言失败的状态 (); }
C. 分支覆盖率(if/else)
#[test] fun test__when_ () { ... } #[test] fun test_ _when_ () { ... }
步骤 4:验证覆盖率是否提升
sui move test --coverage --trace python3 $SKILL_DIR/analyze_source.py -m
工具
1. analyze_source.py(主工具)
python3 $SKILL_DIR/analyze_source.py --module[options] 选项: -m, --module 模块名(必需) -p, --path 包路径(默认:.) -o, --output 输出文件(例如:coverage.md) --json 输出 JSON 格式 --markdown 输出 Markdown 到标准输出
2. analyze.py(LCOV 统计分析)
sui move coverage lcov python3 $SKILL_DIR/analyze.py lcov.info -f "" -s sources/ 选项: -f, --filter 按路径模式过滤 -s, --source-dir 提供上下文的源码目录 -i, --issues-only 仅显示存在问题的文件 -j, --json 输出 JSON 格式
3. parse_bytecode.py(底层字节码解析)
sui move coverage bytecode --module| python3 $SKILL_DIR/parse_bytecode.py
常见测试模式
测试断言失败路径
// 源码:
public fun withdraw(balance: &mut u64, amount: u64) {
assert!(*balance >= amount, EInsufficientBalance); // ← 此失败路径
*balance = *balance - amount;
}
// 测试该失败路径:
#[test]
#[expected_failure(abort_code = EInsufficientBalance)]
fun test_withdraw_insufficient_balance() {
let mut balance = 50;
withdraw(&mut balance, 100); // 应失败:50 < 100
}
测试所有分支路径
// 源码:
public fun classify(value: u64): u8 {
if (value == 0) {
0
} else if (value < 100) {
1
} else {
2
}
}
// 所有分支的测试:
#[test]
fun test_classify_zero() {
assert!(classify(0) == 0, 0);
}
#[test]
fun test_classify_small() {
assert!(classify(50) == 1, 0);
}
#[test]
fun test_classify_large() {
assert!(classify(100) == 2, 0);
}
测试对象生命周期
#[test]
fun test_full_lifecycle() {
let mut ctx = tx_context::dummy();
// 创建
let obj = create(&mut ctx);
assert!(get_value(&obj) == 0, 0);
// 修改
increment(&mut obj);
assert!(get_value(&obj) == 1, 0);
// 销毁
destroy(obj);
}
错误码参考
编写 #[expected_failure] 测试时,请使用错误常量名称:
// 若模块中定义了:
const EInvalidInput: u64 = 1;
const ENotAuthorized: u64 = 2;
// 在测试中使用:
#[expected_failure(abort_code = EInvalidInput)]
fun test_invalid_input() { ... }
// 或使用模块限定名称:
#[expected_failure(abort_code = my_module::EInvalidInput)]
fun test_invalid_input() { ... }
示例:完整的自动覆盖率会话
# 1. 分析当前覆盖率 cd /path/to/my_package sui move test --coverage --trace python3 $SKILL_DIR/analyze_source.py -m my_module -o coverage.md # 2. 查看缺失项 cat coverage.md # 输出显示: # - decrement() 未被调用 # - assert!(value > 0, EValueZero) 的失败路径未被测试 # 3. 在 sources/my_module.move 或 tests/my_module_tests.move 中添加测试 # (编写缺失的测试) # 4. 验证覆盖率是否提升 sui move test --coverage --trace python3 $SKILL_DIR/analyze_source.py -m my_module # 5. 重复上述步骤直至达到 100% 覆盖率
与 Agent 工作流集成
当被要求提升测试覆盖率时,请执行以下步骤:
- 运行分析 —— 获取当前覆盖率状态
- 阅读源码 —— 理解模块逻辑
- 识别缺口 —— 列出未覆盖的函数/分支/断言
- 安全审查 —— 在编写测试过程中同步分析潜在漏洞
- 编写测试 —— 针对每个缺口及安全边界场景编写测试
- 报告发现 —— 记录所发现的安全问题
- 验证结果 —— 重新运行覆盖率检查以确认改进效果
请始终提交测试改进:
git add sources/ tests/ git commit -m "Improve test coverage for"
测试过程中的安全分析
编写测试 = 理解合约逻辑 = 发现漏洞
在编写测试时,请主动关注以下几类问题:
1. 访问控制
需提出的问题: - 哪些主体可调用该函数? - 是否应加入所有者/管理员校验? - 未授权用户能否篡改状态? 高危信号: - 修改关键状态的 public 函数缺乏访问控制 - 缺失 capability/witness 模式
2. 整数溢出/下溢
需提出的问题:
- 在 u64::MAX 边界处会发生什么?
- 对 0 执行减法操作时会发生什么?
- 算术运算是否经过校验?
测试模式:
#[test]
fun test_overflow_boundary() {
// 使用最大值进行测试
}
3. 状态篡改
需提出的问题: - 状态是否可能处于不一致状态? - 所有状态变更是否具备原子性? - 局部失败是否会破坏数据完整性? 高危信号: - 多次状态变更未提供回滚机制 - 共享对象未采用恰当的锁机制
4. 经济类攻击
需提出的问题: - 是否存在超额提取价值的可能? - 是否存在可被利用的舍入误差? - 是否存在闪电贷攻击向量? 高危信号: - 价格计算未启用滑点保护 - 对用户可控数据执行无界循环
5. 拒绝服务(DoS)
需提出的问题: - 是否存在阻塞合法用户的可能? - 是否存在无界操作? - 存储空间是否可被恶意填满? 高危信号: - 导致资源无界增长的向量 - 对外部输入数据执行循环操作
安全报告模板
分析模块时,请生成如下格式的安全报告:
## 安全分析:### 概要 - 风险等级:[低/中/高/严重] - 发现问题数:X ### 发现项 #### [严重程度] 问题标题 - **位置:** 第 XX 行 - **描述:** 问题具体表现 - **影响:** 可能导致的后果 - **建议修复方式:** 推荐的修复方案 ### 已测试的边界场景 - [ ] 最大值处的溢出测试 - [ ] 零值处的下溢测试 - [ ] 未授权访问尝试 - [ ] 空值/空输入测试 - [ ] 重入场景测试
示例:具备安全意识的测试
// 安全考量:测试非所有者无法执行提现操作
#[test]
#[expected_failure(abort_code = ENotOwner)]
fun test_unauthorized_withdraw() {
// 初始化:创建由 ALICE 拥有的金库
// 执行:BOB 尝试提现
// 预期:应因 ENotOwner 报错失败
}
// 安全考量:测试溢出防护机制
#[test]
fun test_deposit_overflow_protection() {
// 向接近 u64::MAX 的余额中充值
// 验证未发生溢出
}
// 安全考量:测试经济不变量
#[test]
fun test_total_supply_invariant() {
// 在任意操作后验证:
// sum(all_balances) == total_supply
}
融合安全分析的完整工作流
# 1. 执行覆盖率分析 sui move test --coverage --trace python3 $SKILL_DIR/analyze_source.py -m-o coverage.md # 2. 编写测试的同时记录安全发现 # 在 coverage.md 同级目录下创建 SECURITY.md # 3. 测试通过后汇总输出: # - 覆盖率:X% → 100% # - 发现安全问题数:N # - 建议措施:...
相关技能
本技能属于 Sui 开发技能套件的一部分:
| 技能 | 说明 |
|---|---|
| sui-decompile | 获取并读取链上合约源码 |
| sui-move | 编写并部署 Move 智能合约 |
| sui-coverage | 结合安全分析的测试覆盖率评估 |
| sui-agent-wallet | 构建与测试 DApp 前端 |
典型工作流:
sui-decompile → sui-move → sui-coverage → sui-agent-wallet
研究 编写 测试与审计 构建 DApp
全部技能地址:https://github.com/EasonC13-agent/sui-skills
热门AI工具
相关专题
Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。
0
2026.10.28
Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。
0
2026.10.28
Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。
0
2026.10.28
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.6万人学习
共6课时 | 54.7万人学习
最新文章