FullScopeTest 项目复盘
FullScopeTest是一个AI驱动的自动化测试平台,旨在通过自然语言指令自动生成和执行测试。核心架构包括LLM解析意图、Function Calling结构化测试任务、Celery调度系统和多类型测试执行器(API/UI/性能)。关键技术点在于:1)强约束Prompt确保输出结构化JSON;2)Function Calling实现自然语言到可执行代码的转换;3)任务编排支持复杂业务流程测试。
🚀 我做了一个「AI 自动写测试 + 自动执行」的平台(FullScopeTest 项目复盘)
最近在做一个比较有意思的项目:
👉 FullScopeTest —— 一个 AI 辅助的自动化测试平台(github地址:https://github.com/05Huang/FullScopeTest)
简单来说,我想解决一个问题:
❗为什么写测试这么痛苦?而且回归测试还要一遍一遍人工点?
所以我做了一件有点“野”的事情:
👉 让 AI 直接帮我写测试,并自动执行
这篇主要讲最核心的一点:
👉 AI 测试编排与调度(Prompt + Function Calling)到底是怎么落地的
🧠 一、最初的想法:能不能直接“说人话做测试”?
我一开始的设想其实很简单:
测试登录功能,包括:
1. 正确账号密码
2. 错误密码
3. 空输入
👉 如果是人工,你会怎么做?
- 写接口用例 / UI脚本
- 构造测试数据
- 配环境
- 执行测试
- 看结果
👉 那如果交给 AI 呢?
我希望它能变成:
输入一句话 → 自动变成测试步骤 → 自动执行 → 出报告
⚙️ 二、整体架构(核心链路)
我现在这套链路是这样的:
自然语言
↓
LLM(解析意图)
↓
Function Calling(结构化)
↓
测试任务(JSON)
↓
调度系统(Celery)
↓
执行器(Playwright / Locust / API)
一句话总结:
👉 AI负责“想”,系统负责“干”
🔍 三、关键实现:自然语言 → 可执行测试
这是面试最容易被拷打的地方,我也踩了很多坑。
1️⃣ Prompt 不是随便写的
一开始我写 Prompt 很简单,比如:
请帮我生成测试步骤
👉 结果:输出一堆废话,完全不可执行
后来我改成强结构约束 Prompt:
你是一个测试工程师,请将用户需求转换为测试任务。
输出格式必须为 JSON:
{
"task_type": "",
"steps": [],
"params": {}
}
然后加规则:
- 必须拆步骤
- 必须给参数
- 不允许解释
- 不允许自然语言
👉 这一步非常关键:
不约束 = 完全不可控
2️⃣ Function Calling 才是“落地关键”
光有 Prompt 还不够,因为:
👉 LLM 会“编”,但不会“执行”
所以我设计了一套 Function:
{
"name": "run_api_test",
"parameters": {
"url": "string",
"method": "GET/POST",
"data": "object"
}
}
然后让 LLM:
👉 不要生成文本,而是“调用函数”
举个真实例子👇
用户输入:
测试登录接口,用户名 admin,密码错误
LLM 输出:
{
"function": "run_api_test",
"arguments": {
"url": "/login",
"method": "POST",
"data": {
"username": "admin",
"password": "wrong"
}
}
}
👉 这时候我后端直接:
run_api_test(**arguments)
✅ 完成闭环:
👉 自然语言 → 真实执行
🧩 四、测试编排:不是一个用例,而是一整套流程
真实业务不会只有一个接口。
比如:
测试下单流程
其实是:
- 登录
- 查询商品
- 创建订单
- 支付
所以我做了一层:
👉 “任务拆解 + 编排”
LLM 会输出类似:
[
{"step": "login"},
{"step": "get_product"},
{"step": "create_order"},
{"step": "pay"}
]
然后我在后端做:
for step in plan:
dispatch(step)
👉 再结合 Celery:
- 异步执行
- 支持并发
- 支持失败重试
⚡ 五、调度系统(Celery 做了什么)
这里其实是整个系统“能跑起来”的关键。
我做了几件事:
✅ 1. 异步执行测试任务
@celery.task
def run_test(task):
...
👉 避免阻塞,支持大规模测试
✅ 2. 支持并发压测
结合 Locust:
- 多 worker
- 模拟用户并发
✅ 3. 支持任务重试
retry(countdown=5, max_retries=3)
👉 解决:
- 网络抖动
- 临时服务异常
🧪 六、执行层(我怎么落地测试)
不同类型测试我分开处理:
👉 API 测试
- 用 requests / 自封装
- 支持参数动态生成
👉 UI 测试(Playwright)
AI生成:
点击登录按钮 → 输入用户名 → 提交
转成:
page.click("#login")
page.fill("#username", "admin")
👉 性能测试(Locust)
AI只负责:
👉 生成压测场景
我负责:
👉 转成 Locust 用户行为
🤯 七、我踩过的坑(这部分面试加分)
❌ 1. LLM 输出不稳定
- 同一个输入 → 不同结果
- JSON 格式经常错
👉 解决:
- 强约束 Prompt
- JSON schema 校验
- 失败重试
❌ 2. AI“想太多”
比如:
测试登录
它可能帮你“设计系统”
👉 解决:
👉 限制角色 + 限制输出范围
❌ 3. 幻觉问题(最致命)
AI会编接口:
/api/login_v2
👉 根本不存在
👉 解决:
- 接入 Swagger
- 做接口白名单校验
📉 八、这个项目到底解决了什么?
✅ 以前
- 写测试慢
- 回归靠人
- 覆盖率低
✅ 现在
- 一句话生成测试
- 自动执行
- 自动报告
👉 最直观变化:
🔥 回归测试从“人工点一天” → “自动跑十几分钟”
💡 九、我自己的理解
这个项目让我真正理解了一件事:
❗AI不是替代测试,而是改变“测试的生产方式”
以前是:
人写用例 → 执行
现在是:
人提需求 → AI生成 → 系统执行
更多推荐

所有评论(0)