FuelLabs/sway项目中的单元测试指南
sway 赋能每个人构建可靠、高效的智能合约。 项目地址: https://gitcode.com/gh_mirrors/sw/sway
什么是Sway单元测试
在FuelLabs/sway项目中,单元测试是验证智能合约功能正确性的重要手段。Forc工具提供了内置支持,可以方便地构建和执行包中的测试用例。
测试函数需要满足以下特点:
- 必须是自由函数(非成员函数)
- 使用
#[test]
属性标记 - 函数没有参数和返回值
编写基础测试
一个简单的测试示例如下:
#[test]
fn test_meaning_of_life() {
assert(6 * 7 == 42);
}
测试函数会被当作脚本入口点执行。测试"通过"的条件是函数成功执行完毕,而"失败"则是函数发生回滚。你也可以专门测试预期会失败的场景。
执行测试
执行项目中的所有测试非常简单:
forc test
典型输出如下:
Compiled library "std".
Compiled library "lib_single_test".
Bytecode size is 92 bytes.
Running 1 tests
test test_meaning_of_life ... ok (170.652µs)
Result: OK. 1 passed. 0 failed. Finished in 1.564996ms.
测试失败场景
Sway支持专门测试预期会失败的场景:
#[test(should_revert)]
fn test_meaning_of_life() {
assert(6 * 6 == 42); // 这个断言会失败
}
你还可以指定预期的回滚代码:
#[test(should_revert = "18446744073709486084")]
fn test_meaning_of_life() {
assert(6 * 6 == 42);
}
要查看回滚代码,可以使用--revert-codes
标志:
forc test --revert-codes
测试合约调用
单元测试中可以调用合约函数:
#[test]
fn test_success() {
let caller = abi(MyContract, CONTRACT_ID);
let result = caller.test_function {}();
assert(result == true);
}
也可以测试合约调用的失败情况:
#[test(should_revert)]
fn test_fail() {
let caller = abi(MyContract, CONTRACT_ID);
let result = caller.test_function {}();
assert(result == false);
}
注意:运行forc test
时,合约会被构建两次:第一次不带单元测试以确定合约ID,第二次带单元测试并提供CONTRACT_ID
。
测试外部合约
单元测试可以调用外部合约的方法,前提是这些合约已作为合约依赖项添加:
#[test]
fn test_external_contract() {
let caller = abi(ExternalContract, EXTERNAL_CONTRACT_ID);
let result = caller.external_function {}();
assert(result == expected_value);
}
测试执行方式
默认情况下,所有单元测试并行运行。每个测试都有自己的存储空间,不会与其他测试共享。
要控制并行度,可以指定线程数:
forc test --test-threads 1 # 串行执行
测试中的日志输出
Sway支持在测试中输出日志:
#[test]
fn test_fn() {
let a = 10;
log(a);
assert_eq(a, 10);
}
默认情况下,通过测试的日志会被隐藏。要查看日志:
forc test --logs # 解码后的日志
forc test --raw-logs --pretty # 原始日志的漂亮打印
最佳实践
- 为每个重要功能编写测试
- 同时测试成功和失败场景
- 保持测试独立,不依赖执行顺序
- 合理使用日志帮助调试
- 测试外部合约调用时确保依赖正确配置
通过以上方法,你可以构建健壮的智能合约测试套件,确保合约在各种情况下都能按预期工作。
sway 赋能每个人构建可靠、高效的智能合约。 项目地址: https://gitcode.com/gh_mirrors/sw/sway
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考