<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>测试 on QMTV 产品文档</title><link>https://qmtv-docs.appland.com.cn/qmtv/test/</link><description>Recent content in 测试 on QMTV 产品文档</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://qmtv-docs.appland.com.cn/qmtv/test/index.xml" rel="self" type="application/rss+xml"/><item><title>QMTV 测试规划（Go 版，P0 底册）</title><link>https://qmtv-docs.appland.com.cn/qmtv/test/%E6%B5%8B%E8%AF%95%E8%A7%84%E5%88%92-qmtv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://qmtv-docs.appland.com.cn/qmtv/test/%E6%B5%8B%E8%AF%95%E8%A7%84%E5%88%92-qmtv/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;回答移植需求②&amp;quot;基于现有项目先写单元测试——移植现有测试（如果有），或另写&amp;quot;。现状实测：冻结版&lt;strong&gt;零单测&lt;/strong&gt;，仅 4 个 API 冒烟脚本（verify_*.js）覆盖 60/239 端点。结论：&lt;strong&gt;以 TDD 另写为主（pms 范式），verify 断言移植为集成冒烟底册，e2e 骨架按 pms 约定立&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>QMTV E2E 测试约定</title><link>https://qmtv-docs.appland.com.cn/qmtv/test/e2e-%E6%B5%8B%E8%AF%95%E7%BA%A6%E5%AE%9A/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://qmtv-docs.appland.com.cn/qmtv/test/e2e-%E6%B5%8B%E8%AF%95%E7%BA%A6%E5%AE%9A/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;二十六期（2026-10-19）立册。对齐 pms e2e 约定骨架，按 QMTV 单库场景裁剪。&#10;场景覆盖地图见 &lt;a href="https://qmtv-docs.appland.com.cn/qmtv/test/e2e-qmtv-%E5%9C%BA%E6%99%AF%E6%B8%85%E5%8D%95/"&gt;e2e-qmtv-场景清单.md&lt;/a&gt;。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="1-初始世界"&gt;§1 初始世界&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;环境&lt;/strong&gt;：&lt;code&gt;bash scripts/dev/e2e/e2e-up.sh&lt;/code&gt; 一键起——独立库 &lt;code&gt;qmtv_e2e&lt;/code&gt;（DROP/CREATE 即全量 reset）+ 端口 &lt;code&gt;:3301&lt;/code&gt;（与 dev :3300 三隔离：库/端口/产物文件名，可共存）+ 托管 &lt;code&gt;frontend/dist&lt;/code&gt;（每次 up 强制重建，永测当前 src）。停环境 &lt;code&gt;e2e-down.sh&lt;/code&gt;；快恢复（不重建库）&lt;code&gt;e2e-seed.sh&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;种子自检&lt;/strong&gt;：&lt;code&gt;e2e-verify.sh&lt;/code&gt; 六项（healthz / admin·demo·producer 三账号登录 / models-active / style-presets）——绿才能跑用例。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;账号矩阵&lt;/strong&gt;：admin@qmtv.com（管理员，credits 100000）/ &lt;a href="mailto:demo@qmtv.com"&gt;demo@qmtv.com&lt;/a&gt; / &lt;a href="mailto:producer@xingmang.cn"&gt;producer@xingmang.cn&lt;/a&gt;——密码=seed 公开演示值，不入新密。API 造数的辅助账号一律 &lt;code&gt;e2e-&lt;/code&gt; 前缀 email；storageState 册（&lt;code&gt;.auth/{admin,demo}.json&lt;/code&gt;）由 setup 项目真实 UI 登录一次产出，用例零登录（对抗 login 20/min 限流）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;确定性规则&lt;/strong&gt;：未配置 &lt;code&gt;model_endpoints&lt;/code&gt; → 生成类全走内置 Mock &lt;strong&gt;同步 done&lt;/strong&gt;（无轮询等待、无外部超时）；Mock 图像/视频字节含随机源——&lt;strong&gt;只断结构确定（卡片存在/URL 可达/台账行），绝不断素材内容&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;预置种子&lt;/strong&gt;：SQL seed（admin/demo+分销配置+计费 KV）+ Go seed（producer+示例任务链）。业务单据不进种子，一律 API 造数。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;隔离与清理&lt;/strong&gt;：用例各自造数各自收尾（集成侧 integCleanup 同纪律）；失败不自愈——重跑前 &lt;code&gt;e2e-up&lt;/code&gt;；&lt;strong&gt;连跑两轮必须间隔 reset&lt;/strong&gt;（credits 水位会漂移）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="明令禁止"&gt;明令禁止&#10;&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;禁 sleep 等待 UI 条件&lt;/strong&gt;——唯一合法等待面是 Playwright 自动等待/&lt;code&gt;expect.poll&lt;/code&gt;/&lt;code&gt;waitForEvent&lt;/code&gt;/&lt;code&gt;pollUntil&lt;/code&gt;。豁免两处（登记）：①巡检类用例的路由间静置窗口（nav/admin 的 &lt;code&gt;waitForTimeout(400/1500)&lt;/code&gt;、snapshots 截图前 &lt;code&gt;waitForTimeout(800)&lt;/code&gt;——错误收集窗/渲染落定窗，非断言等待）；②截图前 &lt;code&gt;networkidle&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;禁 retry&lt;/strong&gt;——config &lt;code&gt;retries: 0&lt;/code&gt;（pms flaky 规则：禁 retry 掩盖；修复优先序 改等待&amp;gt;改定位&amp;gt;改断言&amp;gt;最后才是 retry）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;禁断全局计数/绝对余额&lt;/strong&gt;——流水断言用 total 相对面 + 最新行身份；余额用 &lt;code&gt;assertBal&lt;/code&gt; 恒等式（后端集成侧）。&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;&lt;em&gt;禁触 qmtv_main / pms_&lt;/em&gt; / sw_main&lt;/em&gt;*——e2e 只操作 qmtv_e2e 单库（远程 139 共享实例纪律平移）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SSE 面禁 networkidle&lt;/strong&gt;——EventSource 长连接使 networkidle 永不触发；巡检用 load+双 rAF+静置窗口。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="2-可测性硬规则"&gt;§2 可测性硬规则&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;断业务结果，不断文案细节&lt;/strong&gt;：toast 只断关键短语（「拆解完成」「去字幕完成」）；选择器优先 role/placeholder/既有稳定 class，&lt;strong&gt;不批量加 testid&lt;/strong&gt;（触碰面爆炸）；高频锚点按需单点补并在此登记。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;失败留证&lt;/strong&gt;：trace &lt;code&gt;retain-on-failure&lt;/code&gt; + screenshot &lt;code&gt;only-on-failure&lt;/code&gt; → &lt;code&gt;e2e/.artifacts/&lt;/code&gt;（gitignore）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;断言/截图分文件一行不共用&lt;/strong&gt;（pms 硬规则）：断言册 &lt;code&gt;playwright.e2e.config.ts&lt;/code&gt;（testDir e2e，smoke 项目收 &lt;code&gt;assertion/*.spec.ts&lt;/code&gt;）；截图册 &lt;code&gt;playwright.config.ts&lt;/code&gt;（只收 &lt;code&gt;snapshots.spec.ts&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;API 侧错误信封直接抛&lt;/strong&gt;（&lt;code&gt;e2e/lib/client.ts&lt;/code&gt; apiReq）：非 2xx 抛响应体——静默吞错=测试说谎。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;对话框断言用 &lt;code&gt;waitForEvent('dialog')&lt;/code&gt;&lt;/strong&gt;（once+变体捕获有竞态——auth.spec 负样本抓获）；LoginView 错误走原生 alert，业务 confirm 各页分散（WorkbenchView 仅 repaint 空描述分支）——&lt;strong&gt;用例写前先读该页 submit 源码，勿凭笔记推 dialogs&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-运行手册"&gt;§3 运行手册&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-5d93f4ea-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="8"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-5d93f4ea-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash scripts/dev/e2e/e2e-up.sh &lt;span class="c1"&gt;# 起环境+种子自检（首次/失败后/连跑第二轮前必跑）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; frontend&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run test:e2e &lt;span class="c1"&gt;# 断言册（smoke，:3301）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run test:e2e:headed &lt;span class="c1"&gt;# 有头观察&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run test:snapshots &lt;span class="c1"&gt;# 截图管线（二十七期手册出图）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx playwright show-trace &amp;lt;trace.zip&amp;gt; &lt;span class="c1"&gt;# 失败取证&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash scripts/dev/e2e/e2e-down.sh &lt;span class="c1"&gt;# 停环境&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash scripts/ci.sh --e2e &lt;span class="c1"&gt;# 全栈验收档（=--with-env 全部 + e2e 册）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="4-flaky-处理规则"&gt;§4 flaky 处理规则&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;72h 内同一用例红 ≥2 次 → 摘出开单，不得带红合入；&lt;/li&gt;&#10;&lt;li&gt;7 天未修 → 删用例（场景清单「自动化?」列同步回落「待实现」）；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;关键用例落地必配负样本演练&lt;/strong&gt;（涉及金额/回归锁/A1 教训面——改断言键名/路径必红才转正；A1 fixture 死键教训：键名错→锚死力失效）。巡检类（nav/admin 只读遍历）可豁免——harness 判死力由其它用例的有机红佐证（二十六期如实报告：admin.spec 无单独负样本，nav/auth/credits/dashboard/generation 五处有机红已证）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="5-场景登记与回归锁"&gt;§5 场景登记与回归锁&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;场景 ID 唯一（&lt;code&gt;E2E-&amp;lt;模块&amp;gt;-&amp;lt;序号&amp;gt;&lt;/code&gt;），ID 标注于 &lt;strong&gt;spec 文件头注释&lt;/strong&gt;（用例名可不带前缀）——清单与 spec &lt;strong&gt;双侧 grep 对账按场景 ID 级&lt;/strong&gt;（「自动化?=是」的行必须有对应 ID 的 spec 文件，清单「现状」列登记 ✅ 文件名）。〔二十七期勘误：原「用例同名对账」与实际不符——ID 在头注释非用例名，对账实为场景 ID 级 9=9+文件级 ✅ 列。〕&lt;/li&gt;&#10;&lt;li&gt;缺陷修复优先「并入现有场景加断言」（回归锁），不新开用例——本仓 &lt;code&gt;/review-plan&lt;/code&gt; A 类「验收锚点」判死力机制直接挂此。&lt;/li&gt;&#10;&lt;li&gt;写链场景（导出 ZIP、充值审核、分销提现等）先登清单「待实现」行，后续期次升格。&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>QMTV E2E 场景清单（覆盖地图）</title><link>https://qmtv-docs.appland.com.cn/qmtv/test/e2e-qmtv-%E5%9C%BA%E6%99%AF%E6%B8%85%E5%8D%95/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://qmtv-docs.appland.com.cn/qmtv/test/e2e-qmtv-%E5%9C%BA%E6%99%AF%E6%B8%85%E5%8D%95/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;行格式：场景 ID 唯一；「自动化?=是」行与 &lt;code&gt;frontend/e2e/assertion/*.spec.ts&lt;/code&gt; 按场景 ID 级对账（清单 ID ↔ spec 文件头注释 ID+「现状」列 ✅ 文件名，与测试约定 §5 同口径；二十七期勘误：原「用例同名」与实情不符——用例 ID 在文件头注释非用例名）。&#10;「FSD 功能 ID」列=场景↔功能规格双向对账锚（三十一期回填）——指向 &lt;code&gt;prd/fsd-qmtv/&lt;/code&gt; 各册 &lt;code&gt;F&amp;lt;m&amp;gt;.&amp;lt;nn&amp;gt;&lt;/code&gt; 节；横切场景（积分/导航/截图）无单册归属标「横切」。&#10;二十六期首批冒烟 8 场景全走 Mock 同步面（避开 SSE 依赖与长轮询）；写链场景登「待实现」后续升格。&lt;/p&gt;</description></item></channel></rss>