一个人守不住所有质量,只能守住那些坏了就回不来的地方。
这个系列解决什么问题
一个人做产品,最难的不是写功能,是每次按发布键之前那十分钟。没有测试团队,没有 QA 同事,也没有第二双眼睛;能用的只有每周几个小时、一份清单和一个门禁。
这个系列不讲「怎么写单元测试」,也不讲测试框架怎么配。它讲的是取舍:一年 47 个线上缺陷里,哪些本来能拦住;12 条关键路径中,哪 5 条坏了不可逆;38 条回归清单怎么砍到发布时只跑 26 条;6 项门禁检查怎么在 11 分钟内跑完;以及一个人没有双人复核时,怎么用预演、快照和冷却期替代。
它服务的是一个每周只能拿出 4 小时做验证的人。 你能投入的不是一套测试平台,而是一张关键路径表、一份分层回归清单和一条「红灯不准发」的规则。
核心主张:五条口径
- 质量是预算,不是态度。 192 小时一年,花在哪条路径上,决定你拦得住哪种事故。
- 先按不可逆性排序,再按概率排序。 丢数据、收错钱、进不去,三类问题的修复成本远高于其他。
- 测试分层服务于变更,不服务于覆盖率。 单元测钱和权限,集成测边界,端到端只留 6 条。
- 门禁必须能在发布前跑完。 跑不完的检查等于没有;11 分钟是上限,不是目标。
- 不可逆操作要有第二次机会。 预演、快照、输入确认、冷却期,四件事合起来才是「一个人的双人复核」。
10 篇速览
| # | 文章 | 核心内容 | 阶段 |
|---|---|---|---|
| 01 | 质量是一笔预算:四十七个缺陷、八十六小时与三条红线 | 47 缺陷、86.5 h、三条红线、192 h/年 | 记账 |
| 02 | 关键路径清单:十二条不能坏的路径 | 12 条路径、5 条不可逆、48 项检查 | 清单 |
| 03 | 三层验证的一个人配比:单元、集成与六条端到端 | 214 单元、31 集成、6 条 E2E、332.8 秒 | 分层 |
| 04 | 回归清单:三十八条怎么砍到二十六条 | 38→26、58 分钟、年省 6.64 h | 回归 |
| 05 | 发布门禁:六项检查与一个红绿灯 | 6 项、10.8 分钟、拦截 7 次、净省 21.64 h | 门禁 |
| 06 | 缺陷分级:四级、四个时限与一个周末例外 | P0–P3、2 h/24 h/本周/季度、达标 80.9% | 响应 |
| 07 | 测试数据与假依赖:一个种子、四个替身与三列脱敏 | 1 租户 12 任务、4 替身、2.4 秒重置 | 数据 |
| 08 | 不可逆操作:预演、快照、冷却与一个人的双人复核 | 4 类操作、4.7 分钟/次、净省 6.06 h | 保护 |
| 09 | 验证的边际收益:什么时候可以不写测试 | 3 种不写、3 种必写、测试债 17 项 | 取舍 |
| 10 | 质量验收:十项检查、四维评分与一次季度复盘 | 10 项检查、权重 0.35/0.25/0.20/0.20、3.13→4.11 | 验收 |
三条阅读路径
路径 A:刚上线,几乎没有测试。 先读 01 把三条红线和验证预算定下来,再读 02 列出 12 条关键路径,最后用 05 的六项门禁跑第一次发布。这条路径的重点是「先有红灯,再谈覆盖率」。
路径 B:有测试,但发一次怕一次。 先读 03 把三层配比调顺,再读 04 把回归清单分层,最后用 06 给缺陷定级和时限。这条路径的重点是「让验证时间随风险变化,而不是随心情变化」。
路径 C:出过事故,或要接企业客户。 先读 08 把不可逆操作的四件套补齐,再读 07 隔离测试数据,最后用 10 做一次四维评分。这条路径的重点是「同样的错不犯第二次」。
与其它专题的边界
站内已有测试工程、运维、交付、架构与各组业务验收内容,但都不处理「一个人怎么决定发不发」这条线。下表说明本组不重复什么。
| 既有内容 | 它讲什么 | 本组边界 |
|---|---|---|
| 测试工程专题 | 每种测试技术怎么做:金字塔、TDD、契约、混沌、性能与安全 | 它给方法;本组给一个人每周 4 小时的取舍、清单与门禁 |
| 一个人的运维:可用性、告警、事故与值班 | 上线后的探针、告警、事故响应与复盘 | 它管上线后出事怎么办;本组管上线前敢不敢按发布键 |
| 版本节奏与回滚:发布列车、兼容窗口与一次撤回 | 发布列车、兼容窗口、撤回流程 | 它管发布节奏与撤回;本组管发布前验证什么、什么情况禁止发 |
| 一个人的架构:技术选型、模块边界与演进 | 模块边界、数据模型迁移、技术债预算 | 它管代码怎么组织;本组要的是行为正确性的证据 |
| 一个人的计费系统:订阅状态机、按比例计费与失败重试 | 订阅状态机、按比例计费、催收与对账 | 它管计费逻辑本身;本组把结账与订阅变更列为关键路径并给验证方式 |
| 一个人的隐私工程:数据地图、最小化与删除权 | 数据主体请求、删除权、保留期与清理任务 | 它管删什么、留多久;本组管删除操作的预演、快照与冷却 |
| 一个人的多租户:组织、邀请、角色与数据隔离 | 角色矩阵、三层校验、数据隔离与审计 | 它管权限模型;本组管权限变更的验证与回滚 |
| 一个人的产品度量:事件字典、指标口径与决策看板 | 事件字典、埋点三处校验、口径与看板 | 它记行为数据;本组记缺陷、回归与门禁的验证账 |
| 一个人的数据搬家:导入、去重、迁移与退出 | 导入契约、幂等重跑、导出四件套 | 它管数据怎么进出;本组把导入列为关键路径并测它的失败分支 |
| 一个人的前 100 天:从想法到第一批付费用户 | 上线前十五件事与发布清单 | 它是时间盒清单;本组把「验证」拆成预算、分层清单与门禁 |
| 一个人把用户搞懂:访谈、观察、可用性测试与证据链 | 可用性测试、证据强度分级 | 它发现需求问题;本组防行为回归 |
| 一个人的服务生意:从接单、报价到产品化 | 里程碑、周报与客户验收 | 它是客户验收;本组是发布验收 |
| 一个人的安全基线:十四个入口、十七个密钥与一次 72 小时响应 | 14 个攻击面、认证与枚举、会话撤销、17 个密钥三档、四条边界、41 个依赖与 186 条告警、四类限流、9 类审计日志、72 小时三段响应、20 项验收 | 那组管攻击者能不能绕过功能;本组管功能对不对——关键路径、回归与门禁 |
| 一个人的性能与账单:4.2 秒的首屏、一千二百次查询与每月 210 美元 | 4 项预算与 20 格、RUM 与慢查询、412→168 KB、1,200→3 次查询、0→86% 缓存、34 秒导出、7→4 个第三方、210→118 美元、3 次回归告警、10 项验收 | 那组管同样功能快不快、贵不贵;本组管功能对不对——关键路径、回归与门禁 |
| 一个人的企业客户:九家询价、一百四十八道问卷与 134 天的第一单 | 9 家询价与 130 h、96 天采购、148 题问卷、7 个子处理者、SLA 43.2/216 分钟、26 h SSO、4 周试点、38 天到账、8 h 实施、10 项验收 | 那组讲客户验收与试点结论;本组讲关键路径、回归与发布门禁 |
| 一个人的开源产品:4,200 个 star、一百八十个付费与一年 612 小时的维护 | 4,200 star 与 1,949 美元、612 h 维护、214 依赖、48,600 行 78/22、1,180 个 issue、214 条告警、23 个赞助者、9 家双许可、17 位贡献者、10 项验收 | 那组讲开源项目的发版节奏;本组讲关键路径、回归与发布门禁 |
这十篇不教具体测试框架的用法,不承诺「零缺陷」,也不评价任何厂商工具。可复算的部分全部用四则运算给出算式;不可复算的部分(框架行为、平台限制)明确指向官方文档。所有数字都是教学假设,代入前请换成自己的缺陷数、发布次数与每周验证时间。
本组统一口径
全组共用一组教学假设,各篇引用时不换分母:
产品:一人 SaaS 任务板,与既有组同一产品;账号 344,付费 120
时间:一年 48 周 × 40 h = 1,920 h;验证预算 10% = 192 h,按每周 4 h
线上缺陷 47:P0 3 + P1 9 + P2 21 + P3 14
关键路径缺陷 31 ÷ 47 = 66.0%
修复工时 86.5 h = P0 3×2.5(7.5) + P1 9×4(36) + P2 21×1.5(31.5) + P3 14×0.5(7) + 回归沟通 4.5
缺陷中位修复:P0 1.2 h、P1 18 h、P2 4.6 天、P3 23 天
缺陷达标(时限内):P0 3/3、P1 7/9、P2 17/21、P3 11/14 → 38/47 = 80.9%
一年记录缺陷 77 个:开发自测 19 + 发布前 11 + 线上 47
30 个前移 × 0.5 h = 15 h;15 ÷ 86.5 = 17.3%
缺陷成本倍数(教学假设):需求 1、开发 5、发布前 15、线上 100
关键路径 12 条,每条 4 项检查 = 48 项;一轮 35 分钟
不可逆路径 5 条:结账、订阅变更、导出、删除账号、权限变更
单元 214 个 / 6.8 秒;集成 31 个 / 74 秒;E2E 6 条 / 252 秒
全量 332.8 秒 = 5 分 33 秒;受影响集 107.5 秒
回归清单 38 条:必跑 12 + 选跑 14 + 季度 12
全量 38 × 2.4 = 91.2 分钟;发布跑 26 条 = 58 分钟;每次省 33.2 分钟
12 次发布省 398.4 分钟 = 6.64 h
门禁 6 项 × 1.8 = 10.8 分钟;拦截 7 次;事故均值 3.4 h → 23.8 h
门禁成本 12 × 10.8 = 129.6 分钟 = 2.16 h;净省 21.64 h
测试数据:1 租户 / 3 用户 / 4 项目 / 12 任务;种子 18 KB;重置 2.4 秒
替身 4 个:支付、邮件、对象存储、OAuth;真实只读依赖 2 个:时区库、邮编库
不可逆保护:预演 4 分钟 + 快照 12 秒 + 确认 30 秒 = 4.7 分钟/次
12 次/年 = 56.4 分钟;避免 2 次误删 × 3.5 h = 7 h;净省 6.06 h
单测回本:写 12 分钟,年触发 40 次 × 省 8 分钟 = 5.33 h;净省 5.13 h
测试债 17 项:偿还 9 项 6.5 h,跳过 8 项
质量四维权重 0.35/0.25/0.20/0.20
现状 3.13 = 0.35×3.0 + 0.25×3.5 + 0.20×3.0 + 0.20×3.0
修后 4.11 = 0.35×4.0 + 0.25×4.25 + 0.20×4.0 + 0.20×4.25
季度复盘 4 × 6 h = 24 h/年
86.5 h 是修复总工时,不是 82.0 h。 82.0 是四级缺陷的工时之和,另有 4.5 h 用于回归与沟通;引用时不要漏掉这一项。
47 是线上缺陷数,77 是一年记录的全部缺陷数。 两个数回答的不是同一个问题:47 决定你救了多少次火,77 决定你有多少机会把火拦在前面。
成本倍数 1/5/15/100 是教学假设。 它只用来排序,不用来算钱;不同产品的真实倍数差异很大,代入前请用自己的工时记录替换。
使用说明
先把三条红线写下来。 丢数据、收错钱、进不去,只要有一条坏了就不可接受;其余问题可以排期。
清单要短到能在发布前跑完。 91 分钟的全量回归,跑到一半就会开始跳步;58 分钟的分层清单才可能每次都跑。
门禁的红灯必须真的能停发布。 如果红灯只换来一句「下次注意」,它就不再是门禁,只是日志。
不可逆操作先预演。 影响行数没看到之前,不要点执行;快照与冷却期是第二道,不是第一道。
本组的证据与使用方法
证据类型。 本组用的是「47 个线上缺陷记录 + 77 个全量缺陷台账 + 12 次发布记录 + 7 次门禁拦截 + 2 次误删恢复 + 17 项测试债清单」。没有「最佳实践」式的断言。
如何使用。 先用 01 的账核对自己的缺陷分布,再用 02 列出 12 条路径,用 04 把回归分层,最后用 05 的门禁跑一次真实发布。
如何复核。 取最近一次发布:看门禁六项是否全跑、回归清单是否按变更类型选、P0 是否在 2 小时内响应、不可逆操作是否有预演记录。四项都能对上,这套基线才适用。