Hardhat学习笔记-单元/集成测试

使用Mocha与chai进行测试

存在于hardhat-toolbox中

1. 环境配置

• 安装 Hardhat-Deploy 插件

用于简化部署脚本管理和多网络部署:

bash 复制代码
npm i -D hardhat-deploy

在 hardhat.config.js 中引入插件:

javascript 复制代码
require('hardhat-deploy');

• 测试框架集成
hardhat-toolbox 已内置 Mocha(测试运行器) 和 Chai(断言库) ,无需额外安装。测试文件需放在 test/ 目录下,文件名以 .test.js 结尾。


2. 单元测试(本地环境)

• 基本原则

• 覆盖所有可能的分支(如 fund、withdraw、refund 等涉及资产转移的关键函数)。 • 使用 describe 分组测试用例,it 定义具体测试逻辑。 • 示例结构:

js 复制代码
  const { expect } = require("chai");
    describe("FundMe", function() {
      beforeEach(async () => {
        // 部署合约并初始化
        const FundMeFactory = await ethers.getContractFactory("FundMe");
        fundMe = await FundMeFactory.deploy();
      });
      it("Reverts if ETH amount is 0", async () => {
        await expect(fundMe.fund()).to.be.revertedWith("Amount must be > 0");
      });
    });

• Mock 合约的使用

• 目的 :模拟外部依赖(如 Chainlink 喂价合约),避免测试依赖真实网络。

• 方法 :

  1. 创建 Mock 合约(参考 Chainlink MockV3Aggregator)。

  2. 在测试中部署 Mock 合约并注入到主合约中:

js 复制代码
       const MockAggregator = await ethers.getContractFactory("MockV3Aggregator");
       mockAggregator = await MockAggregator.deploy(8, 2000e8); // 初始价格 2000
       const FundMe = await ethers.getContractFactory("FundMe");
       fundMe = await FundMe.deploy(mockAggregator.address);

3. 集成测试(真实网络)

• 配置测试网络

在 .env 中添加网络参数(如 Sepolia 的 RPC URL 和私钥):

ini 复制代码
SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_KEY
PRIVATE_KEY=0x...

在 hardhat.config.js 中配置网络:

javascript 复制代码
networks: {
  sepolia: {
    url: process.env.SEPOLIA_RPC_URL,
    accounts: [process.env.PRIVATE_KEY],
  },
}

• 运行测试

使用 --network 指定网络:

bash 复制代码
npx hardhat test --network sepolia

重点验证合约在真实环境下的交互(如 API 调用、Gas 消耗)。


4. 辅助工具

• Gas 消耗分析(hardhat-gas-reporter)

• 安装:

js 复制代码
    npm i -D hardhat-gas-reporter
    ```
  • 配置 `hardhat.config.js`:  
    ```javascript
    require("hardhat-gas-reporter");
    module.exports = {
      gasReporter: {
        enabled: true,
        currency: "USD",
        coinmarketcap: "YOUR_API_KEY" // 可选,换算为美元成本
      }
    };

• 运行测试时自动生成 Gas 报告。

• 测试覆盖率检查(solidity-coverage)

• 运行:
bash npx hardhat coverage • 输出覆盖率报告,显示哪些代码未被测试覆盖。


5. 最佳实践

• 测试分类

• 单元测试 :聚焦单个函数逻辑,使用 Mock 隔离依赖。

• 集成测试 :验证多合约协作或真实网络行为。 • 断言优化

使用 Chai 的 .to.emit() 检查事件触发,或 .to.changeEtherBalance() 验证资产变化。


相关推荐
小羊没烦恼!7 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
Highcharts.js7 小时前
AI图表开发工具Highcharts Assist|自然语言生成图表代码
javascript·人工智能·highcharts·开发神器
志尊宝7 小时前
Vue3 零基础每日笔记(087):Vue3 高频面试题(下)
前端·javascript·vue.js·笔记·ecmascript·#vue.js
const_qiu9 小时前
第二章 2.6:初始化 NestJS 服务端 —— TypeScript 后端框架体验
前端·javascript·typescript
miofly10 小时前
GitHub 今日推荐|sweety-handdraw-video:文章转手绘口播视频
javascript·开源·github
用户831348593069811 小时前
Vue3 事件:常用用法与开发高频坑点
前端·javascript·vue.js
漫步人生走在路上11 小时前
用小语种SEO突破外贸B2B天花板:法语、德语市场的实测数据
开发语言·前端·javascript·人工智能·搜索引擎·ecmascript
ydjs678899-bot13 小时前
您的Next.js中间件匹配器配置可能会跳过您认为它保护的路由
开发语言·javascript·中间件
Chengbei1113 小时前
JsOwl|AI 赋能 JS 敏感信息扫描器,AST + 正则、source‑map 源码还原、登录态爬虫输出交互式 HTML 报告
开发语言·javascript·网络·人工智能·爬虫·网络安全·自动化
ShineWinsu14 小时前
对于JavaScript:初识JavaScript以及输入输出
java·开发语言·前端·javascript·css·面试·html