Skip to content

质量保障 (Quality Assurance) ​

质量保障 = 测试金字塔 + TDD + 静态分析——跨项目通用的质量实践。

一句话 ​

质量保障 = 测试金字塔 + 100% 测试覆盖率的元纪律——质量不是测出来的,是设计出来的。

它在哲学里叫什么 ​

Kant《纯粹理性批判》(1781) —— 范畴的综合 ​

知性用 12 范畴综合感性材料——知识 = 先验形式 + 经验材料。

质量保障的 Kant 加深:

  • 质量保障 = 知性综合——把代码看作待综合的材料
  • 质量保障 = 先验形式 + 经验材料——测试模式(先验)+ 测试用例(经验)

海德格尔《存在与时间》(1927) —— §32 领会的"作为" ​

"'作为'是此在解释学的核心机制——任何解释都建立在预先的'作为'之上。"

质量保障的海德格尔加深:

  • 质量保障 = "作为"结构——测试作为"质量保证"
  • 质量保障 = 领会先行——质量在编码前就要被领会

Wittgenstein《Tractatus》(1921) —— 命题的逻辑结构 ​

命题 = 现实的图像(4.01)

质量保障的 Wittgenstein 加深:

  • 质量保障 = 命题逻辑结构——测试 = 验证命题与现实的一致性
  • 质量保障 = 命题的真理条件(4.2):命题的同意与不同意 = 真值

James《Pragmatism》(1907) —— 真理的可验证性 ​

"Truth is a good, like health, wealth, etc. It is expedient thinking."

质量保障的 James 加深:

  • 质量保障 = 真理的可验证性——测试 = 真理验证
  • 质量保障 = 实用主义的纪律——测试必须实用,不是装饰

老子《道德经》—— 上德不德 ​

"上德不德,是以有德"(38 章)

质量保障的老子加深:

  • 质量保障 = 上德不德——最好的质量是无需质量检查的(设计内建)
  • 质量保障 ≠ 装饰——质量不是装饰,是内建

它在控制论里叫什么 ​

钱学森《论系统工程》(1978) —— §4.8 三难困境 ​

"设计一个系统满足全部上述指标几乎是不可能的。"

质量保障的钱学森加深:

  • 质量保障 = 三难困境的应对——质量 vs 时间 vs 成本的取舍
  • 质量保障 = 互不影响原则——各质量实践尽量解耦

INCOSE SE Handbook —— 质量属性 ​

质量属性(Quality Attributes):

  • 性能(Performance)
  • 可用性(Availability)
  • 安全性(Security)
  • 可维护性(Maintainability)
  • 可扩展性(Scalability)
  • 可测试性(Testability)

质量保障的 INCOSE 加深:

  • 质量保障 = 多质量属性——不只是"功能正确"
  • 质量保障 = Tailoring 原则——每个项目剪裁适合的质量实践

它在系统思维里叫什么 ​

Marcus P. Dawson《Thinking in Systems》(2020) —— 反馈环 + 系统映射 ​

质量保障的 Dawson 加深:

  • 质量保障 = 反馈环——测试是反馈机制
  • 质量保障 = 系统映射——画出质量依赖关系

Mike X Cohen《Linear Algebra》—— 谱分析 ​

谱分析的工程含义:

  • 质量保障 = 谱分析——周期性异常识别
  • 质量保障 = 频率域——在频率域看质量的周期性

它在软件工程里叫什么 ​

测试金字塔(Test Pyramid) ​

       /\
      /E2E\         ← 少而精
     /------\
    /  集成  \      ← 中等
   /----------\
  /   单元测试  \   ← 多而细
 /----------------\

三层结构:

  1. 单元测试(70%):单个函数 / 类的测试
  2. 集成测试(20%):组件间交互的测试
  3. E2E 测试(10%):端到端用户场景的测试

测试驱动开发(TDD) ​

Red → Green → Refactor:

  1. Red:先写失败的测试
  2. Green:写最少的代码让测试通过
  3. Refactor:重构代码保持测试通过

TDD 的元纪律:

  • 测试先行
  • 测试是规格说明
  • 测试是回归保护

行为驱动开发(BDD) ​

Given-When-Then:

  • Given:前置条件
  • When:动作
  • Then:预期结果

BDD 的工具(通用):

  • Cucumber / SpecFlow / Behave

静态分析 ​

通用静态分析模式:

  • 代码风格(linting):ESLint / Pylint / Checkstyle
  • 类型检查:TypeScript / mypy / Scala
  • 安全扫描:SonarQube / Snyk / OWASP
  • 复杂度度量:圈复杂度 / 认知复杂度
  • 依赖扫描:npm audit / pip-audit / OWASP Dependency-Check

代码覆盖率 ​

覆盖率类型:

  • 行覆盖(Line Coverage):执行的代码行数
  • 分支覆盖(Branch Coverage):执行的分支数
  • 路径覆盖(Path Coverage):执行的路径数
  • 变异测试(Mutation Testing):故意引入 bug 看测试是否捕获

覆盖率的元纪律:

  • 100% 覆盖率不是目标
  • 高覆盖率 ≠ 高质量
  • 关键路径必须覆盖

契约测试(Contract Testing) ​

消费者驱动的契约测试(CDC):

  • 消费者定义期望的契约
  • 提供者验证满足契约
  • 工具:Pact / Spring Cloud Contract

质量保障的元纪律 ​

元纪律含义
测试先行测试在生产代码之前
测试隔离测试之间不互相依赖
测试快速单元测试 < 1 秒
测试可重现同一测试每次结果相同
测试明确测试名称说明意图
测试覆盖关键路径必须有测试
测试维护测试代码也是代码
静态先行静态分析在提交前
CI 集成测试在 CI 中自动运行
失败优先失败立即反馈,不累积

质量保障的反模式 ​

反模式含义后果
覆盖率痴迷追求 100% 覆盖无意义的测试
测试耦合测试之间互相依赖一个失败全部失败
测试缓慢单元测试跑 10 秒反馈延迟
测试脆弱频繁误报团队忽略测试
跳过测试注释掉失败的测试技术债累积
事后测试写完代码再补测试测试失去设计价值
手工测试主要靠手工点不可重现 / 不可持续

看不见的地方 ​

失效模式 1:覆盖率痴迷 ​

失效:追求 100% 覆盖 → 无意义测试。

失效模式 2:测试耦合 ​

失效:测试之间互相依赖 → 一个失败全部失败。

失效模式 3:测试缓慢 ​

失效:单元测试跑 10 秒 → 反馈延迟。

失效模式 4:测试脆弱 ​

失效:频繁误报 → 团队忽略测试。

失效模式 5:跳过测试 ​

失效:注释掉失败的测试 = 技术债累积。

失效模式 6:事后测试 ​

失效:写完代码再补测试 = 测试失去设计价值。

失效模式 7:手工测试为主 ​

失效:主要靠手工点 → 不可重现。

失效模式 8:Definition of Done 腐蚀 ​

失效:"看起来跑通" = 不算完成。

失效模式 9:100% 覆盖率的失守 ​

失效:覆盖率下降到 80%、50%。

失效模式 10:CI 集成失败 ​

失效:测试在本地能跑但在 CI 中失败。

失效模式 11:测试金字塔倒置 ​

失效:E2E 测试多于单元测试 = 缓慢 + 脆弱。

失效模式 12:忽略 Kant 12 范畴 ​

失效:测试只关注"功能正确",忽略其他范畴(性能/可用性/可维护性)。

失效模式 13:忽略 Wittgenstein 4.2 真理条件 ​

失效:测试只检查"是否运行",不检查"是否正确"。

失效模式 14:忽略 James 实用主义纪律 ​

失效:测试是装饰而非实用。

失效模式 15:老子"上德不德"的反向 ​

失效:靠测试补救而非设计内建。

相关节点 ​

  • 价值流 (E1) — 质量保障嵌入价值流
  • 反馈机制 (E3) — 测试失败是反馈信号
  • 变更管理 (E4) — 变更前后的质量验证
  • 度量改进 (E5) — 质量度量驱动改进

哲学根基:Kant 范畴综合 / 海德格尔 §32 "作为" / Wittgenstein 4.01-4.2 / James 真理可验证性 / 老子 38 章 元理论根基:钱学森 §4.8 三难困境 / INCOSE 质量属性 思维工具根基:Dawson 反馈环 + 系统映射 / LA 谱分析 工程层投影:测试金字塔 + TDD + BDD + 静态分析 + 代码覆盖率 + 契约测试 + 10 大元纪律

从名家方法论与工程化思路中蒸馏出自己的工程体系。