前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用hardhat 开发以太坊智能合约-测试合约

使用hardhat 开发以太坊智能合约-测试合约

作者头像
Tiny熊
发布2022-11-07 12:47:11
1K0
发布2022-11-07 12:47:11
举报
文章被收录于专栏:深入浅出区块链技术

本文作者:全干攻城尸[1]

本系列课程: 第一节:使用 hardhat 开发以太坊智能合约-搭建环境[2] 第二节:使用 hardhat 开发以太坊智能合约-测试合约[3] 第三节:使用 hardhat 开发以太坊智能合约-发布合约[4] 第四节:使用 hardhat 开发以太坊智能合约-验证合约[5]

上一章我们讲解了如何搭建基本的 hardhat 开发环境,这一章我们来讲一下如何测试、部署合约

特别提醒:本系列教程默认你已经掌握了 solidity 的开发技能,如果你对 solidity 还不能完全理解,请先移步 solidity 的相关教程

1、编译合约

我们使用 vscode 打开项目,在菜单左侧,打开 contracts 目录,可以发现里面已经有一个 Lock.sol 文件了,这个是 hardhat 为我们准备的测试的合约文件

打开 Lock.sol 文件

可以看到其实是一个很简单的逻辑,里面定义了 2 个变量,还有一个事件,以及一个调用方法,整个合约要实现的就是当事件满足一定条件的时候才可以从合约账号提现

下面,我们使用 hardhat 提供的命令对合约文件进行编译:

代码语言:javascript
复制
npx hardhat compile

hardhat 会帮我们编译 contracts 目录下面的所有合约文件

这时候我们可以看到在控制台已经输出了编译日志,如果编译不成功会提示相应的错误信息

在我们的项目目录里同时也会生成一些新的文件,如上图所示,其中 cache 目录为缓存文件,artifacts 目录下的 build-info 目录,存放的是构建项目的信息,contracts 下面存放的是编译的每个合约对应的 abi 接口信息

2、测试合约

通过上面的操作,我们已经成功的编译了合约文件,下面我们来对合约文件进行测试,一个好的测试流程可以避免我们的合约出现一些严重的 bug,特别是在区块链上,一旦合约部署上去就无法再次更新,所以我们在正式上线之前,必须将合约完全测试一遍

2.1 测试脚本介绍

我们回到 vscode,打开项目目录 test,这里已经有了一个名为 Lock.js 的脚本文件

让我们打开它,看一下它的主要构成

代码前 6 行定义了几个常用的测试辅助对象,其中 loadFixture,可以让我们在测试中都使用相同的配置,最常用的就是我们在测试类里会定义一个部署合约的方法,然后在需要使用合约对象的地方,通过 loadFixture(function) 获取部署合约的快照对象

在 hardhat 里,我们使用 chaijs Chaijs 官网[6] 来进行断言测试, 感兴趣的朋友,可以浏览 chai 官网获取更多信息,通过使用 expect 方法,进行断言测试

代码语言:javascript
复制
describe("Lock", function () {})

这段代码就是标识测试的开始,其中第一个参数为测试标题,可以随便定义,第二个参数为要执行的函数体,我们在函数体里,进行具体测试逻辑的编写

describe 是可以嵌套使用的

所以我们一般测试会在第一个 describe 里定义一个合约部署方法,然后在 describe 里嵌套 describe,通过 loadFixture(function) 获取相同合约部署快照

2.2 合约部署方法

回到刚刚的测试文件,我们继续阅读代码

代码语言:javascript
复制
async function deployOneYearLockFixture() {
    const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60;
    const ONE_GWEI = 1_000_000_000;

    const lockedAmount = ONE_GWEI;
    const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS;

    // Contracts are deployed using the first signer/account by default
    const [owner, otherAccount] = await ethers.getSigners();

    const Lock = await ethers.getContractFactory("Lock");
    const lock = await Lock.deploy(unlockTime, { value: lockedAmount });

    return { lock, unlockTime, lockedAmount, owner, otherAccount };
  }

这部分代码定义了一个合约部署方法,其中

第一个 owner 即为我们部署合约的账号,可以通过加入更多字段接受返回,获取其他的账号信息,如 otherAccount 这个定义

代码语言:javascript
复制
   const [owner, otherAccount] = await ethers.getSigners();
   const Lock = await ethers.getContractFactory("Lock");

这句代码创建了一个合约对象 Lock,注意括号内的 Lock 对应的是合约文件内定义的名称,即

代码语言:javascript
复制
contract Lock {}

请不要错把合约文件名当成该参数,否则会报错

代码语言:javascript
复制
const lock = await Lock.deploy(unlockTime, { value: lockedAmount });

通过 deploy 方法进行合约部署,括号内为合约部署时所需的初始化值,如果合约不需要可以不填写

2.3 测试方法

代码语言:javascript
复制
 describe("Deployment", function () {
    it("Should set the right unlockTime", async function () {
      const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture);

      expect(await lock.unlockTime()).to.equal(unlockTime);
    });
  });

在 describe 里,使用 it 进行测试,第一个参数为测试描述,第二个参数为具体方法实现

代码语言:javascript
复制
const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture);

获取合约创建快照对象,从对象中获取到合约对象以及合约部署方法里定义的解锁时间

代码语言:javascript
复制
 expect(await lock.unlockTime()).to.equal(unlockTime);

使用 expect 进行断言,判断合约对象里面存储的解锁时间是否与合约部署方法里定义的解锁时间相等

2.4 测试演示

接下来,让我们运行测试,来看一下测试的结果

使用如下命令来进行合约测试:

代码语言:javascript
复制
npx hardhat test

从图中打印的信息我们可以清晰的看出测试结果,值得注意点是,打印也是具有层级的,这个是因为我们循环嵌套使用 describe 产生的效果,通过嵌套使用,可以让我们测试结果变得更为清晰,推荐大家使用

通过本章的学习,我们了解了合约是如何进行测试的,以及测试需要注意的一些事项,接下来我们会讲解如何进行合约的部署,以及网络的选择,小伙伴们我们下节课见咯

参考资料

[1]

全干攻城尸: https://learnblockchain.cn/people/5344

[2]

使用hardhat开发以太坊智能合约-搭建环境: https://learnblockchain.cn/article/4885

[3]

使用hardhat开发以太坊智能合约-测试合约: https://learnblockchain.cn/article/4930

[4]

使用hardhat开发以太坊智能合约-发布合约: https://learnblockchain.cn/article/4929

[5]

使用hardhat开发以太坊智能合约-验证合约: https://learnblockchain.cn/article/4931

[6]

Chaijs官网: https://www.chaijs.com/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、编译合约
  • 2、测试合约
    • 2.1 测试脚本介绍
      • 2.2 合约部署方法
        • 2.3 测试方法
          • 2.4 测试演示
            • 参考资料
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档