






















版本:v1.0 | 适用阶段:规划期 → MVP → 完整系统
系统由五个核心层组成,各层职责清晰、单向依赖:
┌──────────────────────────────────────────────────┐
│ 前端操作层(测试人员界面) │
│ 上传文档 / 输入描述 / 查看报告 / 触发执行 │
└──────────────────┬───────────────────────────────┘
│
┌──────────────────▼───────────────────────────────┐
│ 用例管理模块(Test Case Hub) │
│ 文档解析 → LLM 生成用例 → Gherkin 存储 → 版本管理 │
└──────────────────┬───────────────────────────────┘
│
┌──────────────────▼───────────────────────────────┐
│ 脚本生成引擎(Script Generation Engine) │
│ 用例驱动生成 / 录制回放转换 / Swagger → API 脚本 │
└──────────────────┬───────────────────────────────┘
│
┌──────────────────▼───────────────────────────────┐
│ 执行引擎(Execution Engine) │
│ Playwright Test Runner / 并行调度 / 环境隔离 │
└──────────────────┬───────────────────────────────┘
│
┌──────────────────▼───────────────────────────────┐
│ 报告服务 + CI 适配层(Reporting & CI) │
│ Allure / Playwright HTML Report / GH Actions │
└──────────────────────────────────────────────────┘
| 层级 | 选型 | 理由 | 落地难度 |
|---|---|---|---|
用例生成流
测试人员将需求文档(Word/PDF/MD/文本)上传到用例管理模块。模块调用文档解析库提取纯文本,拼装 Prompt 后调用 LLM API,返回结构化 JSON 格式的测试用例(含前置条件、步骤、预期结果、优先级)。系统同时生成对应的 Gherkin .feature 文件并提交到 Git 仓库。
脚本生成流
以 .feature 文件为输入,脚本生成引擎将 Gherkin 步骤再次送入 LLM,生成对应的 Playwright Step Definitions(TypeScript)和 POM 页面对象。生成的代码经过静态检查(tsc --noEmit)后输出到 tests/ 目录。
执行流
CI 触发(PR / 定时 / 手动)→ 安装依赖 → 执行 playwright test → 收集结果 → Allure 生成报告 → 上传 Artifact → 发送告警(仅失败时)。
| 方案 | 描述 | 优点 | 缺点 | 落地难度 | 适用规模 |
|---|---|---|---|---|---|
采用一个极简 Node.js/Python 服务(或直接在 CI 脚本中实现),核心 Prompt 设计如下:
系统角色:你是一名资深 QA 工程师。
任务:根据以下需求描述,生成结构化测试用例,并同时输出 Gherkin 格式。
输出格式:严格 JSON,包含 id、title、priority(P0/P1/P2)、
preconditions(数组)、steps(数组,含 action 和 expected)、
gherkin(Feature/Scenario 完整字符串)。
需求描述:{用户输入或文档提取的文本}
LLM API 成本估算(按月)
以中等规模团队(5 名测试,每天生成 20 份用例文档,每份约 2000 token 输入 + 3000 token 输出)为例:
| 模型 | 单价(输入/输出,per M token) | 月消耗 token | 月费用估算 |
|---|---|---|---|
推荐:DeepSeek V3 API 作为主力(成本最低,中文效果优秀),Claude Haiku 3.5 作为备用。
用例生成后输出两个产物:
testcases/TC-001.json:结构化数据,供人工 review 和系统管理features/login.feature:Gherkin 文件,直接作为脚本生成引擎的输入推荐方案:LLM API(非规则引擎)
规则引擎只能处理有限的预定义操作词(点击、输入、断言),遇到稍复杂的业务描述("验证购物车金额合计正确")就无法处理。LLM 对自然语言的理解深度远超规则引擎,且代码生成质量可控。
示例工作流
输入(Gherkin Step):
Given 用户已打开登录页
When 用户输入账号 "zdytest" 和密码 "Aa1234567+"
When 用户点击登录按钮
Then 页面跳转到 "/yosFrontPage"
↓ Prompt 包含:POM 模式要求 + TypeScript + Playwright 语法规范
输出(Step Definition):
Given('用户已打开登录页', async ({ loginPage }) => {
await loginPage.goto();
});
When('用户输入账号 {string} 和密码 {string}', async ({ loginPage }, username, password) => {
await loginPage.fillCredentials(username, password);
});
When('用户点击登录按钮', async ({ loginPage }) => {
await loginPage.clickLogin();
});
Then('页面跳转到 {string}', async ({ page }, path) => {
await expect(page).toHaveURL(new RegExp(path));
});
输出(Page Object):
export class LoginPage {
constructor(private page: Page) {}
async goto() { await this.page.goto('/yos-web'); }
async fillCredentials(username: string, password: string) {
await this.page.getByPlaceholder(/账号|用户名/i).fill(username);
await this.page.getByPlaceholder(/密码/i).fill(password);
}
async clickLogin() {
await this.page.getByRole('button', { name: /登录/i }).click();
}
}
关键 Prompt 约束(影响代码质量的核心)
getByRole、getByPlaceholder),禁止 CSS 类名选择器expect 的 web-first assertionsfixtures.ts 注入 Page Object 实例生成脚本的准确率预期
经过良好的 Prompt 工程,LLM 生成的脚本约 60–70% 可直接运行,30–40% 需要人工微调(主要是选择器定位精度问题,因 LLM 无法访问真实页面 DOM)。结合"录制回放"补全选择器,综合成本比手工编写低 60% 以上。
方案对比
| 工具 | 描述 | 产出代码质量 | POM 结构 | 落地难度 | 是否免费 |
|---|---|---|---|---|---|
推荐方案:Playwright Codegen + LLM 重构
npx playwright codegen <url> 录制操作,得到原始 flat 脚本await expect() 断言这个"录制 → LLM 重构"的组合是目前成本最低、落地最快的方式,完全免费且不依赖任何第三方服务。
工具对比
| 工具 | 描述 | 与 UI 共享数据 | 落地难度 | 免费 |
|---|---|---|---|---|
推荐方案:OpenAPI → Playwright API 测试脚本
核心思路:解析 Swagger JSON → 提取 endpoint/参数/schema → LLM 生成 Playwright APIRequestContext 测试代码。
与 UI 测试共享数据的方式:
// fixtures.ts - UI 与 API 测试共用同一 fixture
export const test = base.extend<{ apiToken: string; loginPage: LoginPage }>({
// 通过 API 登录获取 token,UI 测试也可注入 storage state 跳过登录
apiToken: async ({ request }, use) => {
const res = await request.post('/api/auth/login', {
data: { username: process.env.E2E_USERNAME, password: process.env.E2E_PASSWORD }
});
const { token } = await res.json();
await use(token);
},
});
Swagger 解析 → 脚本生成的简要工作流
/swagger.json 或 /openapi.yamlswagger-parser 解析,提取 paths、parameters、requestBody、responses 的 schema此模块按要求暂不深入,仅列出关键配置点:
on: pull_request)+ 定时(on: schedule: cron)+ 手动(on: workflow_dispatch)--shard=1/4 到 4/4,GitHub Actions matrix 并行,无需付费.env.test / .env.staging 切换 baseURL,Playwright config 读取 process.env.ENVactions/cache 缓存 ~/.cache/ms-playwright,减少 CI 时间约 2 分钟| 工具 | 趋势图 | 截图/录屏 | 失败分类 | 部署成本 | 免费 |
|---|---|---|---|---|---|
推荐:Allure + Playwright HTML 双报告
失败截图/录屏自动挂载配置
// playwright.config.ts
use: {
screenshot: 'only-on-failure', // 失败时自动截图
video: 'retain-on-failure', // 失败时保留录屏
trace: 'on-first-retry', // 第一次重试时录制 Trace
}
Allure 集成只需安装 allure-playwright 并在 reporter 中添加,截图自动附加到对应用例。
告警通知
企微机器人 Webhook 在 CI 最后一步调用:
- name: 企微通知(仅失败时)
if: failure()
run: |
curl -X POST "${{ secrets.WECOM_WEBHOOK }}" \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "markdown",
"markdown": {
"content": "### ❌ E2E 测试失败\n
**分支**:${{ github.ref_name }}\n
**触发人**:${{ github.actor }}\n
**报告地址**:${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
}
}'
邮件告警使用 dawidd6/action-send-mail Action,免费,支持 SMTP 配置。
目标:跑通完整 CI 流水线,团队建立信心
| 任务 | 工作量 | 交付物 |
|---|---|---|
落地难度:低
团队要求:1 名有 TypeScript 基础的测试工程师即可
目标:提升脚本编写效率,覆盖接口层
| 任务 | 工作量 | 交付物 |
|---|---|---|
落地难度:中
团队要求:需要 1 名熟悉 API 测试的工程师协同
目标:实现 AI 辅助的完整闭环
| 任务 | 工作量 | 交付物 |
|---|---|---|
落地难度:中高(主要复杂度在 Prompt 工程调优)
团队要求:需要 1 名对 LLM Prompt 有经验的工程师主导
第1周 ██████████ 基础框架 + 手工脚本
第2周 ██████████ CI 流水线 + 报告通知
第3周 ████████ 录制回放 + Codegen 重构工具
第4周 ████████ 接口自动化 + Fixture 共享
第5周 ████ Cucumber 集成(可选)
第6周 ████████ 文档解析服务
第7周 ████████ LLM 用例生成调优
第8周 ████████ Gherkin → 脚本生成
第9周 ████ 联调 + 培训 + 文档
风险描述:UI 经常改版,选择器失效导致大量脚本需要修改,维护成本高于人工测试。
应对策略:
getByRole、getByText),而非 CSS 类名或 XPath,语义化选择器对 UI 改版的耐受性高 3–5 倍风险描述:网络抖动、动画未完成、接口响应慢等导致用例间歇性失败,降低团队信任度。
应对策略:
page.waitForTimeout()(硬等待),统一使用 expect(locator).toBeVisible() 等 web-first 断言retries: 2,连续失败 3 次才标记真正失败风险描述:LLM 无法访问真实页面,生成的选择器可能不准确,或生成幻觉代码。
应对策略:
tsc --noEmit 检查,语法错误在 Review 前自动拦截风险描述:Playwright Codegen 产出的 flat 代码直接使用时,复用性差,选择器可能包含动态属性。
应对策略:
data-testid 属性(与前端团队约定),产出更稳定的选择器风险描述:测试人员不熟悉 TypeScript / Git,学习曲线导致推进缓慢。
应对策略:
| 指标 | 当前基准(假设纯手工) | Phase 1 目标 | Phase 3 目标 |
|---|---|---|---|
| 指标 | 目标值 | 说明 |
|---|---|---|
| 指标 | 目标值 |
|---|---|
| 项目 | 预估月成本 |
|---|---|
| 工具 | 用途 | 开源/免费 | 维护状态 |
|---|---|---|---|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。