当前位置: 首页 > news >正文

hardhat 3 测试框架选择

Hardhat 3 中有两个选项,要如何选择呢?
在这里插入图片描述
先看看它们的区别吧:

主要区别

选项1:Node Test Runner + Viem

  • 测试框架:使用 Node.js 内置的 Test Runner(Node.js 18+原生支持)
  • 以太坊库:使用 Viem(现代化的以太坊交互库)

选项2:Mocha + Ethers.js

  • 测试框架:使用 Mocha(传统的JavaScript测试框架)
  • 以太坊库:使用 Ethers.js(经典的以太坊交互库)

相同的目录结构

my-project/
├── contracts/
│   └── Lock.sol
├── scripts/
│   └── deploy.ts
├── test/
│   └── Lock.test.ts
├── hardhat.config.ts
├── package.json
├── tsconfig.json
└── README.md

相同的 Hardhat 指令

两个版本都支持完全相同的 Hardhat 命令:

# 编译合约
npx hardhat compile# 运行测试
npx hardhat test# 部署脚本
npx hardhat run scripts/deploy.ts# 启动本地网络
npx hardhat node# 其他标准指令
npx hardhat help
npx hardhat clean
npx hardhat verify

主要差异总结

相同部分:

  • 项目目录结构 ✅
  • Hardhat 配置文件结构 ✅
  • 所有 CLI 指令 ✅
  • Solidity 合约代码 ✅
  • package.json 中的脚本命令 ✅

不同部分:

  • 测试文件的导入和语法
  • 部署脚本的库调用方式
  • package.json 中的依赖包(一个用 viem,一个用 ethers)
  • hardhat.config.ts 中可能有不同的插件配置

这两个选项本质上提供了相同的开发体验和工作流程,只是在具体的代码实现语法上有差异。

两个选项创建的项目在文件结构上基本相似,但在以下文件中有语法差异:

测试文件语法差异

Node Test Runner + Viem 版本:

// test/Lock.test.ts
import { describe, it } from "node:test";
import { expect } from "chai";
import { viem } from "hardhat";
import { getAddress, parseEther } from "viem";describe("Lock", () => {it("Should deploy with correct unlock time", async () => {const unlockTime = Math.floor(Date.now() / 1000) + 60;const lockedAmount = parseEther("1");const lock = await viem.deployContract("Lock", [unlockTime], {value: lockedAmount,});expect(await lock.read.unlockTime()).to.equal(unlockTime);});
});

Mocha + Ethers.js 版本:

// test/Lock.test.ts
import { expect } from "chai";
import { ethers } from "hardhat";
import { time } from "@nomicfoundation/hardhat-toolbox/network-helpers";describe("Lock", function () {it("Should deploy with correct unlock time", async function () {const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60;const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS;const lockedAmount = ethers.parseEther("1");const Lock = await ethers.getContractFactory("Lock");const lock = await Lock.deploy(unlockTime, { value: lockedAmount });expect(await lock.unlockTime()).to.equal(unlockTime);});
});

部署脚本差异

Node Test Runner + Viem 版本:

// scripts/deploy.ts
import { viem } from "hardhat";
import { formatEther, parseEther } from "viem";async function main() {const unlockTime = Math.floor(Date.now() / 1000) + 60;const lockedAmount = parseEther("0.001");const lock = await viem.deployContract("Lock", [unlockTime], {value: lockedAmount,});console.log(`Lock deployed to ${lock.address}`);
}

Mocha + Ethers.js 版本:

// scripts/deploy.ts
import { ethers } from "hardhat";async function main() {const currentTimestampInSeconds = Math.round(Date.now() / 1000);const unlockTime = currentTimestampInSeconds + 60;const lockedAmount = ethers.parseEther("0.001");const lock = await ethers.deployContract("Lock", [unlockTime], {value: lockedAmount,});await lock.waitForDeployment();console.log(`Lock deployed to ${await lock.getAddress()}`);
}

选择建议

选择 Node Test Runner + Viem 如果:

  • 你想使用更现代的工具栈
  • 项目不需要复杂的测试功能
  • 你喜欢更轻量级的测试运行器
  • 想要更好的TypeScript支持和类型安全

选择 Mocha + Ethers.js 如果:

  • 你更熟悉传统的测试框架
  • 需要更丰富的测试功能和插件生态
  • 团队已经熟悉Ethers.js
  • 需要更成熟的生态系统支持

总的来说,两个选项都能完成相同的功能,主要是在开发体验和语法风格上有所不同。

http://www.dtcms.com/a/359861.html

相关文章:

  • 十分钟快速掌握 YML YAML 文件
  • LLM记账智能体-MCP服务-实现步骤与效果展示
  • Qt精华版打包教程,支持windows和Linux,每种平台支持2种方案
  • MCP SDK 示例一
  • Spring MVC 九大组件源码深度剖析(六):HandlerExceptionResolver - 异常处理的艺术
  • 第八章 光照
  • 蓝牙AOA智慧仓储管理系统:实现仓储数字化升级的精准定位解决方案
  • 解决IDEA 2025.2升级报错:Scannning Files to Index卡住问题分析与修复
  • python复杂代码如何让ide自动推导提示内容
  • 【系列12】端侧AI:构建与部署高效的本地化AI模型 第11章:边缘设备与IoT部署
  • Wi-Fi技术——网络安全
  • 现代软件系统架构:前端、后端、数据库、部署、算法与AI学习的结构与交互分析
  • 学习:uniapp全栈微信小程序vue3后台(8)
  • USB虚拟化应用5:VirtualFIDO2 虚拟硬件安全密钥,智能卡,yubico,支持X,FB,GITHUB等各种网站双重认证,让你的账户登录绝对安全
  • LeetCode 1855.下标对中的最大距离
  • a3002盘式制动器刹车cad➕三维图➕设计说明书
  • DreamForge
  • leetcode 268 丢失的数字
  • 前端学习——JavaScript基础
  • Vue2 与 Vue3 路由钩子的区别及用法详解
  • 电科金仓KingbaseES V9数据库:国产数据库的自主创新与行业实践深度解析
  • Nginx四层负载均衡实战指南
  • Redis 7.0 高性能缓存架构设计与优化
  • Spring Data JPA 派生查询方法命名速查表
  • 【51单片机】【protues仿真】基于51单片机智能晾衣架系统
  • git中使用SSH的配置
  • 从零开始搭建使用 TDengine:新用户快速上手指南
  • STAR法则
  • Encoder编码器
  • kafka服务端架构总览