Skip to content

Latest commit

 

History

History
127 lines (84 loc) · 3.26 KB

09-debug-and-testing.md

File metadata and controls

127 lines (84 loc) · 3.26 KB

debug 与 unit_test:开发时看见,生产时不要依赖

第一卷 · 第 09 章 · ★★

官方源码:debug.move、unit_test.move

本章读完你会

  1. 知道 debug::print 适合本地调试,不适合做生产日志。
  2. 能区分 std::unit_test 与 sui::test_scenario。
  3. 能把测试分成纯函数测试和对象多交易测试。

1. 开发时需要“看见”

Move 代码运行在链上时,不像普通后端服务那样随便打日志。开发阶段可以用 std::debug 辅助定位:

  • 打印值。
  • 打印调用路径。
  • 辅助理解测试失败。

但生产设计不能依赖 debug 输出。生产可观测性应依赖:

  • 事件。
  • 错误码。
  • 对象字段。
  • 链下索引器。

2. std::debug

典型用途:

debug::print(&value);

适合:

  • 本地单元测试。
  • 临时定位。
  • 学习源码行为。

不适合:

  • 生产日志。
  • 索引器输入。
  • 业务通知。
  • 权限判断。

提交前建议:

  • 删除临时 print。
  • 或放在 #[test_only] 代码中。
  • 生产路径用 event::emit。

3. std::unit_test

std::unit_test 更偏语言级测试辅助。它适合:

  • 纯函数测试。
  • 不涉及对象所有权的逻辑。
  • 构造简单 signer。
  • 测试 vector、option、整数、BCS 等。

比如第一卷示例多数可以用普通 #[test] 加断言完成。

4. 与 sui::test_scenario 的区别

工具 适合 不适合
std::unit_test 纯 Move 值、轻量逻辑 多用户对象流转
sui::test_scenario 多笔交易、sender 切换、对象 inventory 简单纯函数会显得重

判断方式:

  • 如果只测 u64、vector、Option:用普通单测。
  • 如果要测 Alice 创建对象、Bob 接收对象:用 test_scenario。
  • 如果要测共享对象、Clock、资产转移:通常用 test_scenario。

5. 测试分层

一个成熟模块通常有三层测试:

层 测什么
纯函数层 算术、编码、状态机分支
对象层 创建、转移、删除、权限
业务流程层 多用户、多交易、事件、失败回滚

不要只写 happy path。至少补:

  • 非 owner 失败。
  • 余额不足。
  • 空列表或 none。
  • 重复调用。
  • 销毁清理。

6. 与示例对照

本书示例中:

  • v1_stdlib_tests 演示第一卷纯函数测试。
  • v2_object_transfer_tests 演示对象和资产测试。
  • v2_p6_sui_framework_tests 演示集合、时钟、动态字段等测试。

运行:

cd examples && sui move test

7. 本章小结

debug 解决开发时“看见”,unit_test 解决纯逻辑测试,test_scenario 解决 Sui 对象和多交易测试。生产路径应依赖事件和错误码,而不是 debug 输出。

8. 自测题

  1. 为什么 debug::print 不应作为生产日志?
  2. 测 Alice 转给 Bob 一件对象,应使用哪类测试工具?
  3. 纯函数测试和多交易测试分别适合什么场景?
  4. 一个资产模块至少应有哪些失败测试?

9. 延伸阅读