第2章 分支树技术(BTT)在Solidity测试中的应用
分支树技术
分支树技术(BTT)是一种通过决策树建模所有条件和结果,从而组织 Solidity 测试的方法。分支代表条件,叶子节点代表具体的测试用例。
BTT 非常适合 Foundry 测试,因为每个叶子节点都可以转化为一个 test 或 test_RevertWhen 函数,而每个条件则对应 setup 代码或修饰器。例如,一棵 TransferTest 树可以描述转账过程中的暂停和余额状态:
TransferTest ├── When paused │ └── It should revert. └── When not paused ├── When balance is insufficient │ └── It should revert. └── When balance is sufficient └── It should transfer the tokens.
这棵树可以在 Foundry 测试文件中手动实现:
contract TransferTest is Test { modifier whenNotPaused() { _; } modifier whenBalanceIsSufficient() { _; } function test_ShouldTransferTheTokens() public whenNotPaused whenBalanceIsSufficient { // arrange, act, assert } function test_RevertWhen_Paused() public { // arrange, act, assert } }
Bulloak
Bulloak 是一个命令行工具,能够自动化 Foundry 中的 BTT 工作流。它接收 .tree 规范文件作为输入,支持以下功能:
* 根据树生成 Solidity 测试文件骨架 * 检查现有测试文件是否与树规范匹配
安装: cargo install bulloak
创建规范文件(TransferTest.tree): TransferTest └── When not paused ├── When balance is insufficient │ └── It should revert. └── When balance is sufficient └── It should transfer the tokens.
生成测试文件骨架: bulloak scaffold TransferTest.tree
检查现有测试文件是否符合规范: bulloak check TransferTest.tree
Bulloak 生成标准的 Solidity 测试骨架,你只需填入 setup 和断言逻辑,然后通过 forge test 运行。
更多信息请参考 Bulloak GitHub 以及 2023 Solidity Summit 上的 BTT 演示。本文是否有帮助?在 GitHub 上提出修改建议