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文件。
- 账户配置主要是为了方便测试,设置的默认钱包账号,可扩展不同的用户组
- 网络配置是配置各网络RPC的节点信息(rpc地址、chain_id、gas策略、浏览器等)
- 项目配置是配置项目的相关信息(域名、各环境api地址、项目合约地址、支持的链、默认用户等)
框架核心代码
config下的loader.py是基础配置加载类,该类可以加载指定项目的账号、网络、项目信息配置;区块链核心代码规划了账户管理、合约编译部署、合约交互管理、交易管理四个部分;中心化模块service下http_client类是抽象的基础接口(封装了requests);utils中主要是全局通用的工具类
其中区块链核心代码中:
- 账户管理中manage类(生成账户管理池、持久化临时账户等),wallet类(生成钱包、钱包校验、消息签名、交易签名等)
- 合约编译部署目前未实现
- 合约交互管理中abi_loader类(加载本地、标准合约、远程的abi文件),contract_loader类(通过abi对合约实例化),contract_handler类(合约的抽象方法封装)
- 交易管理中gas_estimator类(gas计算),transaction_builder(缓存nonce、交易构建),transaction_sender(广播并等待交易确认)
用例组织
DApp项目与传统的项目的区别在于,某些流程需要额外进行合约交互,其中涉及到钱包签名等操作,而传统项目一般是使用登录的token进行全局交互,于是针对每个项目的验证点,设计了项目接口、项目数据逻辑、项目合约三个模块,另外data作为项目数据(合约abi文件、用户数据),utils作为项目工具类
- 针对DApp项目特点,在项目接口模块中又划分了三层,一是项目接口层,该层定义所有需要测试的接口,继承基础接口类,二是用户合约交互层,该层继承项目接口层,新增合约交互方法,三是用户业务层,该层为用户的操作业务的接口组合,包括中心化与去中心化的组合
- 项目数据逻辑模块,主要是对项目中数据计算的公式等需求进行测试(可选)
- 项目合约模块中,项目合约类主要是实例化项目合约,通过contract_handler类进行合约交互
- data目录作为测试数据的存放,目前部分业务数据也是放在这里
- utils目录作为项目工具的存放,目前把接口数据类放在这里,后续可完全实现接口的参数建模
- 最后在全局conftest.py中定义前置逻辑,可根据情况使用项目级的conftest.py,在tests目录下编写业务场景的测试用例,使用 Fixture 注入依赖,让测试函数只关注“断言”
后记
由上可知DApp框架可实现基础的中心化接口测试、去中心化接口测试以及两者的混合架构测试,但是依旧存在一些明显的问题需要后面解决,比如框架没有日志调试、测试报告、自动化集成、脚手架等功能,也存在钱包私钥存储不够安全的风险。
目前核心代码已上传github:web3_test_framework