测试智能合约
测试框架
有几个常用的测试框架(没有特定的顺序):
Truffle Test
Truffle框架的一部分,Truffle允许使用JavaScript(基于Mocha)或Solidity编写单元测试。这些测试是针对TestRPC/Ganache运行的。编写这些测试的更多细节位于 [truffle]。
Embark Framework Testing
Embark与Mocha集成,运行用JavaScript编写的单元测试。这些测试使用在TestRPC/Ganache上部署的合约执行。Embark框架自动部署智能合约,并在合约被更改时自动重新部署它们。它还跟踪已部署的合约,并在真正需要时部署合约。Embark包括一个测试库,它可以在EVM中快速运行和测试你的合约,并使用assert.equal()等函数。Embark测试将在目录测试下运行任何测试文件。
DApp
DApp使用本地Solidity代码(一个名为ds-test的库)和一个Parity构建的Rust库(称为Ethrun)执行以太坊字节码,然后断言正确性。ds-test库提供用于验证控制台中数据记录的正确性和事件的断言功能。
断言函数包括
assert(bool condition)
assertEq(address a, address b)
assertEq(bytes32 a, bytes32 b)
assertEq(int a, int b)
assertEq(uint a, uint b)
assertEq0(bytes a, bytes b)
expectEventsExact(address target)
日志事件将信息记录到控制台,使其易于调试。
logs(bytes)
log_bytes32(bytes32)
log_named_bytes32(bytes32 key, bytes32 val)
log_named_address(bytes32 key, address val)
log_named_int(bytes32 key, int val)
log_named_uint(bytes32 key, uint val)
log_named_decimal_int(bytes32 key, int val, uint decimals)
log_named_decimal_uint(bytes32 key, uint val, uint decimals)
Populus
Populus使用python和自己的链仿真器来运行用Solidity编写的合约。单元测试是用pytest库编写的。Populus支持专门用于测试的书面合约。这些合约文件名应该与glob模式 `Test*.sol`
匹配,并且位于项目测试目录`./tests/
`下的任何位置。
Framework | Test Language(s) | Testing Framework | Chain Emulator | Website |
Truffle | Javascript/Solidity | Mocha | TestRPC/Ganache | truffleframework.com |
Embark | Javascript | Mocha | TestRPC/Ganache | embark.readthedocs.io |
DApp | Solidity | ds-test (custom) | Ethrun (Parity) | dapp.readthedocs.io |
Populus | Python | Pytes | Python chain emulator | populus.readthedocs.io |
在区块链上测试
尽管大多数测试不应发生在部署的合约上,但可以通过以太坊客户端检查合约的行为。以下命令可用于评估智能合约的状态。这些命令应该在’geth’终端输入,尽管任何web3调用也会支持这些命令。
eth.getTransactionReceipt(txhash);
可用于获得在`txhash`处的合约地址。
eth.getCode(contractaddress)
获取部署在`contractaddress`的合约代码。这可以用来验证正确的部署。
eth.getPastLogs(options)
获取位于地址的合约的完整日志,在选项中指定。这有助于查看合约调用的历史记录。
eth.getStorageAt(address, position)
获取位于 address 的存储,并使用 position 的偏移量显示该合约中存储的数据。