8. 测试合约

原文地址:http://truffleframework.com/docs/getting_started/testing

框架

Truffle使用Mocha测试框架来做自动化测试,使用Chai来做断言。这两个库的结合可能让人耳目一新,我们基于这两者之上,提供一种方式来编译简单和可管理的合约自动化测试用例。

位置

测试文件应置于./tests目录。Truffle只会运行以.js.es.es6.jsx结尾的测试文件,其它的都会被忽略。

测试用例

每个测试文件至少应该包含至少一个对Mocha的describe()函数的调用,详情见Mochajs Documentation。另一种方式是使用Truffle自定义的contract()函数,作用类型describe()函数,但额外添加了一些特性:

  • 在每一个contract()函数执行前,你的合约都会重部署到以太坊客户端中,这样测试用例会在一个干净状态下执行。
  • contract()函数支持传入多个可用的帐户做为第二个参数传入,你可以用此来进行测试。

当你需要与你写的合约进行交互时,使用contract(),否则使用describe()函数。

测试用例示例

truffle init命令为我们提供了一个简单的测试用例例子。它会先部署你的合约,然后执行在it()块中指定的测试用例。

contract('MetaCoin', function(accounts) {
  it("should put 10000 MetaCoin in the first account", function() {
    // Get a reference to the deployed MetaCoin contract, as a JS object.
    var meta = MetaCoin.deployed();

    // Get the MetaCoin balance of the first account and assert that it's 10000.
    return meta.getBalance.call(accounts[0]).then(function(balance) {
      assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
    });
  });
});

需要注意的是在contract()函数的传入的MetaCoin仅仅因为用来展示,说明它是MetaCoin相关的测试,并无本质作用。

合约

Truffle提供了接口抽象,方便你与合约进行便捷交互。通过var meta = MetaCoin.deployed()这行。Truffle设法保证了,你可以在测试用例,前端,移植(Migration)中都能用这种方式与你自己写的合约进行交互。可以在7. 合约交互章节了解更多。

命令

要执行测试,执行下面的命令:

truffle test

你也可以对单个文件执行测试:

truffle test ./path/to/test/file.js

注意事项

EthereumJS TestRPC在进行自动化测试时相比其它客户端会快非常多。而且,TestRPC包含了一些,Truffle可以用来加速测试的特性。作为一个能用流程,我们建议你在开发和测试环节使用TestRPC。当你筹备好要发布到现上时,才使用Geth或其它官方以太坊客户端来进行一次测试。

更多

Truffle提供了操作Mocha的配置文件的入口。参见1. 配置文件章节来了解更多。

如果任何问题,欢迎留言批评指正。

处于某些特定的环境下,可以看到评论框,欢迎留言交流^_^。