第一卷 · 第 09 章 · ★★
官方源码:debug.move、unit_test.move
- 知道
debug::print适合本地调试,不适合做生产日志。 - 能区分
std::unit_test与sui::test_scenario。 - 能把测试分成纯函数测试和对象多交易测试。
Move 代码运行在链上时,不像普通后端服务那样随便打日志。开发阶段可以用 std::debug 辅助定位:
- 打印值。
- 打印调用路径。
- 辅助理解测试失败。
但生产设计不能依赖 debug 输出。生产可观测性应依赖:
- 事件。
- 错误码。
- 对象字段。
- 链下索引器。
典型用途:
debug::print(&value);适合:
- 本地单元测试。
- 临时定位。
- 学习源码行为。
不适合:
- 生产日志。
- 索引器输入。
- 业务通知。
- 权限判断。
提交前建议:
- 删除临时 print。
- 或放在
#[test_only]代码中。 - 生产路径用
event::emit。
std::unit_test 更偏语言级测试辅助。它适合:
- 纯函数测试。
- 不涉及对象所有权的逻辑。
- 构造简单 signer。
- 测试
vector、option、整数、BCS 等。
比如第一卷示例多数可以用普通 #[test] 加断言完成。
| 工具 | 适合 | 不适合 |
|---|---|---|
std::unit_test |
纯 Move 值、轻量逻辑 | 多用户对象流转 |
sui::test_scenario |
多笔交易、sender 切换、对象 inventory | 简单纯函数会显得重 |
判断方式:
- 如果只测
u64、vector、Option:用普通单测。 - 如果要测 Alice 创建对象、Bob 接收对象:用
test_scenario。 - 如果要测共享对象、Clock、资产转移:通常用
test_scenario。
一个成熟模块通常有三层测试:
| 层 | 测什么 |
|---|---|
| 纯函数层 | 算术、编码、状态机分支 |
| 对象层 | 创建、转移、删除、权限 |
| 业务流程层 | 多用户、多交易、事件、失败回滚 |
不要只写 happy path。至少补:
- 非 owner 失败。
- 余额不足。
- 空列表或 none。
- 重复调用。
- 销毁清理。
本书示例中:
v1_stdlib_tests演示第一卷纯函数测试。v2_object_transfer_tests演示对象和资产测试。v2_p6_sui_framework_tests演示集合、时钟、动态字段等测试。
运行:
cd examples && sui move testdebug 解决开发时“看见”,unit_test 解决纯逻辑测试,test_scenario 解决 Sui 对象和多交易测试。生产路径应依赖事件和错误码,而不是 debug 输出。
- 为什么
debug::print不应作为生产日志? - 测 Alice 转给 Bob 一件对象,应使用哪类测试工具?
- 纯函数测试和多交易测试分别适合什么场景?
- 一个资产模块至少应有哪些失败测试?