入门 - 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. 配置文件章节来了解更多。
如果任何问题,欢迎留言批评指正。