测试智能合约

测试框架

有几个常用的测试框架(没有特定的顺序):

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库提供用于验证控制台中数据记录的正确性和事件的断言功能。

断言函数包括

  1. assert(bool condition)
  2. assertEq(address a, address b)
  3. assertEq(bytes32 a, bytes32 b)
  4. assertEq(int a, int b)
  5. assertEq(uint a, uint b)
  6. assertEq0(bytes a, bytes b)
  7. expectEventsExact(address target)

日志事件将信息记录到控制台,使其易于调试。

  1. logs(bytes)
  2. log_bytes32(bytes32)
  3. log_named_bytes32(bytes32 key, bytes32 val)
  4. log_named_address(bytes32 key, address val)
  5. log_named_int(bytes32 key, int val)
  6. log_named_uint(bytes32 key, uint val)
  7. log_named_decimal_int(bytes32 key, int val, uint decimals)
  8. 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调用也会支持这些命令。

  1. eth.getTransactionReceipt(txhash);

可用于获得在`txhash`处的合约地址。

  1. eth.getCode(contractaddress)

获取部署在`contractaddress`的合约代码。这可以用来验证正确的部署。

  1. eth.getPastLogs(options)

获取位于地址的合约的完整日志,在选项中指定。这有助于查看合约调用的历史记录。

  1. eth.getStorageAt(address, position)

获取位于 address 的存储,并使用 position 的偏移量显示该合约中存储的数据。

赞赏译者