名称: mvx_testing_handbook 描述: 关于mandos(场景)、rust-vm单元测试和链模拟器的指南。
MultiversX测试手册
本技能提供关于MultiversX测试三个层次的专家指导:RustVM单元测试、Mandos集成测试和链模拟。
1. RustVM单元测试
- 位置:合约文件中的
#[cfg(test)]模块或tests/目录。 - 速度:即时。
- 范围:内部逻辑、严格数学、私有函数。
- 模拟:使用
multiversx_sc_scenario::imports::*来模拟区块链环境(例如blockchain_mock.set_caller(addr))。
2. Mandos场景(.scen.json)
- 位置:
scenarios/目录。 - 要求:“如果是端点,则必须有Mandos测试。”
- 执行:
cargo test-gen生成场景的Rust包装器。cargo test运行它们。
- 关键概念:
step: setState:初始化账户和余额。step: scCall:执行端点。step: checkState:验证存储是否匹配预期值。
3. 链模拟器(mx-chain-simulator-go)
- 位置:独立的系统测试套件(通常是Go或Python)。
- 范围:与节点API的交互、复杂的跨分片重组、链下索引。
- 工具:使用
POST /simulator/generate-blocks来强制执行。
4. 覆盖策略
- 资金流入/流出:需要100%的Mandos覆盖。
- 视图函数:单元测试覆盖足够。
- 访问控制:明确的负向测试(预期错误4)用于未经授权的调用。
- 端点覆盖:每个
#[endpoint]必须有至少一个Mandos场景。 - 可支付端点:每个
#[payable]端点必须测试:正确的代币、错误的代币、零金额、未经授权的调用者。 - 角色控制端点:每个
#[only_owner]或#[only_role]必须有负向测试(未经授权的调用者→预期错误)。 - 状态转换:状态转换必须通过Mandos中的
checkState验证。
5. 测试质量评分标准
为每个类别评分,然后取平均值得到总体分数。
| 类别 | 0-2(差) | 3-5(部分) | 6-8(好) | 9-10(优秀) |
|---|---|---|---|---|
| 单元测试 | 无测试 | 部分函数已测试 | 核心逻辑已覆盖 | 所有函数 + 边缘情况 |
| Mandos覆盖 | 无场景 | 部分端点已覆盖 | 所有端点已覆盖 | 所有端点 + 错误路径 |
| 访问控制测试 | 无权限测试 | 仅所有者测试 | 所有角色已测试 | 所有角色 + 负向测试 |
| 资金流测试 | 无支付测试 | 仅快乐路径 | 所有支付端点 | 快乐 + 错误 + 边缘金额 |
| 链模拟器 | 不可用 | 设置存在,未运行 | 基本流程已测试 | 跨分片 + 重组测试 |
评分公式
- 起始分5("测试存在并通过"的基线)。
- 每个被评为好(6-8)的类别加1分。
- 每个被评为优秀(9-10)的类别加2分。
- 每个被评为差(0-2)的类别减1分。
- 如果链模拟器不可用减2分。
- 上限10分,下限1分。
6. 输出格式
测试质量报告
测试执行:
cargo test: [通过/失败/跳过计数]
Mandos场景: [通过/失败计数]
链模拟器: [可用: 是/否] [可用时的通过/失败]
覆盖评估:
有Mandos的端点: [N/总数] ([%])
完全测试的可支付端点: [N/总数]
访问控制负向测试: [N/总数]
状态转换检查: [N/总数]
类别分数:
单元测试: [0-10]
Mandos覆盖: [0-10]
访问控制测试: [0-10]
资金流测试: [0-10]
链模拟器: [0-10]
总体分数: [1-10]
差距:
- [未测试的端点列表]
- [缺失的负向测试列表]
- [未测试的支付场景列表]
完成标准
测试质量评估在以下情况完成:
- 所有测试已执行(cargo test + Mandos)。
- 评分标准中的每个类别已评估。
- 总体分数已计算。
- 差距已记录。