Files
lingxi/e2e/README.md
T
Stev_Wang 4825626bdf test(e2e): A6 任务中心端到端用例与本地 Playwright 通道
背景:A6-QA-01 要求验证幂等 / 取消 / 重试 / 断线续推 / 权限三态;同时本地无 ~/Library/Caches 写权限,需要可复现的浏览器安装方式。
改动:
- 新增 e2e/a6-tasks.spec.ts(A6_E2E=1 门控):6 条用例覆盖提交 → 列表 → 详情 SSE → 部分失败 → 仅重试失败项、立即取消、同 Idempotency-Key 复用与 40902、Last-Event-ID 断点续推、只读不渲染写操作、无 material:read → 403;beforeAll 用 Prisma 建临时超管 / 只读 / 无权限账号与角色,afterAll 清理任务、幂等键、outbox 与账号角色(审计 append-only 保留)。
- playwright.config.ts 支持 PLAYWRIGHT_CHANNEL:未设置时本地用系统 Chrome,显式空串(CI)用 Playwright 自带 Chromium。
- eslint.config.mjs 忽略本地 .dev(Playwright 浏览器与临时脚本)。
- e2e/README.md 补充 A6 用例与运行方式。
影响面:默认(无 A6_E2E=1)仍 skip,CI pnpm test:e2e 行为不变;仅本地 e2e 配置增加环境变量支持。
回滚:撤销提交,删除 spec 与 channel 逻辑即可。
验证:A6_E2E=1 pnpm exec playwright test e2e/a6-tasks.spec.ts 6/6(约 39s,连跑多次稳定);pnpm test:e2e 默认套件不受影响。
2026-11-05 11:41:14 +08:00

55 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# e2e(Playwright)
## 现有用例
| 文件 | 说明 | 默认是否执行 |
| --------------------------- | ------------------------------------------------------------------------------- | ----------------- |
| `smoke.spec.ts` | A0 冒烟:登录、模块切换、403 / 404 | 是 |
| `a1-identity.spec.ts` | A1-QA-01 账号生命周期(①–⑥) | 否,需 `A1_E2E=1` |
| `a2-roles.spec.ts` | A2-QA-01 角色管理 / 权限三态 / SoD / 即时生效 | 否,需 `A2_E2E=1` |
| `a3-client.spec.ts` | A3-QA-01 客户与行业六页可访问 / 数据加载 | 否,需 `A3_E2E=1` |
| `a4-dicts-settings.spec.ts` | A4-QA-01 数据字典 / 三层合并 / 编码只读 / 系统配置 / 阈值确认 / 变更记录 | 否,需 `A4_E2E=1` |
| `a5-audit-logs.spec.ts` | A5-QA-01 操作日志列表 / 筛选 / 详情 diff / 导出闭环 / 权限三态 / 运行日志 | 否,需 `A5_E2E=1` |
| `a6-tasks.spec.ts` | A6-QA-01 任务提交 / SSE 进度 / 取消 / 仅重试失败项 / 幂等 / 断点续推 / 权限三态 | 否,需 `A6_E2E=1` |
## A6 任务中心用例(A6-QA-01)
覆盖:
1. 提交演练任务(混合模式)→ 列表出现 → 详情 SSE 推进至「部分失败」→ 只重试失败项 → 状态回排队 / 生成中;
2. 顶栏任务角标显示进行中数量,点开面板可进入任务详情;
3. 提交后立即在详情取消任务 → 状态「已取消」,未开始项显示「已跳过」;
4. 同一 `Idempotency-Key` + 同一 body 重复提交返回同一 taskId(API 断言);
5. SSE `Last-Event-ID` 续推:先读一段事件流记录 seq,再按 `Last-Event-ID` 重连,断言首帧 seq 更大、不重发历史;
6. 权限三态:无 `material:render` 只有 `material:read` → 不渲染提交 / 取消 / 重试;无 `material:read` → `/403`。
### 前置
1. API:`pnpm --filter @lingxi/api dev`(`http://127.0.0.1:3000/api/v1`,真实 PG + Redis,已 `pnpm db:init`;**不要执行 `db:reset`**)。
2. Worker:`pnpm --filter @lingxi/worker dev`(`QUEUE=all` 或至少 `QUEUE=verify`;demo 任务走 `media:verify` 队列,不启动 worker 时进度不会推进)。
3. Web:`pnpm --filter @lingxi/web dev`(`http://127.0.0.1:5173`)。
4. 本地浏览器:默认用系统 Chrome(`PLAYWRIGHT_CHANNEL` 未设置时);若使用 Playwright 自带 Chromium,先
`PLAYWRIGHT_BROWSERS_PATH=.dev/playwright-browsers pnpm exec playwright install chromium`,再设置
`PLAYWRIGHT_CHANNEL=''`。
### 数据自建自清
`beforeAll` 直接经 Prisma 创建三个临时账号(密码 `lingxi2026`):
- `qa6.tasks.e2e`(`super_admin`):提交 / 取消 / 重试全流程;
- `qa6.tasks.ro`(临时角色 `a6e2e_task_viewer`,仅 `material:read` + 全部数据范围):只读三态;
- `qa6.tasks.none`(临时角色 `a6e2e_no_material`,仅 `delivery:read`):访问列表 → 403。
`afterAll` 删除临时账号、角色、临时任务的 task_events / media_items / media_tasks、幂等键与 outbox 事件;
审计日志 append-only,产生的记录不删除(预期留痕)。
### 运行
```bash
A6_E2E=1 pnpm exec playwright test e2e/a6-tasks.spec.ts --reporter=list
```
- 可选覆盖:`A6_E2E_BASE_URL`(缺省 `http://127.0.0.1:5173`)、`A6_E2E_API_BASE_URL`(缺省 `http://127.0.0.1:3000/api/v1`)。
- 截图:`design/a6-ui-v1/shots/impl/e2e/`。
- 门控未开启(无 `A6_E2E=1`)时整文件 `test.skip`,`pnpm test:e2e` 与 CI 行为不变。