五:用Mocha编写solidity的测试

五:用Mocha编写SimpleStorage.sol的测试

  • 如果朋友有代码,工具,使用流程等不太清楚的,可用去专栏看看,专栏中有文章中所提及的具体使用方式。不太明白的朋友可以自己去看看~~ 瞬移专栏

实验目的

	编写测试在部署智能合约的过程中可以说是最重要的一个环节!因为当我们的合约上链后具有不可更改性,所以前期通过大量测试来验证合约的好坏是非常重要的。使用mocha能让我们写出清晰的,可读性很强的测试。本章通过简单的测试,让大家对测试有一个概率,为后期的强化做好准备。

实验原理

  • Mocha是一个功能丰富的JavaScript测试框架,使用mocha能提高开发人员的测试速度以及提升代码可读性。

开始条件

  • 安装好基于windows系统的子系统wsl。默认安装ubuntu20.04。
  • 安装好VS Code。
  • nodejs
  • ganache-cli
  • ether.js
  • VS code
  • fs

实验过程

  1. 安装mocha
  2. 设置测试脚本
  3. 写测试
  4. 调用

实验步骤

  1. 使用yarn安装mocha,在test目录下安装。
yarn add --dev mocha

  1. 把mocha测试框架配置到package.json中
"scripts": {
    "test": "mocha"
  }

在这里插入图片描述

  1. 编写测试,下面我先给一个测试模板,大家可以先了解各个函数的作用,然后后面我会把测试代码放在文章末尾
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

//大家也可以通过点击进行创建

在这里插入图片描述

  1. 调用我们编写好的测试
  • 进入项目根目录
  • 先在一个端口启动ganache,每次启动给的私钥都不一样,大家记得修改代码中的私钥(ganache启动命令:ganache-cli
  • 另外一个端口运行测试
yarn test

在这里插入图片描述

  1. 运行结果:会显示我们每一个it函数中调用的与智能合约交互的功能是否正确,错误也会返回错误值,让测试更简单,更准确
    在这里插入图片描述

相关官方知识库

Mocha

下一章内容:

注册MetaMask钱包并获取rinkeby测试币

欢迎讨论学习⊙﹏⊙

对文章满意的话欢迎点赞收藏,哈哈

我不会对文章设置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);
  });
});

猜你喜欢

转载自blog.csdn.net/qq_43917601/article/details/126781782
今日推荐