NodeJS全栈WEB3面试题——P7工具链 测试
📊 7.1 Truffle vs Hardhat:各自的优势?
项目 | Truffle | Hardhat |
---|---|---|
📦 成熟度 | 老牌框架,社区大,文档全面 | 新一代框架,现代化设计 |
🧪 测试支持 | 内置 Mocha 测试框架 | 支持 Mocha + Chai,并集成 TypeScript |
⚡️ 运行速度 | 较慢 | 更快(使用 EVM 仿真器) |
🧰 插件生态 | 丰富但偏老旧 | 新插件多、活跃度高,如 hardhat-deploy |
🔎 调试体验 | 支持调试,但较弱 | 原生支持 Solidity 堆栈追踪,调试强大 |
🔄 兼容性 | 与 Ganache 配套使用好 | 可与 Alchemy、Infura、Ethers.js 集成更紧密 |
✅ 总结:我更偏向使用 Hardhat,特别是在实际开发和部署过程中,调试体验和部署脚本更灵活。
🧪 7.2 如何写 Solidity 单元测试?可以用哪些工具?
✅ 工具推荐:
-
Hardhat(+ Ethers.js + Chai)
-
Foundry(Rust 风格,速度极快)
-
Truffle + Web3.js
-
Remix IDE(适合新手快速调试)
✅ 编写步骤(以 Hardhat + Chai + Ethers 为例):
// 合约:contracts/Counter.sol
contract Counter {uint public count;function increment() public { count++; }
}
// 测试:test/Counter.test.js
const { expect } = require("chai");describe("Counter", function () {it("should increment count", async function () {const Counter = await ethers.getContractFactory("Counter");const counter = await Counter.deploy();await counter.increment();expect(await counter.count()).to.equal(1);});
});
📌 测试流程包括:部署合约、调用方法、断言状态。
🏡 7.3 怎样在本地模拟区块链?
✅ 常用方式:
-
Hardhat 本地节点:
npx hardhat node
-
自动创建10个账户,带私钥和余额;
-
可以配合 frontend 使用
http://localhost:8545
;
-
Ganache(GUI / CLI):
ganache-cli -p 8545
-
提供 GUI 模拟环境,适合测试多个账户交互;
-
可设置初始余额、区块时间间隔等;
-
Foundry 内置模拟环境(Forge):
-
Rust 风格测试,速度极快,适合高频测试。
-
Remix VM 环境:
-
Web IDE,不需安装,可快速部署和测试合约。
🧰 7.4 Ganache、Foundry、Remix 各自的使用场景?
工具 | 适用场景 | 特点 |
---|---|---|
Ganache | 本地部署、多账户交互测试 | GUI 直观、Truffle 配套 |
Foundry | 高性能单元测试、CI | 快速(原生 Rust 编译)、支持 Solidity 单测 |
Remix | 学习、新手测试、PoC 快速验证 | Web 版无需环境、内置 VM、调试易用 |
📌 我的使用经验是:
-
开发初期:Remix 快速写合约;
-
中期集成测试:Hardhat + Ganache;
-
高速单测或 fuzzing:用 Foundry 更适合团队协作和 CI。
🚀 7.5 如何部署一个合约到测试网(如 Goerli)?
✅ 使用 Hardhat 步骤:
-
安装依赖:
npm install --save-dev hardhat ethers dotenv
-
配置网络(hardhat.config.js):
require('dotenv').config();
module.exports = {networks: {goerli: {url: process.env.GOERLI_RPC_URL,accounts: [process.env.PRIVATE_KEY]}},solidity: "0.8.20"
};
-
编写部署脚本:
async function main() {const [deployer] = await ethers.getSigners();const Counter = await ethers.getContractFactory("Counter");const counter = await Counter.deploy();console.log("Counter deployed to:", counter.address);
}
main();
-
部署命令:
npx hardhat run scripts/deploy.js --network goerli
-
环境变量(.env):
GOERLI_RPC_URL=https://eth-goerli.g.alchemy.com/v2/yourKey
PRIVATE_KEY=yourPrivateKey
📌 注意事项:
-
测试币可以通过 Goerli Faucet 获取;
-
部署前确保 gas 充足,网络正常;
-
可用
verify
插件在 Etherscan 上自动验证源码。