五:用Mocha编写SimpleStorage.sol的测试
- 如果朋友有代码,工具,使用流程等不太清楚的,可用去专栏看看,专栏中有文章中所提及的具体使用方式。不太明白的朋友可以自己去看看~~ 瞬移专栏
实验目的
编写测试在部署智能合约的过程中可以说是最重要的一个环节!因为当我们的合约上链后具有不可更改性,所以前期通过大量测试来验证合约的好坏是非常重要的。使用mocha能让我们写出清晰的,可读性很强的测试。本章通过简单的测试,让大家对测试有一个概率,为后期的强化做好准备。
实验原理
- Mocha是一个功能丰富的JavaScript测试框架,使用mocha能提高开发人员的测试速度以及提升代码可读性。
开始条件
- 安装好基于windows系统的子系统wsl。默认安装ubuntu20.04。
- 安装好VS Code。
- nodejs
- ganache-cli
- ether.js
- VS code
- fs
实验过程
- 安装mocha
- 设置测试脚本
- 写测试
- 调用
实验步骤
- 使用yarn安装mocha,在test目录下安装。
yarn add --dev mocha
- 把mocha测试框架配置到package.json中
"scripts": {
"test": "mocha"
}
- 编写测试,下面我先给一个测试模板,大家可以先了解各个函数的作用,然后后面我会把测试代码放在文章末尾
const assert = require("assert"); //引入assert断言,对输出的内容进行判断
describe("要测试的功能或者合约", function () {
beforeEach(function () {
// 在这个块中的其他函数运行之前执行这个函数,那么我们
// 可以在这里面部署好我们的智能合约,那么在后面的it函数中都可以使用
// 要等待部署合约的返回,所以这个函数会被修改为异步
});
it("要测试的东西的描述", function () {
// 这里面是我们写的与智能合约交互的代码
// 因为是部署到链上的,所以我们会把函数改为异步函数,测试代码中会有体现
});
});
- 在根目录中创建一个test文件夹
- test文件夹里面创建一个test.js文件,点击编辑test.js
//打开终端输入
mkdir test
cd test
touch test.js
//大家也可以通过点击进行创建
- 调用我们编写好的测试
- 进入项目根目录
- 先在一个端口启动ganache,每次启动给的私钥都不一样,大家记得修改代码中的私钥(ganache启动命令:
ganache-cli
- 另外一个端口运行测试
yarn test
- 运行结果:会显示我们每一个it函数中调用的与智能合约交互的功能是否正确,错误也会返回错误值,让测试更简单,更准确
相关官方知识库
下一章内容:
欢迎讨论学习⊙﹏⊙
对文章满意的话欢迎点赞收藏,哈哈
我不会对文章设置VIP等限制,有喜欢的朋友可以打赏,打赏也是博主勤更的动力,谢谢你~~
test.js代码
const ethers = require("ethers");
const fs = require("fs-extra");
const assert = require("assert");
describe("SimpleStorage", function () {
let SimpleStorageContract;
// 将beforeEach用async标识符设置为一个异步函数
beforeEach(async function () {
// 在这个块中的其他函数运行之前执行这个函数
let provider = new ethers.providers.JsonRpcProvider(
"http://127.0.0.1:8545"
);
let wallet = new ethers.Wallet(
"0x67ab83aa354c78e54c2902c0855404ad394705d494bae2869e2214fa2d1bf2a9", //这是ganache的私钥,没有用,大家自己的私钥千万别暴露出来,我这里是为了方便展示
provider
);
const abi = fs.readFileSync(
"./SimpleStorage_sol_SimpleStorage.abi",
"utf8"
);
const binary = fs.readFileSync(
"./SimpleStorage_sol_SimpleStorage.bin",
"utf8"
);
const contractFactory = new ethers.ContractFactory(abi, binary, wallet);
SimpleStorageContract = await contractFactory.deploy();
});
//因为是与链上的合约交互,所以我们都会设置为异步函数 async
//SimpleStorageContract后面跟的参数是直接调用的SimpleStorage.sol中的方法
//用assert.equal来判断连个值是否相等
it("返回的初始化的最喜欢的数字应该是0", async function () {
const currentValue = await SimpleStorageContract.retrieve();
const expectedValue = "0";
assert.equal(currentValue, expectedValue);
});
it("更新商店最喜欢的数字为7", async function () {
const expectedValue = 7;
const transactionResponse = await SimpleStorageContract.store(7);
await transactionResponse.wait(1); //等待区块确认
const currentValue = await SimpleStorageContract.retrieve();
assert.equal(currentValue, expectedValue);
});
it("向数组中添加一个人", async function () {
const expectedPersonName = "Daf";
const expectedFavoriteNumber = 9;
const transactionResponse = await SimpleStorageContract.addPerson(
expectedPersonName,
expectedFavoriteNumber
);
await transactionResponse.wait(1);
const {
favoriteNumber, name } = await SimpleStorageContract.people(0);
assert.equal(name, expectedPersonName);
assert.equal(favoriteNumber, expectedFavoriteNumber);
});
});