其他
需要把质量左移(shift-left)时:从 QA 进…
当团队只在开发「完成后」才测试、缺陷大量逃逸到 staging/生产,想把质量验证前移到需求细化到 PR 合并的每个阶段时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 55/100 ×0.15
适用场景
需要把质量左移(shift-left)时通用
解决思路
- 先检查 `.agents/qa-project-context.md` 是否存在;若存在则直接复用其中的团队组成、dev/QA 工作流、sprint 结构和质量目标,跳过已被回答的问题。
- 摸清现状 1:QA 第一次看到功能是在什么时候——PR 提出后?合并到 staging 后?还是只有出 bug 时?答案说明质量目前离右端有多远。
- 摸清现状 2:谁在什么时候写测试——只有开发?只有 QA 在开发「完成」后?两边都写但时间线不同?改变归属前先搞清当前归属。
- 摸清现状 3:需求如何传达——书面规格、口头交接,还是只有 Figma 链接而无验收标准?含糊需求是 shift-left 能防住的第一大缺陷来源。
- 摸清现状 4:团队对 TDD 是否有兴趣、以前是否试过、坚持下来还是崩掉了,避免重蹈覆辙。
- 摸清现状 5:PR review 流程——谁 review、可测试性是否是评审标准、合并前是否要求有测试。PR review 是引入质量检查摩擦最小的位置。
- 摸清现状 6:团队的 Definition of Done 是书面还是口头的、是否包含测试、是被强制执行还是只是愿望。DoD 是「进行中」与「完成」的契约边界。
- 摸清现状 7:QA 如何参与 sprint planning——完全不参与、只参与估点,还是主动细化 story?参与度决定 QA 思考多早进入循环。
- 建立共识:质量是所有人的责任,不是开发后由 QA 执行的一个阶段——PM 写可测试的需求、开发边写代码边写测试、reviewer 检查可测试性、QA 设计策略并兜住自动化漏掉的场景。
- 用具体的成本故事而非虚构数字说明越早发现越便宜:refinement < design < development < QA < staging < production;明确「1x→100x」这类表格来源不明(无出处的 IBM 培训图),只作示意、不要当作实测数据。
- 把 QA 从「门禁」改成「嵌入式」:QA 参与 story 细化、与开发结对设计测试、评审 PR 的可测试性、通过持续测试做早期验证;门禁模型制造瓶颈和对抗,嵌入式模型制造协作与共担。
- 把可测试性当作一等设计约束(与性能、安全、可用性并列):在设计阶段、写第一行代码之前就问「这个我们要怎么测」,由此得到的架构更干净、更模块化、更可靠。
- 小步推进:一次只引入一个实践(通常是 PR review checklist 或 Three Amigos),用数据证明价值(逃逸 bug 减少、PR 周期变快),再用这个成功去推动下一个实践。
- 让 QA 参加 sprint planning 并主动参与 story 细化,提出边界情况问题、找出缺失的验收标准、在开发开始前标出风险区。
- planning 时逐条检查验收标准是否可验证:「用户可以排序表格」可测,「表格很友好」不可测。
- planning 时识别边界情况与反例场景:空数据会怎样?最大长度输入?并发用户?操作中途网络失败?
- planning 时标记集成风险:这个 story 是否碰第三方 API?是否改数据库 schema?是否影响现有测试数据?
- planning 时估算 QA 工作量:自动化时间、探索性测试时间、环境搭建,并计入 sprint 容量。
- planning 时为每个 story 定义测试方案:业务逻辑用单元测试、API 变更用集成测试、面向用户的流程用 E2E。
- 为每个 story 填写 QA 提问模板(示例:优惠券是否过期/是否已用过/能否叠加、无效码看到什么错误提示、折扣是实时更新还是提交时更新、校验是否有频率限制),并列出单元/集成/E2E/探索性四层测试计划。
- 对满足以下任一条的 story 开 Three Amigos(15–30 分钟,产品/业务 + 开发 + QA 三方视角):风险评分 Medium 以上、涉及支付/鉴权/数据完整性、需求含糊、跨团队。
- Three Amigos 可选加入第四方 AI:让编码 agent 从验收标准生成边界情况和反向场景,AI 输出只当待验证清单,决策权仍在人。
- 按固定议程跑 Three Amigos(最长 30 分钟):产品讲 story 5 分钟 → 开发提澄清问题 5 分钟 → QA 提测试问题 5 分钟 → 集体找缺口 10 分钟(补验收标准、把假设显式化)→ 达成一致与下一步 5 分钟(更新 story、记录风险、约定测试方案)。
- 以下情况跳过 Three Amigos:复现步骤清晰的简单 bug 修复、纯文案改动、无行为变化的依赖升级。
- 做 dev/QA 结对测试优先设计:开发与 QA 同屏 20–30 分钟,QA 讲自己打算测的场景,开发写测试签名(函数名、输入、期望输出),一起区分哪些是单元/集成/E2E,开发再以这些测试为目标实现功能。
- QA 评审 PR 起步方式:先只安排一名 QA reviewer 看高风险 PR,不要第一天就覆盖所有 PR。
- QA 评审批次限时 15 分钟,只查测试质量,不重新评审业务逻辑。
- QA 评审使用下面的 PR checklist,它给出客观标准,不需要主观判断。
- QA 评审意见以建议而非要求的方式给出:说「考虑为空状态加个测试」,而不是「缺测试」。
- 记录 QA 评审捕获缺口的次数,2–4 周后把数字分享给团队以证明 ROI。
- 按 Red-Green-Refactor 三步循环做 TDD:RED 写一个描述期望行为的失败测试(必须失败,若通过说明它什么都没测,一次只规定一个行为);GREEN 写最小代码让测试通过(不加额外功能、不过早优化,代码丑也没关系);REFACTOR 在不改变行为的前提下改进结构(去重、改进命名、简化),重构后所有测试仍全绿。
- 按决策指南选择 TDD 还是测试后写:纯业务逻辑(校验器、计算器、转换器)、有已知复现的 bug 修复、契约清晰的 API 端点 → TDD;探索性 UI 原型、第三方集成、复杂数据迁移(先写样本数据再测转换)、性能优化(先有 baseline 再测改进)→ 测试后写(迁移用 fixture、性能用 benchmark);AI 生成的实现 → 测试先行。
- Bug 修复一律先写一个能复现该 bug 的失败测试,它保证三件事:你确实理解了这个 bug(写不出失败测试就没理解)、修复真的生效(测试转绿)、bug 不会回归(测试留在套件里当回归护栏)。
- 团队用 kata 练 TDD 肌肉记忆(30–60 分钟):FizzBuzz(入门,基本 Red-Green-Refactor)、String Calculator(入门,渐进复杂度和边界)、Roman Numerals(中级,模式识别与重构)、Bowling Game(中级,状态管理和复杂规则)、Gilded Rose(高级,在测试护栏下重构遗留代码);形式为结对编程 45 分钟、每 5 分钟换一次 driver、复盘 15 分钟(哪里难?哪里自然?下次怎么改?)。
- PR 评审检查「测试存在且有价值」:代码变更必须伴随测试(新功能带新测试、bug 修复带回归测试、重构保证既有测试仍通过并最好有所改进);没有测试的行为变更 PR 需要给出明确理由。
- PR 评审检查 happy path 与边界情况都覆盖:至少包含有效输入、无效输入、空/null 输入、边界值;面向用户的功能还要覆盖错误态、加载态、空态。
- PR 评审检查测试描述行为而非实现:命名读起来像规格说明,例如 `rejects expired coupon with clear error message`,而不是 `test coupon validator function line 42`。
- PR 评审检查函数输入输出清晰、副作用被隔离(用依赖注入或包装函数)。
- PR 评审检查依赖可注入:数据库客户端、HTTP 客户端、时钟、随机数生成器应是参数或注入的,不能直接在业务逻辑里 import。
- PR 评审检查没有硬编码魔法值:常量要有命名且可配置,测试能覆盖它而不必修改生产代码。
- PR 评审检查选择器策略稳定:E2E 用 `data-testid`、`getByRole`、`getByLabel`,不用 CSS class 或 XPath。
- PR 评审检查断言具体:写 `expect(result).toEqual({ status: 'expired', code: 'COUPON_EXPIRED' })`,而不是 `expect(result).toBeTruthy()`。
- PR 评审检查测试数据确定:不依赖当前日期、随机值或自增 ID(除非显式控制),使用 factory 或 fixture。
- PR 评审检查测试自我清理:创建的记录被删除、修改的状态被还原,不留测试污染。
- PR 评审检查测试名描述了场景:不熟悉该代码的人仅凭测试名就能知道在测什么。
- PR 评审检查没有只为覆盖率的测试:执行了代码但没有有意义断言的测试只抬高覆盖率、不提供安全性。
- 当 PR 是 AI 生成或引入 AI 功能时额外检查——AI 出处已披露:PR 描述写明所用的 agent、模型以及它生成了什么,让 reviewer 校准审查力度。
- AI 相关额外检查——测试先写或由人写:AI 生成的实现配 AI 生成的测试是闭环,测试/实现这一对至少有一边必须由人撰写或被严格评审。
- AI 相关额外检查——prompt 与模型版本固定:AI 功能(LLM 调用、prompt 模板)的 prompt 版本和 model ID 放在基于 flag 的配置存储中(如 LaunchDarkly AI Configs 或等价方案),PR 引用 config key,不要把 prompt 内联粘贴成会漂移的字符串。
- AI 相关额外检查——接入运行时 kill switch:任何 AI 功能都要放在可无需重新部署即关闭的 feature flag 后面,把 left 的预防与 right 的围堵配套上线。
- AI 相关额外检查——存在 prompt eval 测试:针对代表性输入至少有一个关于 prompt 行为的回归测试。
- AI 相关额外检查——没有捏造的 API 或 import:reviewer 逐个确认被 import 的符号真实存在(LLM 会编造听起来合理的 API)。
- 建立 Definition of Done 模板并按 Code Complete、Tested、Quality Gates Pass、Documentation、Deployment Ready 分组;Tested 组要求业务逻辑有单元测试、API/服务变更要有集成测试、面向用户的关键路径要有 E2E 测试、边界情况与错误态被覆盖、中/高风险变更完成人工探索性测试;Quality Gates 组要求 CI 流水线全绿、无新增 lint/type 错误、代码覆盖率不低于基线(用基线数字,而非凭空拍出的绝对阈值)。
- 用三种机制强制执行 DoD:CI 中的自动化门禁(测试必须通过、覆盖率不得下降、lint 必须通过,绕过需团队 lead 批准);PR 模板 checklist(把 DoD 做成 PR 模板里的勾选项,reviewer 逐项确认);sprint review 验收(只有满足 DoD 才接受 story,「能跑但测试还没写」就是没完成)。
- 用成熟度模型定位团队并找出下一步——Level 1 Reactive(QA 只在开发完成后测、bug 在 staging 或生产才发现、几乎没有自动化测试、需求含糊靠 QA 测时发现缺口、QA 阶段是 sprint 末尾的独立区块)→ 下一步把 QA 引入 sprint planning,先让 QA 在开发前对每个 story 提澄清问题;度量「planning 中发现的缺口数 vs 测试中发现的缺口数」。
- Level 2 Gate(QA 会评审 PR 但不参与设计、自动化测试存在但在功能完成后才写、DoD 存在但测试项常被跳过、QA 是检查点而非协作者、测试后写导致缺陷发现晚且返工常见)→ 下一步对高风险 story 引入 Three Amigos,让 QA/开发/产品在开发前讨论需求、边界和测试方案;度量 QA 测试阶段发现的 bug 数下降。
- Level 3 Embedded(QA 参与 sprint planning 和 story 细化、开发在开发过程中写单元与集成测试、PR 评审包含可测试性检查、QA 与开发结对设计测试用例、DoD 由自动化质量门禁强制执行)→ 下一步对 bug 修复引入测试先行(每个修复都从失败测试开始),再扩展到纯业务逻辑的 TDD;度量回归率趋近于零。
- Level 4 Collaborative(中/高风险 story 标配 Three Amigos、开发对业务逻辑和 bug 修复实践 TDD、QA 专注探索性测试/策略/风险分析、质量指标被定期跟踪复盘、质量归跨职能共同所有)→ 下一步把 shift-left 引入架构与设计评审,让 QA 在实现前评审系统设计文档的可测试性;度量缺陷逃逸率稳定低于 5%。
- Level 5 Preventive(质量内建到每个阶段、缺陷逃逸率稳定低于 3%、QA 专注策略/教练/系统性改进、生产问题稀少并触发根因分析、团队无法想象没有早期质量实践怎么工作)→ 维持方式:每季度做成熟度评估、新成员第一天就按质量实践 onboarding、回顾会纳入质量指标。
- 用自评表对八项实践(QA 进 planning、Three Amigos、PR 评审、开发期写测试、bug 先写失败测试、业务逻辑 TDD、强制 DoD、指标复盘)按 Never/Sometimes/Usually/Always 打分,据此把团队定位到 Level 1–5。
- 验证门禁真的会拦截(从不触发的门禁不能证明任何事):开一个改变行为但不带测试的临时 PR(或让覆盖率低于基线),确认 CI 变红且合并按钮被禁用;如果它能合并,门禁就是装饰品。
- 验证 DoD checklist 出现在 PR 模板中:确认 `.github/pull_request_template.md`(或平台等价文件)里有 DoD 清单,使 reviewer 在每个 PR 上都能看到,例如执行 `test -f .github/pull_request_template.md && grep -qi "unit test" .github/pull_request_template.md`。
- 验证 AI kill switch 能关闭:对任何 AI 驱动的路径,在 flag 平台把开关切到 disabled,确认不重新部署该路径即失效。
- 完成标准:DoD 已更新为包含测试标准(单元、集成、E2E 门禁)并提交到仓库(例如出现在 `.github/pull_request_template.md`);带测试覆盖检查的 PR 评审 checklist 已检入 PR 模板并由分支保护强制;至少为一个即将开发的功能跑过一次 Three Amigos,缺口被记录、验收标准已在 ticket 中更新;已完成首次 dev/QA 结对,约定的测试签名已提交到仓库;CI 中预合并质量门禁(测试通过、覆盖率不下降、lint)已生效,并实际观察到无测试 PR 失败;每条有风险或 AI 驱动的代码路径都有 feature flag 且其关闭开关已在平台验证,使预防(shift-left)与围堵(shift-right)配套上线。
适用边界 · 注意事项
- 不要把「shift left」当作裁撤 QA 岗位的理由:它改变的是质量发生在「何时」,不是「谁来做」;让开发「多测一点」换掉 QA 只会留下盲区。
- 不要在 UI 原型、探索性 spike 或设计仍在流动的实验性功能上强推 TDD——先用 spike 探明方向,再围绕成型的设计补测试。
- 不要在未解释原因、未让团队参与设定阈值的情况下强加质量门禁(覆盖率阈值、强制 QA 评审),被感知为强加的门禁会被绕过。
- 不要在错误的层级测试:给本该单元测试校验的业务逻辑写 E2E,或给需要 E2E 的用户流程写单元测试;shift-left 也是「尽早、在正确的层级测」。