使用测试驱动开发模式编写智能合约

hardhat简介

  • hardhat是一个以太坊智能合约开发框架,主要用于简化和加速以太坊区块链上的智能合约开、测试和部署,提供了许多工具帮助开发人员更轻松地构建和维护智能合约项目,以下是他的一些主要功能:
    • 智能合约开发:hardhat提供了强大的开发环境,支持solidity语言,允许开发人员轻松编写、调试和测试智能合约。
    • 智能合约测试:hardhat提供了一个集成的测试框架,使开发人员能编写和运行针对智能合约的自动化测试,这有助于确保合约在不同场景下的正确性和安全性。
    • 本地开发网络:hardhat支持在本地运行一个以太坊节点,以便在开发过程中快速测试和调试智能合约,使得开发人员无需连接到主网络,提高了开发效率。
    • 集成测试和部署:hardhat提供了工具和脚本,方便集成测试和部署智能合约到以太坊主网或测试网,有助于合约在真实环境中正常运行。
    • 脚本和任务:hardhat允许开发人员编写自定义脚本和任务,以执行特定的操作,例如部署合约、验证代码等,为自动化开发流程提供了更大的灵活性。
    • 插件系统:hardhat的插件系统使得开发人员能扩展框架的功能,以满足项目的特定需求,可以使用现有的插件,也可以编写自己的定制插件。
    • 与其它开发工具的集成: Hardhat 与其他常用的开发工具集成,例如 Truffle、ethers.js 等,为开发人员提供更多选择和灵活性。

安装hardhat

  • 前提是要安装好node.js。
  • 在项目目录里打开终端使用mkdir 文件名命令来创建一个新的文件夹
  • 然后使用cd 文件名命令转到该目录
  • 使用npm install --save-dev hardhat命令安装hardhat
  • 输入npx hardhat init命令进行初始化
  • 该某目录下就会多出这些文件

使用测试驱动开发模式编写智能合约

  • 基于该框架,使用vscode打开该文件夹,在test目录下新建test.js文件,在contracts目录下新建Mailbox.sol合约文件
  • 示例代码
    注意:要进入我们之前安装hardhat的根目录,否则他会显示错误信息Error HH1: You are not inside a Hardhat project.,表示你当前不在一个hardhat项目中,我这里创建的目录是my-new-project,因此要在该目录下创建文件以及运行
    js代码

const { expect } = require("chai");
const { ethers } = require("hardhat");describe("Mailbox", async () => {it("should get mailbox contract", async () => {const mailboxContract = await ethers.getContractFactory("Mailbox");});it("should get total letters in the box", async () => {const mailboxContract = await ethers.getContractFactory("Mailbox");const mailbox = await mailboxContract.deploy();expect(await mailbox.totalLetters()).to.equal(0);});it("should increase by one when got new letter", async () => {const mailboxContract = await ethers.getContractFactory("Mailbox");const mailbox = await mailboxContract.deploy();await mailbox.write("Hello");expect(await mailbox.totalLetters()).to.equal(1);})it("should get mail content", async () => {const mailboxContract = await ethers.getContractFactory("Mailbox");const mailbox = await mailboxContract.deploy();await mailbox.write("Hello");const letters = await mailbox.read();expect(letters[0].letter).to.equal("Hello");})it("should get mail sender", async () => {const mailboxContract = await ethers.getContractFactory("Mailbox");const mailbox = await mailboxContract.deploy();await mailbox.write("Hello");const letters = await mailbox.read();//这里记得测试后将0x替换成终端给出的地址expect(letters[0].sender).to.equal("0x");})
});

合约代码

pragma solidity 0.8.24;
contract Mailbox {
//这里没有赋初值的话,初始值为0uint public totalLetters;struct Letter {string letter;address sender;}Letter[] private letters;function write(string memory letter) public {totalLetters++;letters.push(Letter(letter, msg.sender));}function read() public view returns (Letter[] memory) {return letters;}
}

终端界面输入npx hardhat test命令,当显示全绿表示测试通过
在这里插入图片描述

学习笔记
  • const { expect } = require("chai");
    这行代码使用了JavaScript的解构赋值语法,表示声明了一个expect常量,并从chai这个模块中 找到名为expect的属性并赋值给该expect常量。
    如果不使用解构赋值就使用const expect = require("chai")命令,该命令导入了chai的整个模块,使用解构赋值语法的好处就是只导入模块中真正需要的部分,减少不必要的代码依赖。当模块中有多个导出时可以防止导入的变量名和其它变量名发生冲突。
    这里的require用于加载指定模块
  • describe("Mailbox", async () => {})
    该代码是使用一种测试框架编写的测试用例描述。这种测试框架用于编写和组织测试用例,确保代码的正确性和可靠性。
    describe函数接收两个参数,一个描述字符串,也就是我们这里的"Mailbox",一个回调函数,即async () => {}。该回调函数是一个 异步函数(使用 async 关键字标记)。
    在describe函数的回调函数中 ,你可以添加一个或多个测试用例。测试用例使用测试框架提供的其它函数(如it)编写的。
  • it("should get mail sender", async () => {})
    是一个测试用例,接收两个参数,一个字符串,一个异步函数
  • const mailboxContract = await ethers.getContractFactory("Mailbox");
    使用ethers.getContractFactory获取一个名为Mailbox的智能合约,并将其实例化为一个常量对象。
  • const mailbox = await mailboxContract.deploy();
    mailboxContract.deploy()是一个异步操作,它返回一个promise对象,该对象在解析时包含一个已部署的"Mailbox"智能合约实例,await关键字用于等待Promise对象的解析,在这里用英语等待智能合约的部署完成。最后,将解析后的已部署智能合约实例赋值给常量对象mailbox。这样,我们就可以使用mailbox来调用"Mailbox"智能合约的方法和属性。
  • await mailbox.write("Hello");
    调用合约的write函数向信箱写入一条消息“Hello”
  • const letters = await mailbox.read();
    调用合约的read函数读取信箱中的邮箱
  • expect(letters[0].sender).to.equal('0x');
    使用expect函数进行断言,letters[0].sender从先前测试中获取到信箱中第一封信件的发送者地址,在终端测试后会给出该地址,替换掉0x即可测试通过。to.equal是一个匹配器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/521593.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm 显示无法加载文件 D:\...,因为在此系统上禁止运行脚本。

PyCharm 显示无法加载文件 D:…,因为在此系统上禁止运行脚本。 PyCharm 显示 无法加载文件 D:\python test\AI_CV\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。 解决方法: winx点击Windows PowerShell(管理员&#…

HTTP协议以及如何将http协议变为可靠连接

简述: 基本格式: 请求行:请求数据的第一行(请求方式,资源路径,协议) 请求头:第二行开始,格式KEY:value 请求体:POST请求,存放请求参…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础组件:AlphabetIndexer)

可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 AlphabetIndexer(value: {arrayValue: Array<string>, s…

JWT的是什么

session共享 什么是session共享 Session共享是指在分布式系统中&#xff0c;在多个服务器之间共享同一个用户的会话数据。在传统的Web应用中&#xff0c;用户的会话信息通常存储在服务器端的Session中&#xff0c;而每个用户的请求在同一个服务器上处理&#xff0c;因此可以轻…

prometheus从0编译/安装与运行(2.45.3版本举例)

安装 官方介绍&#xff1a;Getting started | Prometheus 下载二进制安装 wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz tar xvfz prometheu-*.tar.gz cd prometheus-* 代码编译安装 安装依赖包 #yum in…

【MySQL知识体系】第1章 初识 MySQL

文章目录 第1章 初识 MySQL1.1 MySQL 介绍1.1.1 什么是 MySQL&#xff1f;1.1.2 MySQL 的特点&#xff1f;1.1.3 MySQL 默认端口&#xff1f; 1.2 安装 MySQL1.2.1在MacOS上安装MySQL1.2.2 在Windows上安装MySQL 1.3 如何选择 MySQL 客户端1.3.1 在MacOS上安装Workbench1.3.2 在…

解读:DUSt3R: Geometric 3D Vision Made Easy

概述&#xff1a;给定一个无约束图像集&#xff0c;即一组具有未知相机姿态和内在特征的照片&#xff0c;我们提出的 DUSt3R 方法会输出一组相应的点阵图&#xff0c;从中我们可以直接恢复通常难以一次性估算的各种几何量&#xff0c;如相机参数、像素对应关系、深度图和完全一…

【微信】【Windows端】开启2024最新版微信内置浏览器Devtools调试窗口

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 预备知识浏览器框架进程关系 2️⃣ 逆向分析关键字xweb-enable-inspectx64dbg分析 3️⃣ 验证菜单按钮方式快捷键F12方式同时打开多个Devtools调试窗口 &#x1f6ec; 文章小结&#x1f4d6; 参考资料 &#x1f6eb; 导读 需…

金现代产品方案部部长王宁,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…

每日OJ题_牛客HJ87 密码强度等级(IO型OJ)

目录 牛客HJ87 密码强度等级 解析代码 牛客HJ87 密码强度等级 密码强度等级_牛客题霸_牛客网 题目描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二…

数字工厂管理系统如何帮助电子企业改善仓储难题

随着科技的飞速发展&#xff0c;电子企业面临着日益增长的仓储管理挑战。传统的仓储管理模式已经难以满足企业高效、准确、实时的管理需求&#xff0c;因此&#xff0c;数字工厂管理系统的引入成为解决这一难题的关键。数字工厂管理系统通过集成先进的信息技术&#xff0c;为电…

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理一、Unity中 屏蔽透明区域的点击事件1.1 使用Image组件自带的参数检测1.2 根据点击的坐标计算该点的像素值是否满足阈值 二、Unity中屏蔽 不规则图片按钮点击的事件 总结 &#x1f3ac; 博客主页&#xff1a;htt…