GitHub_Trending/bl/block-tech-sharing测试自动化:区块链端到端测试框架搭建
在区块链开发中,手动测试智能合约和链上脚本不仅耗时,还容易因人为操作失误导致资产损失。本文将基于block-tech-sharing项目的现有脚本架构,构建一套覆盖多链交易、跨链转账和智能合约交互的端到端测试框架,帮助开发者快速验证代码可靠性。
测试框架核心组件设计
区块链测试框架需解决三大核心问题:多链环境管理、交易原子性验证和异常场景恢复。基于项目现有架构,我们可复用以下模块构建测试基础设施:
- 多链RPC配置:solidity-nodejs-script/utils/cctp.js中已定义Ethereum、链A等网络的RPC节点和合约地址,可直接作为测试环境的链配置来源
- 交易抽象层:利用airdrop-nodejs-script/scripts/initia/batch-transfer.js中的转账逻辑,封装通用交易发送函数
- 跨链验证模块:改造solidity-nodejs-script/scripts/circle/cctp.js中的状态检查逻辑,实现跨链交易的端到端确认
测试目录结构设计
在项目根目录下新增测试框架目录,结构如下:
/tests
/e2e # 端到端测试用例
/initia # Initia链测试集
/aptos # Aptos链测试集
/cross-chain # 跨链场景测试
/utils # 测试工具函数
test-helpers.js # 包含合约部署、余额检查等通用方法
/config # 测试环境配置
test-networks.js # 测试网RPC和账户配置
基础测试用例实现
以USDC跨链转账测试为例,基于Circle CCTP协议的测试用例可复用项目现有脚本逻辑,添加断言和异常处理后实现自动化验证:
const { expect } = require('chai');
const cctpUtils = require('../../solidity-nodejs-script/utils/cctp');
const { getBalance } = require('../utils/test-helpers');
describe('CCTP跨链转账测试', function() {
this.timeout(300000); // 区块链交易需较长超时时间
it('应成功将0.1 USDC从Arbitrum测试网转到链A测试网', async () => {
// 1. 准备测试账户和初始余额
const fromPrivKey = process.env.TEST_FROM_KEY;
const toPrivKey = process.env.TEST_TO_KEY;
const initialBalance = await getBalance('链A', toPrivKey, 'USDC');
// 2. 执行跨链转账 (复用项目现有CCTP实现)
const result = await cctpUtils.cctp(
cctpUtils.$network_config,
'TestNet',
'链A',
'Arbitrum',
fromPrivKey,
toPrivKey,
'0.1'
);
// 3. 验证交易状态
expect(result.status).to.equal('received');
// 4. 验证目标链余额增加
const finalBalance = await getBalance('链A', toPrivKey, 'USDC');
expect(finalBalance).to.equal(initialBalance + 0.1);
});
it('应正确处理跨链交易中断恢复', async () => {
// 测试异常场景: 模拟存款成功但接收交易失败的恢复流程
const recoveryResult = await cctpUtils.recover_cctp(
cctpUtils.$network_config,
'TestNet',
'链A',
'Arbitrum',
process.env.TEST_TO_KEY,
'0x...depositTxHash...' // 从失败的交易中获取
);
expect(recoveryResult.status).to.equal('received');
});
});
智能合约测试集成
对于Solidity合约测试,可结合项目中的生产级合约代码构建测试套件。以solidity/production/Joepeg.sol为例,使用Hardhat测试框架编写测试用例:
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Joepeg合约测试", function () {
let joepeg;
let owner;
let user;
beforeEach(async function () {
// 部署合约
[owner, user] = await ethers.getSigners();
const Joepeg = await ethers.getContractFactory("Joepeg");
joepeg = await Joepeg.deploy();
await joepeg.deployed();
});
it("应正确铸造NFT并设置所有权", async function () {
// 调用合约铸造方法
await joepeg.connect(user).mint("https://metadata.example.com/1");
// 验证所有权
expect(await joepeg.ownerOf(1)).to.equal(user.address);
// 验证元数据
expect(await joepeg.tokenURI(1)).to.equal("https://metadata.example.com/1");
});
});
测试执行与报告生成
在项目根目录的package.json
中添加测试脚本:
"scripts": {
"test": "mocha tests/e2e/**/*.test.js --reporter mochawesome",
"test:initia": "mocha tests/e2e/initia/**/*.test.js",
"test:cross-chain": "mocha tests/e2e/cross-chain/**/*.test.js"
}
执行测试并生成报告:
# 安装测试依赖
npm install --save-dev mocha chai ethers hardhat mochawesome
# 运行所有测试
npm test
# 仅运行跨链测试
npm run test:cross-chain
测试报告将生成在mochawesome-report
目录下,包含详细的测试结果和失败用例截图。
持续集成配置
为实现提交代码时自动触发测试,可在项目根目录添加GitHub Actions配置文件.github/workflows/test.yml
:
name: 区块链测试自动化
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: 设置Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: 安装依赖
run: npm install
- name: 运行端到端测试
run: npm test
env:
TEST_FROM_KEY: ${{ secrets.TEST_FROM_KEY }}
TEST_TO_KEY: ${{ secrets.TEST_TO_KEY }}
ARBITRUM_RPC: ${{ secrets.ARBITRUM_RPC }}
链A_RPC: ${{ secrets.链A_RPC }}
测试框架扩展建议
- 多链测试并行化:使用mocha-parallel-tests提升测试速度
- 测试数据隔离:为每个测试用例创建独立的测试账户,避免状态污染
- 智能合约覆盖率:集成solidity-coverage生成覆盖率报告
- 链下脚本测试:对sui-nodejs-script/scripts/examples等链下脚本添加单元测试
通过以上框架,开发者可快速验证新功能是否破坏现有逻辑,确保区块链应用在多链环境中的可靠性和安全性。完整测试框架代码可参考项目web3-foolstack-template中的前端测试架构进行扩展。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考