news 2026/10/16 22:44:10

三层测试金字塔:GenLayer Project Boilerplate中Lint、Direct、Integration如何配合?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
三层测试金字塔:GenLayer Project Boilerplate中Lint、Direct、Integration如何配合?

三层测试金字塔: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 章节):

  1. 每次改完合约→ 跑 Lint,拦截低级错误
  2. 开发过程中→ 频繁跑 Direct 测试,秒级验证业务逻辑
  3. 部署上线前→ 跑一次 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 11:39:05

2026企业网盘横评:协作、安全、性能与迁移避坑指南

1. 2026年再做企业网盘测评,到底该看什么先说明一下背景。我这些年一直在甲方做企业数字化相关的工作,从最早的FTP、共享文件夹,到后来的个人版网盘转企业版,再到现在的多云架构,经手过的网盘系统少说也有十来款。2026…

作者头像 李华
网站建设 2026/10/16 15:35:20

用纯文本搭建个人知识库:从收藏夹到系统的完整实践

记笔记这件事,我断断续续做了快十年,前五年基本是在做数字垃圾的搬运工:今天看到一篇好文章,复制粘贴进收藏夹;明天听了一场分享,拍几张PPT照片丢进相册;后天冒出个想法,随手敲在手机…

作者头像 李华
网站建设 2026/10/15 13:39:35

新闻文本情感分析:TF-IDF与依存句法融合实战

简介:这份资源面向新闻文本情感分析方向的初学者与算法实践者,提供一套可运行的完整项目代码,用于对新闻语料进行情感倾向计算。项目以TF-IDF完成文本向量化,结合余弦距离度量文本相似度,并引入情感依存分析思路&#…

作者头像 李华
网站建设 2026/10/16 1:32:41

基于PJ85718DM与PIC32MZ的嵌入式HVAC温度监测系统设计与实现

1. 项目缘起与整体设计思路嵌入式温度监测这个方向,看起来简单,真做起来坑不少。我接手过好几个涉及本地温度采集加远程温度上报的项目,从工业控制柜到商用空调控制器都有,最头疼的从来不是传感器本身,而是怎么把本地采…

作者头像 李华
网站建设 2026/10/14 7:29:37

Python类多重继承方式

前言 绝大多数面向对象语言只支持单继承:一个类只能有一个直接父类。Python 是少数原生支持多重继承的主流语言——一个类可以同时继承多个基类,写成 class C(A, B): ...。 多重继承的强大之处在于可以把若干"能力片段"拼装进一个类&#xff0…

作者头像 李华
网站建设 2026/10/17 5:35:15

Agent工具调用:CLI为何比MCP更务实?

开头要直接引入话题,不要欢迎词。Agent开发这圈子最近一年的路线争论很有意思。一边是MCP(Model Context Protocol)被捧上神坛,各路框架、平台都在抢着接入,感觉不聊MCP都不好意思说自己在做Agent;另一边是…

作者头像 李华