ChatGPT生成测试用例Prompt实战:从效率瓶颈到自动化解决方案
ChatGPT生成测试用例Prompt实战:从效率瓶颈到自动化解决方案
-
背景:手动写用例的“老三难”
过去两年,我们所在业务线保持两周一次迭代,测试同学最头疼的不是执行,而是“写”:- 重复劳动:登录、下单、退款的正逆向流程,80%字段雷同,复制粘贴到手软
- 边界遗漏:时间、金额、特殊字符等异常场景靠人脑枚举,上线后仍被线上用户“教做人”
- 维护黑洞:需求一改,用例跟着改,Excel+XMind 双向同步,漏掉一条就是P0故障
结果,测试成为交付瓶颈,开发完成编码后常要等2-3天才能提测。团队一度考虑加人,但“堆人”显然不是可持续方案,于是把目光投向AI生成。
-
技术路线对比:传统框架 vs 商业工具 vs ChatGPT
在正式动手前,我们拉了个横向对比表,把“能跑起来”与“能跑得快”拆开看:- 传统单元测试框架(pytest/unittest)
数据准备:需提前在代码或YAML里硬编码,新增字段要改脚本
维护成本:需求变更→改代码→重跑,回归链路长
灵活度:高,可自定义断言,但“写”的效率低 - 商业BDT工具(如某知名关键字驱动平台)
数据准备:可视化拖拽,上手快
维护成本:版本升级、License、插件兼容,一言难尽
灵活度:中,内置模板丰富,遇到非标控件要写Java脚本 - ChatGPT Prompt方案
数据准备:零代码,需求文档直接喂给模型
维护成本:Prompt即文档,改需求只改Prompt
灵活度:高,支持多语言、多格式输出,可无缝嵌入CI
结论:在“写得快+改得快”维度,AI生成胜出;在“断言精准”维度,仍需二次校验。于是决定“AI生成+轻量规则层”双轮驱动。
- 传统单元测试框架(pytest/unittest)
-
核心实现:让GPT乖乖输出“能跑的用例”
3.1 Prompt设计四要素
经过二十多次盲测,我们总结出“R-I-O-E”模板:
- Role:给它一个身份,“你是一名有10年经验的测试架构师,熟悉电商业务”
- Input:给上下文,“以下是一份PRD片段,包含字段、类型、边界值”
- Output:给格式,“返回pytest参数化代码,包含id、input、expect三列”
- Example:给一条少而全的示例,让模型照猫画虎
把四要素写进同一段Prompt,token控制在600以内,既省钱又能命中要害。
3.2 Python 3.10+调用封装
下面这段代码可直接放utils/gpt_case.py,支持重试、异常、流式返回:
from __future__ import annotations
import os, openai, tenacity, json
from typing import List
@tenacity.retry(stop=tenacity.stop_after_attempt(3), wait=tenacity.wait_exponential(multiplier=1, min=4, max=10))
def generate_cases(prompt: str, n: int = 5, temperature: float = 0.3) -> List[str]:
try:
resp = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
max_tokens=2000,
n=n,
stop=["```end```"],
)
return [choice["message"]["content"].strip() for choice in resp["choices"]]
except openai.error.OpenAIError as e:
print(f"[GPT] {e.__class__.__name__}: {e}")
raise
注意:
- 用
stop截断,避免模型啰嗦 temperature=0.3兼顾稳定与多样- 返回List方便后续并发校验
3.3 序列图:一次生成到执行的完整闭环
sequenceDiagram
participant Dev as 开发者
participant GPT as ChatGPT
participant Val as 校验层
participant Py as pytest
Dev->>GPT: 发送PRD+Prompt
GPT-->>Dev: 返回pytest列表
Dev->>Val: 语法+业务规则检查
Val-->>Dev: 过滤后可用用例
Dev->>Py: 参数化执行
Py-->>Dev: 测试报告
- 生产实践:让AI写的不“裸奔”
4.1 校验层设计
只依赖GPT容易“幻觉”,我们在本地加了两道阀门:- 语法检查:用
ast.parse确保生成的是合法Python,捕获SyntaxError立刻丢弃 - 业务规则过滤:把“金额>0”“手机号11位”等硬规则写进
rules.json,正则批量扫描,命中即留,否则退回重写
代码片段:
import ast, re, json def lint_and_filter(raw_cases: List[str]) -> List[str]: valid = [] rules = json.load(open("config/rules.json")) for case in raw_cases: try: ast.parse(case) except SyntaxError: continue if all(re.search(r["pattern"], case) for r in rules): valid.append(case) return valid - 语法检查:用
4.2 pytest集成hook
不想手动复制?在conftest.py加一段pytest_generate_tests,让框架自动把生成好的用例喂给参数化:
def pytest_generate_tests(metafunc):
if "case" in metafunc.fixturenames:
metafunc.parametrize("case", load_cases_from_file(), ids=lambda c: c.id)
这样pytest -n auto就能并行跑AI产出的用例,CI耗时从40min降到12min。
-
避坑指南:Prompt说错一句,GPT“放飞自我”
- 幻觉优化
- 负面提示:在Prompt末尾加“不要生成登录成功后再登录的无效场景”
- 字段白名单:明确“只能使用PRD出现的枚举值”
- 自洽抽查:让GPT先输出5条,再自问“哪条不合理”,把自审结果也返回,二次过滤
- 敏感数据脱敏
真实手机号、身份证用Faker占位符,Prompt里写“所有示例数据请使用Mock”,并在校验层加正则^1[3-9]\d{9}$→13800138000,防止训练数据泄露。
- 幻觉优化
-
性能对比:100条用例耗时实测
在同一台4核8G笔记本,网络延迟30ms:- 人工编写:平均每条3min,总计300min
- AI生成+校验:并发5请求,每条8s,过滤掉15%不合规,再花2s,总计约18min
效率提升≈94%,测试覆盖率从62%拉到91%(增量用例覆盖边界/异常路径)。
-
开放问题
目前我们用“语法+规则”双重校验,只能保证“能跑”,但无法衡量“语义正确”——即生成的用例是否真正击中业务风险。如何量化AI用例的“语义正确性”?是引入模型Embedding对比PRD,还是让业务专家打分?欢迎留言讨论。
如果你想把这套思路跑通,又懒得自己搭环境,可以试试从0打造个人豆包实时通话AI动手实验,里面把Prompt模板、重试机制、语音流式处理都封装好了,小白也能10分钟跑通。我亲测把实验里的“实时语音”改成“实时用例生成”只需改两行代码,就能直接对聊需求,边聊边出用例,效率提升肉眼可见。
更多推荐




所有评论(0)