三层测试金字塔:GenLayer Project Boilerplate中Lint、Direct、Integration如何配合?
【免费下载链接】genlayer-project-boilerplate项目地址: https://gitcode.com/GitHub_Trending/gen/genlayer-project-boilerplate
GenLayer Project Boilerplate 是一个面向 AI 原生区块链 GenLayer 的智能合约项目模板,内置一个「足球竞猜」示例合约。它最大的亮点是自带一套三层测试金字塔:Lint 静态检查、Direct 内存快速测试、Integration 集成测试,三者速度从毫秒级到分钟级逐级递增,帮助新手和普通用户在不启动 GenLayer Studio 的情况下也能快速获得开发反馈。
为什么需要三层测试? 🤔
这个模板里的 contracts/football_bets.py 合约很特别:它会在链上直接访问网页、调用 LLM 提取比赛结果(见 contracts/football_bets.py 的_check_match方法)。
这类"AI 合约"如果每次都部署到链上再测,反馈太慢;但完全跳过链上验证,又可能漏掉共识问题。模板的解法就是用金字塔分层,把问题拦截在越靠左、越便宜的层级:
| 测试层级 | 命令 | 速度 | 需要 Studio |
|---|---|---|---|
| Lint 静态分析 | genvm-lint check contracts/*.py | ~250ms | 否 |
| Direct 内存测试 | pytest tests/direct/ -v | ~毫秒/测试 | 否 |
| Integration 集成测试 | gltest tests/integration/ -v -s | ~分钟/测试 | 是 |
第一层:Lint 静态分析,部署前的"体检" 🩺
Lint 层完全不需要运行任何链环境,一条命令即可:
genvm-lint check contracts/football_bets.py它能提前抓出的典型问题包括:
- 禁止的导入(如
os、sys、subprocess) - 非确定性调用出现在等价原则校验块之外
- 错误的存储类型(合约必须使用
TreeMap、DynArray、u256等,不能用普通dict/list) - 缺少装饰器或返回类型注解(如
@gl.public.view、@gl.public.write) - 裸 Python 异常(应使用
gl.vm.UserError或Exception)
规则说明可参考 CLAUDE.md 的 Linting 章节。这层相当于"写错语法立刻报警",成本几乎为零。
第二层:Direct 内存测试,毫秒级验证业务逻辑 ⚡
Direct 模式把合约直接部署在内存里,无需 GenLayer Studio,也不需要真实网络和 LLM——一切外部依赖都用 mock 模拟:
pytest tests/direct/ -v模板中 tests/direct/ 目录按业务拆成了三组测试:
- tests/direct/test_create_bet.py:下注逻辑,包括重复下注报错、多人下同一场比赛、注单 ID 小写化等边界场景
- tests/direct/test_resolve_bet.py:结算逻辑,用
mock_web模拟 BBC 体育比分页、mock_llm模拟 LLM 返回 JSON 比分,覆盖赢/输/平局/未结束等路径 - tests/direct/test_views.py:只读查询方法,如空状态、积分累计
几个关键 mock 能力(完整示例见 tests/direct/test_resolve_bet.py):
# 按 URL 正则 mock 网页内容 direct_vm.mock_web(r".*bbc\.com/sport/football.*", {"status": 200, "body": "..."}) # 按 prompt 正则 mock LLM 返回 direct_vm.mock_llm(r".*Extract the match result.*", '{"score": "1:0", "winner": 1}') # 断言合约应该报错 with direct_vm.expect_revert("Bet already created"): contract.create_bet("2024-06-20", "Spain", "Italy", "2")由于每个测试跑在毫秒级,它特别适合开发时"改一行测一次"的高频节奏,也为 AI 编程助手(Claude Code、Cursor 等)提供了快速迭代闭环。
第三层:Integration 集成测试,验证真实共识行为 🚀
Direct 模式再快,也是"模拟环境"。Integration 层把合约真实部署到 GenLayer Studio(本地 localnet 或托管 Studio),走真实的共识流程,包括网页访问和 LLM 调用的等价原则校验:
gltest tests/integration/ -v -s核心测试在 tests/integration/test_football_bets.py,例如 tests/integration/test_football_bets.py 完整走通"下注 → 查询 → 结算 → 积分到账"全链路,并用 tests/integration/fixtures.py 里预定义的"期望链上状态"做精确断言。
测试运行网络由 gltest.config.yaml 配置,默认指向本地http://127.0.0.1:4000/api,改配置即可切换网络。
三层如何配合:一条完整工作流 🔁
官方推荐的开发节奏(见 README.md 的 Testing Strategy 章节):
- 每次改完合约→ 跑 Lint,拦截低级错误
- 开发过程中→ 频繁跑 Direct 测试,秒级验证业务逻辑
- 部署上线前→ 跑一次 Integration,确认真实链上共识行为正确
对应到文件路径,就是:
- 合约本体:contracts/football_bets.py
- 快测:tests/direct/(
pytest执行) - 集成测试:tests/integration/(
gltest执行) - 部署脚本:deploy/deployScript.ts
CI 自动化:让前两层成为准入门槛 ✅
模板自带 CI 流水线 .github/workflows/ci.yml,每次提交 main 分支或发起 PR 时自动执行两个任务:
- Lint Contracts:运行
genvm-lint check contracts/football_bets.py - Direct Mode Tests:运行
pytest tests/direct/ -v
也就是说,Lint 和 Direct 两层完全不需要 Studio,就能在 CI 中为每一次提交把关;Integration 则留给部署前手动/定时执行。
快速上手:三步跑通三层测试 🛠️
# 1. 克隆项目并准备 Python 3.12 环境 git clone https://gitcode.com/GitHub_Trending/gen/genlayer-project-boilerplate cd genlayer-project-boilerplate python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt # 2. 第一层:Lint 静态分析 genvm-lint check contracts/football_bets.py # 3. 第二层:Direct 内存测试(毫秒级,无需 Studio) pytest tests/direct/ -v第三层 Integration 测试需要先启动 GenLayer Studio 后运行gltest tests/integration/ -v -s,详见 README.md 的 Quick Start 部分。
小结 🎯
GenLayer Project Boilerplate 的三层测试金字塔给了 AI 合约开发一个清晰的"反馈速度梯度":
- Lint:~250ms,静态规则拦截低级错误
- Direct:~毫秒级,mock 掉网络与 LLM,专注业务逻辑
- Integration:~分钟级,真实 Studio 上验证共识与外部调用
从静态检查到内存快测再到链上集成,每一层只解决自己那一层的问题——这正是新手学习测试分层设计的一个非常直观的开箱示例。
【免费下载链接】genlayer-project-boilerplate项目地址: https://gitcode.com/GitHub_Trending/gen/genlayer-project-boilerplate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考