博主简介:
云计算领域优质创作者
2022年CSDN新星计划python赛道第一名2022年CSDN原力计划优质作者
阿里云ACE认证高级工程师
阿里云开发者社区专家博主交流社区:CSDN云计算交流社区欢迎您的加入!
目录
1.使用 truffle console 访问智能合约
2.智能合约测试(truffle test)
2.1 编写测试代码
2.2 运行测试脚本
1.使用 truffle console 访问智能合约
truffle console 是区块链开发人员的强大工具,这是一个命令行工具,可以在命令行中执行javascript代码,与智能合约进行交互。这对于开发智能合约非常有用。
我们已经成功地将智能合约部署到本地区块链网络,接下来我们将使用 truffle console 与智能合约进行交互。
启动 truffle console:
$ truffle console
进入控制台后,让我们获取已部署智能合约的一个实例,看看能否从该合约中读取value
值。从控制台运行以下代码:
MyContract.deployed().then((instance) => { app = instance } )
这里MyContract
是之前在迁移文件中创建的变量名称,使用deployed()
函数获取一个已部署合约的实例,并将其分配给promise
回调函数中的一个app
变量。
现在可以获取智能合约中的value
值:
app.get()// => 'myValue'
给value
设置一个新值:
app.set('New Value')
重新获取智能合约中的value
值:
app.get()// => 'New Value'
可以通过以下命令退出truffle console:
.exit
2.智能合约测试(truffle test)
类似Java中JUnit单元测试工具,Trfuffle test可以帮助我们对智能合约项目进行白盒测试。
对于区块链项目,测试显得尤其重要,因为部署合约、迁移合约的成本都是相当高的,都要消耗Gas。
2.1 编写测试代码
现在让我们对前面章节中创建的智能合约,编写一些测试代码。整个测试过程模拟对智能合约MyContract
获取value
值、设置value
值的过程。
先确保MyContract
已经正确部署到Ganache本地区块链网络中。测试中将会用到Mocha测试框架,与Chai断言库,但Truffle已经集成了这些库。
测试代码用JavaScript编写,模拟与智能合约的交互,就像使用truffle console所做的那样。
在项目根目录下的test
目录中,添加测试脚本文件:MyContract.js
MyContract.js
中的测试代码:
// 首先,`require`合约并将其分配给一个变量`MyContract`const MyContract = artifacts.require('./MyContract.sol');// 调用“contract”函数,并在回调函数中编写所有测试// 回调函数提供一个“accounts”变量,表示本地区块链上的所有帐户。contract('MyContract', (accounts) => {// 第1个测试:调用get()函数,检查返回值,测试合约中value初始值是否是: 'myValue'it('initializes with the correct value', async () => {// 获取合约实例const myContract = await MyContract.deployed()const value = await myContract.get()// 使用断言测试value的值assert.equal(value, 'myValue')})// 第2个测试: 调用set()函数来设置value值,然后调用get()函数来确保更新了值it('can update the value', async () => {const myContract = await MyContract.deployed()myContract.set('New Value');const value = await myContract.get()assert.equal(value, 'New Value')})})
代码说明,请见注释。
2.2 运行测试脚本
执行命令行运行测试:
$ truffle test
测试详情:
G:\qikegu\ethereum\mydapp>truffle testUsing network 'development'.Compiling your contracts...===========================> Everything is up to date, there is nothing to compile.Contract: MyContract√ initializes with the correct value (76ms)√ can update the value (78ms)2 passing (188ms)