代码改变世界

web3的DApp测试框架设计(二)

2025-05-06 22:37  第二个卿老师  阅读(28)  评论(0)    收藏  举报

web3的DApp测试框架设计优化

之前说过框架存在一些问题:

  • 测试用例层级划分不够清晰
  • 测试数据与测试用例分离不够彻底
  • 项目测试数据有点杂乱
  • 整体框架中部分文件存在冗余
  • 框架上手成本较大

目录结构优化

针对以上问题,并结合测试实践的结果,优化目录结构如下

# 项目根目录
├── config                           # 配置文件目录
│   ├── accounts.yaml                # 账户配置
│   ├── networks.yaml                # 网络配置
│   └── projects.yaml                # 项目配置
├── conftest.py                      # Pytest 全局 fixture
├── contracts/                       # Solidity 智能合约源文件
├── projects/                        # 各项目特定代码和数据
│   └── cc/
│       ├── api/                     # 项目接口
│       │   ├── cc_api.py            # 项目接口层
│       │   ├── cc_user.py           # 用户交互层
│       │   └── cc_service.py        # 用户业务层
│       ├── business_logic/          # 项目逻辑和计算规则
│       │   ├── ask_cost.py
│       │   ├── share_award.py
│       ├── contracts/               # 项目合约相关
│       │   ├── cc_abi.json          # 合约abi
│       │   └── cc_contract.py       # 项目合约抽象
│       ├── data/                    # 项目数据
│       │   ├── Contract_Documentation.md    # 合约接口文档
│       │   └── accounts_base.json           # 项目账号数据
│       └── utils/                   # 项目特定工具(如果需要)
├── artifacts/                       # 编译输出目录(自动生成)
│   ├── ERC20/
│   │   ├── ERC20.json
│   │   └── ERC20.dbg.json
│   └── Marketplace.json
├── libs/                            # 合约依赖仓库
│   └── openzeppelin/
│       └── ERC721/
│           └── 5.0.1/
│               └── ERC721.json
├── README.md
├── scripts/                         # 部署和维护脚本(可选)
│   └── upgrade_contract.py
├── tests/                           # 测试用例目录
│   └── cc/
│       ├── test_cost.py
│       └── test_service.py
│   └── examples/                    # 示例测试(可选)
│       └── test_transfer_utils.py
├── web3_test_framework/             # 框架核心代码
│   ├── config/                      # 配置加载器
│   │   └── loader.py
│   ├── web3_core/                   # 区块链核心模块
│   │   ├── account/                 # 账户管理
│   │   │   ├── manager.py
│   │   │   └── wallet.py
│   │   ├── blockchain/              # 编译部署
│   │   │   ├── compiler.py
│   │   │   └── deploy.py
│   │   │   └── upgrade.py
│   │   ├── contract/                # 合约交互管理
│   │   │   ├── abi_loader.py
│   │   │   ├── contract_handler.py
│   │   │   └── contract_loader.py
│   │   └── transaction/             # 交易管理
│   │       ├── gas_estimator.py
│   │       ├── transaction_builder.py
│   │       └── transaction_sender.py
│   ├── services/                    # 中心化服务测试模块
│   │   ├── db_connector.py
│   │   └── http_client.py
│   └── utils/                       # 通用工具类
│       ├── abi_summary.py
│       ├── contract_tool.py
│       ├── file_util.py
│       ├── transfer_utils.py
│       └── wallet_batch_generator.py

上述目录结构主要是优化了项目文件与用例的组织形式,核心逻辑基本没大变化,其中合约的单元测试后续实践后再设计。

框架解释(具体代码参考上一篇

基础配置

目前配置分为了三块,包括账户配置、网络配置、项目配置,如果数据不多,三个文件可以整合成一个config.yaml文件。

  1. 账户配置主要是为了方便测试,设置的默认钱包账号,可扩展不同的用户组
  2. 网络配置是配置各网络RPC的节点信息(rpc地址、chain_id、gas策略、浏览器等)
  3. 项目配置是配置项目的相关信息(域名、各环境api地址、项目合约地址、支持的链、默认用户等)

框架核心代码

config下的loader.py是基础配置加载类,该类可以加载指定项目的账号、网络、项目信息配置;区块链核心代码规划了账户管理、合约编译部署、合约交互管理、交易管理四个部分;中心化模块service下http_client类是抽象的基础接口(封装了requests);utils中主要是全局通用的工具类
其中区块链核心代码中:

  1. 账户管理中manage类(生成账户管理池、持久化临时账户等),wallet类(生成钱包、钱包校验、消息签名、交易签名等)
  2. 合约编译部署目前未实现
  3. 合约交互管理中abi_loader类(加载本地、标准合约、远程的abi文件),contract_loader类(通过abi对合约实例化),contract_handler类(合约的抽象方法封装)
  4. 交易管理中gas_estimator类(gas计算),transaction_builder(缓存nonce、交易构建),transaction_sender(广播并等待交易确认)

用例组织

DApp项目与传统的项目的区别在于,某些流程需要额外进行合约交互,其中涉及到钱包签名等操作,而传统项目一般是使用登录的token进行全局交互,于是针对每个项目的验证点,设计了项目接口、项目数据逻辑、项目合约三个模块,另外data作为项目数据(合约abi文件、用户数据),utils作为项目工具类

  1. 针对DApp项目特点,在项目接口模块中又划分了三层,一是项目接口层,该层定义所有需要测试的接口,继承基础接口类,二是用户合约交互层,该层继承项目接口层,新增合约交互方法,三是用户业务层,该层为用户的操作业务的接口组合,包括中心化与去中心化的组合
  2. 项目数据逻辑模块,主要是对项目中数据计算的公式等需求进行测试(可选)
  3. 项目合约模块中,项目合约类主要是实例化项目合约,通过contract_handler类进行合约交互
  4. data目录作为测试数据的存放,目前部分业务数据也是放在这里
  5. utils目录作为项目工具的存放,目前把接口数据类放在这里,后续可完全实现接口的参数建模
  6. 最后在全局conftest.py中定义前置逻辑,可根据情况使用项目级的conftest.py,在tests目录下编写业务场景的测试用例,使用 Fixture 注入依赖,让测试函数只关注“断言”

后记

由上可知DApp框架可实现基础的中心化接口测试、去中心化接口测试以及两者的混合架构测试,但是依旧存在一些明显的问题需要后面解决,比如框架没有日志调试、测试报告、自动化集成、脚手架等功能,也存在钱包私钥存储不够安全的风险。

目前核心代码已上传github:web3_test_framework