web-ui-autotest-generator · git:20261014.5b97c82 · 2026-10-14 · sha256 ea9a25fc4f92d8ce
web-ui-autotest-generator git:20261014.5b97c82A
Immutable. This exact content never changes and is served at /api/v1/blob/ea9a25fc4f92d8ce.
---
name: web-ui-autotest-generator
description: 从前端和后端源码中生成可维护的 Web UI 自动化测试。适用于分析页面、路由、组件、接口、用户流程,生成 Playwright UI 测试,运行测试,生成中文报告,并自检页面功能和跨页面逻辑是否被独立测试资产覆盖。 Generate maintainable Web UI automated tests from frontend and backend source code. Use for analyzing pages, routes, components, APIs, and user flows; generating and running Playwright UI tests; producing Chinese test reports; and checking whether page features and cross-page logic are covered by independent test assets.
---
# Web UI 自动化测试生成器
使用本 skill 可以把一个 Web 项目整理成可执行、可复查、可持续维护的 UI 自动化测试套件。
目标不是只写几条临时脚本,而是先分析前端页面、后端接口、用户流程和 UI 状态,再生成 Playwright 测试、覆盖率清单、执行命令和中文报告。生成后的测试资产应能脱离本 skill 独立运行。
## 默认技术栈
除非目标仓库已经明确使用其他 UI 测试框架,否则默认使用 Playwright + TypeScript。
默认输出结构:
```text
tests/e2e/
pages/ # Page Object 模型
specs/ # 按页面或路由组织的测试用例
fixtures/ # 登录状态、测试数据、接口 mock
utils/ # 通用辅助函数
reports/ # 测试报告和中文总结
playwright.config.ts
ui-test-manifest.json
ui-test-coverage.json
```
内置资源:
```text
scripts/generate_manifest.py # 源码扫描,生成 ui-test-manifest.json
scripts/audit_selectors.py # 选择器稳定性审计,生成 ui-selector-audit.json
scripts/check_coverage.py # 清单和用例覆盖率检查,生成 ui-test-coverage.json
scripts/analyze_failures.py # Playwright JSON 报告分析,生成 ui-test-repair-plan.json
assets/templates/ # Playwright 起始模板
assets/templates/summary.zh-CN.md.template # 中文覆盖率评估附录模板
```
## 工作流程
1. 检查项目结构和已有测试工具。
2. 分析前端路由、页面、组件、UI 控件、状态管理和接口调用。
3. 如存在后端代码、OpenAPI、Swagger 或 Apifox 文档,补充分析接口契约。
4. 生成页面、功能、接口和流程清单。
5. 审计选择器稳定性,并记录 `data-testid` 等改造建议。
6. 生成 Playwright Page Object、fixture、spec 和 CI 脚本。
7. 条件允许时在本地运行测试。
8. 如果测试失败,分析失败原因并修复生成的测试。
9. 按覆盖率规则自检生成结果并输出评分。
10. 生成中文测试报告,说明执行结果、覆盖缺口、选择器风险和后续动作。
生成或评审测试时,按需读取 `references/coverage-rubric.md`。
编写清单、覆盖率或报告时,按需读取 `references/output-contract.md`。
## 脚本化初筛
先使用内置脚本得到稳定的基础扫描结果,再结合项目代码进行人工判断和修正。
生成初始清单:
```bash
python3 path/to/web-ui-autotest-generator/scripts/generate_manifest.py --root . --out ui-test-manifest.json --pretty
```
审计选择器稳定性:
```bash
python3 path/to/web-ui-autotest-generator/scripts/audit_selectors.py --root . --out ui-selector-audit.json --pretty
```
生成测试后检查覆盖率:
```bash
python3 path/to/web-ui-autotest-generator/scripts/check_coverage.py --root . --manifest ui-test-manifest.json --selector-audit ui-selector-audit.json --tests-dir tests/e2e --out ui-test-coverage.json --pretty
```
如果 Playwright 执行失败且已有 JSON 报告,生成修复计划:
```bash
python3 path/to/web-ui-autotest-generator/scripts/analyze_failures.py --report tests/e2e/reports/results.json --out ui-test-repair-plan.json --pretty
```
脚本输出是草稿,需要复核:
- 生成大量测试前,先修正错误的路由、页面和文件映射。
- 如果源码高度动态,补充业务名称、权限信息和接口映射。
- 使用 `ui-selector-audit.json` 选择更稳定的定位方式,并给出 `data-testid` 建议。
- 不要静默忽略覆盖缺口;应在 `ui-test-coverage.json` 中写明原因。
## 发现规则
从快速本地检查开始:
```bash
rg --files
```
重点识别:
- 包管理器:`package.json`、lockfile、workspace 文件。
- 前端框架:React、Next.js、Vue、Nuxt、Angular、Svelte、Vite、Umi、qiankun、微前端。
- 路由定义:router 文件、文件路由约定、路由配置、菜单配置。
- 页面根目录:`src/pages`、`src/views`、`app`、`pages`、`routes`。
- 复用 UI 组件:弹窗、抽屉、表格、表单、上传器、选择器、标签页、步骤条。
- 接口层:`src/api`、`src/services`、请求客户端、生成式客户端、GraphQL 文档。
- 状态与鉴权:store、context、cookie、localStorage、路由守卫、权限校验。
- 现有测试约定:命名方式、fixture、测试 id、mock 风格、CI 脚本。
优先沿用仓库已有风格。如果已有 Playwright,直接扩展现有体系。如果项目已经稳定使用 Cypress,且用户没有指定 Playwright,则跟随 Cypress。
## 前端分析
建立页面清单。每个页面都应尽量识别:
- 路由路径和路由参数。
- 页面标题或业务名称。
- 访问权限和登录要求。
- 主组件和子组件。
- 可见控件:按钮、链接、标签页、菜单、筛选项、输入框、下拉框、日期选择器。
- 表单字段、校验规则、必填项、禁用态。
- 表格或列表列、行操作、分页、排序、批量操作。
- 弹窗、抽屉、浮层及其提交、取消流程。
- 空态、加载态、错误态、成功态和无权限状态。
- 页面跳转和跨页面流转。
- 页面加载或用户操作触发的接口调用。
优先基于源码和稳定选择器生成测试。如果 UI 元素缺少稳定选择器,使用 `getByRole`、`getByLabel`、`getByText` 等可访问定位方式,并在报告中说明哪些位置适合补充 `data-testid`。
选择器优先级:
1. `data-testid` 或项目已有测试 id 约定。
2. 可访问角色和名称。
3. 表单字段 label。
4. 稳定可见文本。
5. 稳定组件属性。
6. 只有没有更好方式时才使用 CSS 选择器。
生成 spec 前先运行 `scripts/audit_selectors.py`。根据审计结果决定:
- 使用已有稳定选择器生成测试。
- 当可访问信息足够时,优先使用 role、label、text 定位。
- 对缺少稳定选择器的关键元素写入 `missingStableSelectors` 建议。
- 只有用户同意修改产品代码时,才补充 `data-testid`。
核心流程不要悄悄使用脆弱选择器。无法避免时,必须在最终中文报告中说明。
## 后端与接口分析
使用后端代码、OpenAPI、Swagger 或 Apifox 文档增强 UI 测试。
提取:
- 接口方法和路径。
- 请求参数、body 结构和必填字段。
- 响应字段和业务状态。
- 错误码和校验信息。
- 鉴权方式和角色要求。
- 数据生命周期约束,例如创建 -> 列表 -> 详情 -> 更新 -> 删除。
把接口映射回 UI 行为:
```text
页面加载 -> 列表/详情接口
搜索/筛选 -> 查询接口
新增/编辑表单 -> 创建/更新接口
删除/批量操作 -> 变更接口
下载/导出 -> 文件接口
路由跳转 -> 详情页或子页面接口
```
如果没有后端代码,从前端接口客户端推断契约,并在必要时使用 route mock。
## 清单优先
生成大量测试前,先创建或更新 `ui-test-manifest.json`。
清单应描述:
- 页面和路由。
- 每个页面的功能项。
- UI 元素和操作。
- 接口依赖。
- 跨页面流程。
- 建议测试场景。
- 已覆盖和缺失项。
把清单作为生成和评审的事实来源。清单错误时,先修正清单,再扩展测试。
## 测试生成规则
按页面和用户流程生成测试。
创建新的 Playwright 文件时,使用 `assets/templates/` 作为起点:
- `page-object.ts.template`:Page Object 类。
- `page-spec.ts.template`:页面级测试。
- `playwright.config.ts.template`:项目没有 Playwright 配置时使用。
- `auth-fixture.ts.template`:需要鉴权但项目登录方式不明确时使用。
- `package-scripts.json.template`:补充 npm scripts 时使用。
- `github-actions-e2e.yml.template`:补充 GitHub Actions CI 时使用。
- `summary.zh-CN.md.template`:编写覆盖率评估附录时使用;执行汇总统一使用 `project-validation` 的固定模板。
每个业务页面通常应覆盖:
- 页面可以正常加载。
- 核心可见控件渲染。
- 主列表、表格或主要内容渲染。
- 搜索、筛选、重置流程。
- 支持新增时覆盖新增流程。
- 支持编辑时覆盖编辑流程。
- 支持删除或危险操作时覆盖确认与结果。
- 支持详情或跳转时覆盖导航流程。
- 必填字段和表单校验错误。
- 接口失败或空态。
- 相关的无权限或未登录状态。
跨页面流程应生成场景 spec,不要在单页面测试中重复堆叠:
```text
登录 -> 新建实体 -> 搜索实体 -> 打开详情 -> 编辑实体 -> 回到列表验证 -> 删除实体
```
避免脆弱测试:
- 不断言用户看不到的实现细节。
- 不依赖任意固定等待。
- 除非 fixture 明确创建数据,否则不依赖顺序敏感的数据。
- 不绑定生成式 CSS 类名。
- 如果应用支持 i18n,不假设固定中英文文本,应检查语言文件。
使用确定性测试数据:
- 优先使用 API 做 setup 和 teardown。
- 测试数据名称使用时间戳或生成 ID 保持唯一。
- 创建的数据要隔离并清理。
- 如果清理有风险,危险场景优先使用 mock。
## Page Object 规则
重复交互和稳定页面语义应放入 Page Object。
好的 Page Object 暴露用户语义动作:
```ts
await userListPage.search({ name: 'Alice' })
await userListPage.createUser(data)
await userListPage.deleteUser('Alice')
```
不要把底层选择器作为主要接口,除非确实需要。
Page Object 应包含:
- `goto`
- 核心 locator
- 常用用户动作
- 页面 ready 断言
- 表格、表单、弹窗的小型辅助方法
场景特有断言保留在 spec 中,可复用的页面就绪断言放在 Page Object 中。
## 鉴权策略
如果页面需要登录:
1. 优先复用项目已有鉴权 helper。
2. 优先使用 Playwright `storageState` fixture。
3. 如果后端支持测试登录接口,用接口完成登录准备。
4. 如果没有稳定测试账号,生成带占位说明的测试,并在报告中标记为需要人工补充。
不要写入真实生产账号或密钥。
## 执行
新增或复用脚本:
```json
{
"scripts": {
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:report": "playwright show-report"
}
}
```
条件允许时运行:
```bash
npx playwright test
```
如果应用需要开发服务器,使用仓库标准 dev 命令启动,并按需配置 Playwright `webServer`。
如果依赖缺失且网络不可用,仍然生成测试套件,并在中文报告中明确写明未执行原因。
## 失败修复循环
测试失败时,先做短循环修复,避免只留下原始失败。
1. 使用 JSON reporter 运行 Playwright。
2. 用 `scripts/analyze_failures.py` 生成 `ui-test-repair-plan.json`。
3. 将失败归类为:选择器、超时、断言、鉴权、导航、接口、测试数据或未知。
4. 优先修复出现最多的失败类型。
5. 重跑受影响 spec 或完整测试套件。
6. 重新生成 `ui-test-coverage.json`。
修复建议:
- 选择器失败:改进 Page Object locator,补充稳定选择器建议,只有获得许可时才改产品代码的 `data-testid`。
- 超时失败:等待用户可见的页面就绪、接口响应或加载态消失。
- 断言失败:断言稳定的用户可见结果,不断言实现细节。
- 鉴权失败:补充 storage state、测试登录 fixture 或账号需求说明。
- 接口/数据失败:补充确定性 setup、route mock 或 cleanup helper。
当测试通过,或遇到必须由用户提供账号、环境、业务规则的明确阻塞时,停止修复循环。
## CI/CD 产物
生成后的测试应能脱离本 skill 独立运行。
如果项目使用 npm scripts,新增或合并:
```json
{
"scripts": {
"test:e2e": "playwright test",
"test:e2e:ci": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:report": "playwright show-report"
}
}
```
如果项目使用 GitHub Actions,复制并调整 `assets/templates/github-actions-e2e.yml.template` 到 `.github/workflows/e2e.yml`。
其他 CI 系统也应保持同一契约:
- 安装依赖。
- 安装 Playwright 浏览器。
- 提供 `E2E_BASE_URL` 和鉴权密钥。
- 运行 `npm run test:e2e:ci`。
- 上传 HTML、JSON、JUnit、trace 等报告产物。
## 自检
生成后必须先自检,再交付。
首次生成测试后运行 `scripts/check_coverage.py`,修复后再次运行。
检查:
- 每个发现到的路由是否至少有一个加载或渲染测试。
- 每个主要按钮或动作是否有测试场景,或有明确排除原因。
- 每个表单是否覆盖必填校验和至少一个成功路径。
- 列表页是否覆盖搜索、重置、分页和空态。
- 危险操作是否覆盖确认、取消和结果验证。
- 是否覆盖接口失败或后端错误状态。
- 重要跨页面流程是否覆盖。
- 测试套件是否能独立运行。
- 选择器是否可维护。
- 测试数据 setup 和 cleanup 是否清晰。
写入 `ui-test-coverage.json`,包含已覆盖项和缺失项。缺失项可以存在,但必须写明原因。
覆盖率报告应包含:
- 总体评分。
- 页面覆盖率。
- 功能覆盖率。
- API 覆盖率。
- 跨页面流程覆盖率。
- 存在 `ui-selector-audit.json` 时,包含选择器稳定性评分。
## 中文报告
最终面向人阅读的测试报告必须使用中文。正式执行报告的同 stem Markdown 必须加载并按已安装 `project-validation/references/run-summary.zh-CN.md.template` 固定章节编写,遵守其填值、核验、脱敏和历史证据边界。`tests/e2e/reports/summary.md` 是套件覆盖率评估入口,不能替代每轮命名报告的同 stem 汇总;其覆盖率部分使用 `assets/templates/summary.zh-CN.md.template`,可作为执行汇总之后的附录。仅生成测试资产而未执行时,明确写“未执行”,不得把静态覆盖率评分写成测试通过。
报告必须包含:
- 生成了哪些文件。
- 覆盖了哪些页面和路由。
- 生成的测试数量。
- 重新执行命令。
- 如果执行过测试,写明测试结果。
- 覆盖缺口。
- 总体评分和各维度评分。
- 选择器稳定性评分和主要选择器建议。
- 如果测试失败,写明失败修复摘要。
- 仍需人工提供的测试账号、环境变量或业务规则。
机器可读产物包括:
- Playwright HTML report。
- CI 需要时生成 JUnit XML。
- `ui-selector-audit.json`。
- `ui-test-coverage.json`。
- 失败时生成 `ui-test-repair-plan.json`。
- 中文 Markdown 总结:`tests/e2e/reports/summary.md`。
## 完成标准
任务只有在以下条件满足时才算完成:
- 测试套件文件已经生成。
- 清单、选择器审计和覆盖率报告已经存在。
- 测试已执行并修复,或报告了明确阻塞原因。
- 已提供可独立运行的本地或 CI 命令。
- 用户可以根据中文报告中的命令重新运行测试。