QMTV E2E 测试约定
二十六期(2026-10-19)立册。对齐 pms e2e 约定骨架,按 QMTV 单库场景裁剪。 场景覆盖地图见 e2e-qmtv-场景清单.md。
§1 初始世界
- 环境:
bash scripts/dev/e2e/e2e-up.sh一键起——独立库qmtv_e2e(DROP/CREATE 即全量 reset)+ 端口:3301(与 dev :3300 三隔离:库/端口/产物文件名,可共存)+ 托管frontend/dist(每次 up 强制重建,永测当前 src)。停环境e2e-down.sh;快恢复(不重建库)e2e-seed.sh。 - 种子自检:
e2e-verify.sh六项(healthz / admin·demo·producer 三账号登录 / models-active / style-presets)——绿才能跑用例。 - 账号矩阵:admin@qmtv.com(管理员,credits 100000)/ demo@qmtv.com / producer@xingmang.cn——密码=seed 公开演示值,不入新密。API 造数的辅助账号一律
e2e-前缀 email;storageState 册(.auth/{admin,demo}.json)由 setup 项目真实 UI 登录一次产出,用例零登录(对抗 login 20/min 限流)。 - 确定性规则:未配置
model_endpoints→ 生成类全走内置 Mock 同步 done(无轮询等待、无外部超时);Mock 图像/视频字节含随机源——只断结构确定(卡片存在/URL 可达/台账行),绝不断素材内容。 - 预置种子:SQL seed(admin/demo+分销配置+计费 KV)+ Go seed(producer+示例任务链)。业务单据不进种子,一律 API 造数。
- 隔离与清理:用例各自造数各自收尾(集成侧 integCleanup 同纪律);失败不自愈——重跑前
e2e-up;连跑两轮必须间隔 reset(credits 水位会漂移)。
明令禁止
- 禁 sleep 等待 UI 条件——唯一合法等待面是 Playwright 自动等待/
expect.poll/waitForEvent/pollUntil。豁免两处(登记):①巡检类用例的路由间静置窗口(nav/admin 的waitForTimeout(400/1500)、snapshots 截图前waitForTimeout(800)——错误收集窗/渲染落定窗,非断言等待);②截图前networkidle。 - 禁 retry——config
retries: 0(pms flaky 规则:禁 retry 掩盖;修复优先序 改等待>改定位>改断言>最后才是 retry)。 - 禁断全局计数/绝对余额——流水断言用 total 相对面 + 最新行身份;余额用
assertBal恒等式(后端集成侧)。 - 禁触 qmtv_main / pms_ / sw_main*——e2e 只操作 qmtv_e2e 单库(远程 139 共享实例纪律平移)。
- SSE 面禁 networkidle——EventSource 长连接使 networkidle 永不触发;巡检用 load+双 rAF+静置窗口。
§2 可测性硬规则
- 断业务结果,不断文案细节:toast 只断关键短语(「拆解完成」「去字幕完成」);选择器优先 role/placeholder/既有稳定 class,不批量加 testid(触碰面爆炸);高频锚点按需单点补并在此登记。
- 失败留证:trace
retain-on-failure+ screenshotonly-on-failure→e2e/.artifacts/(gitignore)。 - 断言/截图分文件一行不共用(pms 硬规则):断言册
playwright.e2e.config.ts(testDir e2e,smoke 项目收assertion/*.spec.ts);截图册playwright.config.ts(只收snapshots.spec.ts)。 - API 侧错误信封直接抛(
e2e/lib/client.tsapiReq):非 2xx 抛响应体——静默吞错=测试说谎。 - 对话框断言用
waitForEvent('dialog')(once+变体捕获有竞态——auth.spec 负样本抓获);LoginView 错误走原生 alert,业务 confirm 各页分散(WorkbenchView 仅 repaint 空描述分支)——用例写前先读该页 submit 源码,勿凭笔记推 dialogs。
§3 运行手册
§4 flaky 处理规则
- 72h 内同一用例红 ≥2 次 → 摘出开单,不得带红合入;
- 7 天未修 → 删用例(场景清单「自动化?」列同步回落「待实现」);
- 关键用例落地必配负样本演练(涉及金额/回归锁/A1 教训面——改断言键名/路径必红才转正;A1 fixture 死键教训:键名错→锚死力失效)。巡检类(nav/admin 只读遍历)可豁免——harness 判死力由其它用例的有机红佐证(二十六期如实报告:admin.spec 无单独负样本,nav/auth/credits/dashboard/generation 五处有机红已证)。
§5 场景登记与回归锁
- 场景 ID 唯一(
E2E-<模块>-<序号>),ID 标注于 spec 文件头注释(用例名可不带前缀)——清单与 spec 双侧 grep 对账按场景 ID 级(「自动化?=是」的行必须有对应 ID 的 spec 文件,清单「现状」列登记 ✅ 文件名)。〔二十七期勘误:原「用例同名对账」与实际不符——ID 在头注释非用例名,对账实为场景 ID 级 9=9+文件级 ✅ 列。〕 - 缺陷修复优先「并入现有场景加断言」(回归锁),不新开用例——本仓
/review-planA 类「验收锚点」判死力机制直接挂此。 - 写链场景(导出 ZIP、充值审核、分销提现等)先登清单「待实现」行,后续期次升格。