iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Hardhat怎么进行合约测试环境准备
  • 353
分享到

Hardhat怎么进行合约测试环境准备

2023-07-05 10:07:56 353人浏览 独家记忆
摘要

这篇文章主要介绍了Hardhat怎么进行合约测试环境准备的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Hardhat怎么进行合约测试环境准备文章都会有所收获,下面我们一起来看看吧。引言Hardhat是一个开源的

这篇文章主要介绍了Hardhat怎么进行合约测试环境准备的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Hardhat怎么进行合约测试环境准备文章都会有所收获,下面我们一起来看看吧。

引言

Hardhat是一个开源以太坊开发框架,简单好用、可扩展、可定制的特点让它在开发者中间很受欢迎。Hardhat在支持编辑、编译、调试和部署合约方面都非常的方便,也有很多功能可以使合约测试工作更加高效和便捷。

一、环境准备

可以参考Hardhat官网教程,进行环境的准备和Hardhat安装。

Hardhat提供了快速构建合约工程的方法:

  • 建立空的工程目录

  • 在目录下执行npx hardhat

  • 根据交互提示完成Hardhat工程的创建

Hardhat怎么进行合约测试环境准备

二、示例合约与测试方法

快速创建Hardhat工程,可以在contract目录下看到Lock.sol的合约,此合约是一个简单的示例,实现了在指定时间前(unlockTime)定资产的功能。

// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.9;// Uncomment this line to use console.logimport "hardhat/console.sol";contract Lock {    uint public unlockTime;    address payable public owner;    event Withdrawal(uint amount, uint when);    constructor(uint _unlockTime) payable {        require(            block.timestamp < _unlockTime,            "Unlock time should be in the future"        );        unlockTime = _unlockTime;        owner = payable(msg.sender);    }    function withdraw() public {        // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal        console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp);        require(block.timestamp >= unlockTime, "You can't withdraw yet");        require(msg.sender == owner, "You aren't the owner");        emit Withdrawal(address(this).balance, block.timestamp);        owner.transfer(address(this).balance);    }}

同时,在test目录下,有Lock.ts(或Lock.js)的测试代码,测试代码里分别展示了对合约部署,合约中涉及的功能的测试。其中值得学习的部分:

一是定义了一个具有setup功能的函数,此函数定义了一些状态变量的初始状态,后面在每次测试代码运行前,可以通过loadFixture方法执行此函数,把状态变量还原到函数中定义的初始状态。这种给状态变量取快照,并用快照还原的方式,解决了很多因为状态变量改变而测试用例执行异常的问题,是个很有用很便捷的方法。

另一个是用到了很便捷的断言方式,这就省掉了写很多麻烦的校验条件,来验证一个执行结果。比如下面这个断言,直接能验证当withdraw函数被调用后出现的回滚情况:

await expect(lock.withdraw()).to.be.revertedWith( "You can't withdraw yet" );

三、LoadFixture的使用

使用场景

用于每次执行测试前的setup操作,可以定义一个函数,在此函数中完成诸如合约部署,合约初始化,账户初始化等操作,在每次执行测试前利用loadFixture的功能,进行相同的变量状态的设置,对合约测试提供了很大的帮助。

工作原理

根据Hardhat源码,可以看到loadFixture维护了一个快照数组snapshots,一个快照元素包含:

不同的函数f作为loadFixture入参时,会有不同的snapshot存储在loadFixture维护的snapshots数组中。

在loadFixture(f)首次执行时,属于f函数的snapshot为undefined,此时会记录f函数中定义的全部状态变量,同时执行:

const restorer = await takeSnapshot();

并将此时的snapshot元素加入到snapshots数组中,后面再次用到同一个入参函数f的loadFixture时,在快照数组snapshots中已存在快照,可直接进行区块链状态回滚: await snapshot.restorer.restore();

  • fixture: Fixture类型的入参函数,type Fixture = () => Promise;

  • data:fixture函数中定义的状态变量

  • restorer:一个有restore方法的结构体,在“./helpers/takeSnapshot”方法中有定义,可以触发evm_revert操作,指定区块链退回到某个快照点。

loadFixture的用法

官方文档示例如下:

```jsasync function deployContractsFixture() {  const token = await Token.deploy(...);  const exchange = await Exchange.deploy(...);  return { token, exchange };}it("test", async function () {  const { token, exchange } = await loadFixture(deployContractsFixture);  // use token and exchanges contracts})```注意:loadFixture的入参不可以是匿名函数,即:```js//错误写法 loadFixture(async () => { ... }) //正确写法 async function beforeTest(){ //定义函数 } loadFixture(beforeTest);```

四、Matchers的使用

Machers:在chai断言库的基础上增加了以太坊特色的断言,便于测试使用

Events用法

   contract Ademo {    event Event();    function callFunction () public {        emit Event();    }}

对合约C的call方法进行调用会触发一个无参数事件,为了测试这个事件是否被触发,可以直接用hardhat-chai-matchers中的Events断言,用法如下:

    const A=await ethers.getContractFactory("Ademo");    const a=await A.deploy();    //采用hardhat-chai-matchers的断言方式,判断Events是否触发    await expect(a.callFunction()).to.emit(a,"Event");
  • Reverts用法:

    //最简单的判断revert的方式await expect(contract.call()).to.be.reverted;//判断未发生revertawait expect(contract.call()).not.to.be.reverted;//判断revert发生并且带了指定的错误信息await expect(contract.call()).to.be.revertedWith("Some revert message");//判断未发生revert并且携带指定信息await expect(contract.call()).not.to.be.revertedWith("Another revert message");

除了上述常用的判断场景外,hardhat-chai-matchers还支持了对Panic以及定制化Error的判定:

await expect(…).to.be.revertedWithPanic(PANIC_CODES)await expect(…).not.to.be.revertedWithPanic(PANIC_CODES)await expect(…).to.be.revertedWithCustomError(CONTRACT,"CustomErrorName")await expect(…).to.be.revertedWithoutReason();
  • Big Number

在solidity中最大整型数是2^256,而javascript中的最大安全数是2^53-1,如果用JS写solidity合约中返回的大数的断言,就会出现问题。hardhat-chai-matchers提供了关于大数的断言能力,使用者无需关心大数之间比较的关系,直接以数字的形式使用即可,比如: expect(await token.balanceOf(someAddress)).to.equal(1);

关于JavaScript的最大安全数问题:

Number.MAX_SAFE_INTEGER 常量表示在 JavaScript 中最大的安全整数,其值为2^53-1,即9007199254740991 。因为Javascript的数字存储使用了IEEE 754中规定的双精度浮点数数据类型,而这一数据类型能够安全存储(-2^53-1 ~ 2^53-1)之间的数(包括边界值),超出范围后将会出现错误,比如:

const x = Number.MAX_SAFE_INTEGER + 1;const y = Number.MAX_SAFE_INTEGER + 2;console.log(Number.MAX_SAFE_INTEGER);// Expected output: 9007199254740991console.log(x);console.log(y);// Expected output: 9007199254740992console.log(x === y);// Expected output: true

Balance Changes

可以很方便的检测用户钱包的资金变化额度,适用于以太币的金额变化,或者ERC-20代币的金额变化。

单个钱包地址的金额变化:

await expect(() =&gt;  sender.sendTransaction({ to: someAddress, value: 200 })).to.changeEtherBalance(sender, "-200");await expect(token.transfer(account, 1)).to.changeTokenBalance(  token,  account,  1);

也可以用来检测多个账户的金额变化,在测试转账交易时,非常适用:

await expect(() =>  sender.sendTransaction({ to: receiver, value: 200 })).to.changeEtherBalances([sender, receiver], [-200, 200]);await expect(token.transferFrom(sender, receiver, 1)).to.changeTokenBalances(  token,  [sender, receiver],  [-1, 1]);

可以用hardhat-chai-matchers提供的方法,方便地校验各种复杂的字符串,比如一个字符串是否是正确的地址格式、私钥格式等,用法如下:

// 是否符合address格式expect("0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2").to.be.a.properAddress;//是否符合私钥格式expect(SOME_PRI_KEY).to.be.a.properPrivateKey;//判断十六进制字符串的用法expect("0x00012AB").to.hexEqual("0x12ab");//判断十六进制字符串的长度expect("0x123456").to.be.properHex(6);

关于“Hardhat怎么进行合约测试环境准备”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Hardhat怎么进行合约测试环境准备”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Hardhat怎么进行合约测试环境准备

本文链接: https://www.lsjlt.com/news/351103.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Hardhat怎么进行合约测试环境准备
    这篇文章主要介绍了Hardhat怎么进行合约测试环境准备的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Hardhat怎么进行合约测试环境准备文章都会有所收获,下面我们一起来看看吧。引言Hardhat是一个开源的...
    99+
    2023-07-05
  • Hardhat进行合约测试环境准备及方法详解
    目录引言一、环境准备二、示例合约与测试方法三、LoadFixture的使用四、Matchers的使用引言 Hardhat是一个开源的以太坊开发框架,简单好用、可扩展、可定制的特点让它...
    99+
    2023-03-08
    Hardhat合约测试 Hardhat 测试环境
  • python怎么进行基准测试
    这篇文章将为大家详细讲解有关python怎么进行基准测试,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最...
    99+
    2023-06-14
  • python3.8+django2+celery5.2.7环境准备(python测试开发django)
    目录前言版本要求环境准备Django中使用Celerydjango-celery-beat 定时任务启动工作进程前言 以前版本的 Celery 需要一个单独的库(django-cel...
    99+
    2024-04-02
  • 怎么使用HammerDB进行MySQL基准测试
    使用HammerDB进行MySQL基准测试的步骤如下: 首先,下载并安装HammerDB。你可以在HammerDB的官方网站(h...
    99+
    2023-10-24
    HammerDB MySQL
  • MySQL中怎么使用hammerdb进行基准测试
    今天就跟大家聊聊有关MySQL中怎么使用hammerdb进行基准测试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。root@master /usr/...
    99+
    2024-04-02
  • 怎么搭建linux测试环境
    要搭建一个Linux测试环境,你可以按照以下步骤进行操作:1.选择Linux发行版:首先要选择一个适合测试的Linux发行版,比如U...
    99+
    2023-08-24
    linux
  • 如何利用GitLab进行多环境部署和测试
    如何利用GitLab进行多环境部署和测试引言:随着软件开发的迅猛发展,项目中常常会涉及到多个环境的部署和测试。为了简化部署流程和提高交付效率,利用GitLab进行多环境部署和测试成为了一种常见的做法。本文将介绍如何在GitLab中配置和管理...
    99+
    2023-10-25
    GitLab:版本控制 多环境部署:环境管理 测试:自动化测试
  • 怎么用PL/SQL进行数据库性能基准测试
    要使用PL/SQL进行数据库性能基准测试,可以按照以下步骤进行: 创建测试表:首先,创建一个测试表来存储测试数据。可以使用以下SQ...
    99+
    2024-05-08
    PL/SQL
  • 怎么搭建一个AOP测试环境
    本篇内容介绍了“怎么搭建一个AOP测试环境”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面金九银十的...
    99+
    2024-04-02
  • Linux中怎么对环境变量文件进行备份
    这篇文章将为大家详细讲解有关Linux中怎么对环境变量文件进行备份,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。bzip2 命令 在shell 提示下输入命令:压缩文件:bzip2 filena...
    99+
    2023-06-28
  • 使用远程Docker进行集成测试的环境搭建过程
    需求背景 团队有集成测试的需求,集成测试需要依赖一些中间件,比如mysql,rabbitmq。每个研发人员有对自己开发的那部分代码进行测试编写和运行检测的需求。 为了不互相影响,可以...
    99+
    2024-04-02
  • 如何搭建使用远程Docker进行集成测试的环境
    这篇文章将为大家详细讲解有关如何搭建使用远程Docker进行集成测试的环境,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求背景团队有集成测试的需求,集成测试需要依赖一些中间件,比如mysql,rabbi...
    99+
    2023-06-20
  • 怎么进行Web渗透测试
    今天小编给大家分享一下怎么进行Web渗透测试的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。渗透测试,是渗透测试工程师完全模拟...
    99+
    2023-06-05
  • Perl中怎么进行测试和调试
    在Perl中进行测试和调试通常使用的工具包括Test模块和调试器。以下是一些常用的方法: 使用Test模块进行单元测试:Test...
    99+
    2024-03-05
    Perl
  • Linux怎么进行压力测试
    这篇文章主要介绍“Linux怎么进行压力测试”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux怎么进行压力测试”文章能帮助大家解决问题。软件压力测试是一种基本的质量保证行为,它是每个重要软件测...
    99+
    2023-06-27
  • 怎么对redis进行环境配置
    要对Redis进行环境配置,首先需要安装Redis。以下是在Linux环境下对Redis进行环境配置的步骤:1. 打开终端,使用以下...
    99+
    2023-09-11
    redis
  • Laravel怎么进行自动化测试
    这篇文章主要介绍“Laravel怎么进行自动化测试”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel怎么进行自动化测试”文章能帮助大家解决问题。为什么需要自动化测试自动化测试并不复杂:它们...
    99+
    2023-07-04
  • 亚马逊服务器测试环境怎么样
    亚马逊服务器测试环境是一种云计算服务,被称为 Amazon Web Services(AWS)。AWS 提供了一系列云计算服务,包括计算、存储、数据库、分析、机器学习、人工智能、物联网、安全和应用程序集成等服务。AWS 的测试环境是非常强大...
    99+
    2023-10-27
    亚马逊 环境 服务器
  • Postman中怎么进行安全测试
    在Postman中进行安全测试通常需要使用以下方法: 输入URL和请求方法:首先,在Postman中输入要测试的API的URL和...
    99+
    2024-03-13
    Postman
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作