演示源码:hardhat-demo: 演示基于hardhat的HelloWord合约测试案例。
环境
NodeJs
创建工程
1.创建一个hardhat工程根目录(hardhat-demo),然后进入该目录执行。
npx hardhat
执行该命令,会进行hardhat工程初始化。
提示我们是否安装该版本hardhat软件包。输入y,回车。
就是问我们需要哪种工程环境。我这里选择创建一个支持ts的。
提示我们输入工程根目录。直接回车就行。
后面也是输入y,回车。
2.创建完成,我们删除他默认的测试案例,形成如下结构。
contracts:放测试合约。
scripts:放部署脚本。
test:放测试脚本。
hardhat.config.ts:这是hardhat配置文件,修改合约编译版本、连接测试网络等信息,都在这个文件上。
使用
在./contracts 目录下面创建HelloWorld.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract HelloWorld {string private hello;function getHello() public view returns (string memory) {return hello;}function setHello(string memory _hello) public {hello = _hello;}
}
由于我们的测试合约版本,为0.8.0,修改hardhat.config.ts文件。
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";const config: HardhatUserConfig = {solidity: "0.8.0",networks: {// hardhat内置测试网络连接localhost: {url: 'http://127.0.0.1:8545',},// ganache 网络连接配置信息ganache: {url: 'http://127.0.0.1:7545',accounts: ['0x172a483415c5e119f1ea336d44646572ac34a088e7bc2884f8e1f83da4cb304a']},},
};export default config;
部署
在./scripts创建deploy.ts
关于用法直接看注释。
import { ethers } from "hardhat"; // 从hardhat中导入ethers工具库/*** 主函数,用于部署HelloWorld智能合约*/
async function main() {// 获取当前区块链环境的签名者列表,[owner]表示获取第一个签名者,通常是部署合约的账户const [owner] = await ethers.getSigners();// 通过ethers获取HelloWorld合约的工厂,这一步是准备部署合约const HelloWorld = await ethers.getContractFactory("HelloWorld");// 连接到owner账户并部署HelloWorld合约const helloWorld = await HelloWorld.connect(owner).deploy();// 等待合约部署完成await helloWorld.deployed();// 打印合约部署地址console.log("HelloWorld deployed to:", helloWorld.address);
}// 执行主函数
main().then(() => process.exit(0)) // 主函数执行成功后,退出进程,返回码为0.catch((error) => {console.error(error); // 主函数执行失败后,打印错误信息process.exit(1); // 退出进程,返回码为1,表示有错误发生});
执行命令: npx hardhat run .\scripts\deploy.ts
测试
在 ./test创建HelloWorld.test.ts
关于用法直接看注释。
// 导入chai模块用于断言验证
import { expect } from "chai";
// 导入hardhat模块用于部署和管理合约
import { ethers } from "hardhat";// 描述HelloWorld合约的测试行为
describe("HelloWorld", function () {// 测试改变问候语后是否返回新的问候语it("Should return the new greeting once it's changed", async function () {// 获取HelloWorld合约的工厂const HelloWorld = await ethers.getContractFactory("HelloWorld");// 部署HelloWorld合约const helloWorld = await HelloWorld.deploy();// 等待合约部署完成await helloWorld.deployed();// 验证初始问候语是否为空expect(await helloWorld.getHello()).to.equal("");// 执行改变问候语的操作const setGreetingTx = await helloWorld.setHello("Hello, world!");// 等待交易确认await setGreetingTx.wait();// 验证新的问候语是否为"Hello, world!"expect(await helloWorld.getHello()).to.equal("Hello, world!");});
});
执行命令:npx hardhat test <指定脚本路径>
此方法会执行test目录下的全部脚本,要想执行特定脚本,后面跟脚本路径。
部署到其他网络
下面以合约部署到ganache来说明。
我们需要先启动ganache,指定端口为7545,接着将第一个账户私钥,粘贴到hardhat.config.ts的如下位置。
当一切准备齐全时,执行部署命令带上 --network ganache即可。