🚀 我做了一个「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)

✅ 完成闭环:
👉 自然语言 → 真实执行


🧩 四、测试编排:不是一个用例,而是一整套流程

真实业务不会只有一个接口。

比如:

测试下单流程

其实是:

  1. 登录
  2. 查询商品
  3. 创建订单
  4. 支付

所以我做了一层:

👉 “任务拆解 + 编排”

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生成 → 系统执行
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐