学习指南: 应用部分 5. 规范的变异测试

模块「应用部分 5. 规范的变异测试」中第 3 / 5 节课
您正在未登录状态下查看课程。 请登录,以保存进度并参加测试。

主题: 应用部分 5. 规范的变异测试

难度等级: 中级(中等)

预计学习时间: 3-4 小时

前置要求: 熟悉第 1 卷第 9 部分的事实纪律(Given/When/Then 格式)

理解第 20 部分的 SDD 反模式

具备 Linux 命令行和 Python 3 的基本使用技能

理解 JSON 结构及 JSON Schema 的工作原理

学习目标: 成功运行退化规范的生成器并确保生成的可重复性(通过 seed 验证)。

使用向量免疫指标(strict_reject_rate、depth_of_diagnostics、recovery_time)衡量验证回路的稳健性。

将每个生成的变异体关联到具体的 Given/When/Then 场景步骤及 JSON Schema 规则。

为 CI 和 SDD 生成正确且可复现的可审查跟踪(冒烟测试报告)。

概述: 规范变异测试(或称「验证器疫苗接种」)是一种验证验证器稳健性的实践。该技术不是用正确数据检查系统,而是使用预定义的变异算子(例如,删除字段或创建循环)有目的地「破坏」基础规范。验证器必须在严格定义的步骤捕获此缺陷并输出精确的错误代码。这种方法将验证器从简单的语法检查转变为解剖式诊断工具,确保不正确的故障单不会在生产环境中导致级联故障。

关键概念: 变异测试(mutation testing):一种测试技术,其中参考制品被可控地改变(破坏),而测试回路必须检测此缺陷并拒绝它。

免疫指标(immunity score):验证器稳健性的向量指标,由三个组成部分构成:strict_reject_rate(严格拒绝的案例比例)、depth_of_diagnostics(有用的诊断深度)和 recovery_time(恢复稳定判定的时间)。

变异工厂(mutation factory):确定性生成器,它接受正确的基础规范(base_spec.json)并对其应用破坏算子目录,通过生成种子(seed)保持可复现性。

变异算子(mutation operators):受控缺陷的类型。主要类别:Nullify(字段置空)、FutureTime(时间异常)、EscalationCycle(升级路径中的循环)、PriorityContradiction(优先级矛盾)。

「一个变异体 — 一个预期失败」原则:变异工厂的主要规则。一个变异器只能引入一个缺陷,以便在测试失败时精确定位原因并将其与具体规则关联。

练习题: 名称: 运行变异生成并验证确定性

问题: 需要进入示例目录并使用 Nullify、FutureTime、EscalationCycle、PriorityContradiction 算子和固定 seed 20260517 运行变异生成脚本。必须确保生成器是确定性的。

解决方案: 1. 打开终端并执行:cd book2/examples/stress-mutator。

  1. 运行生成器:python3 scripts/mutate_specs.py --base base/base_spec.json --seed 20260517 --operators Nullify,FutureTime,EscalationCycle,PriorityContradiction --out out/mutations。
  2. 重复步骤 2 中的命令。
  3. 比较清单文件:diff out/mutations/manifest.json manifest.example.json。

预期:0 行差异,每次运行时 mutation_id 的顺序一致。

难度: beginner

名称: 计算验证器的免疫向量

问题: 使用之前生成的变异,运行模拟验证器和免疫指标计算脚本。分析获得的数值并对回路的可用性得出结论。

解决方案: 1. 运行验证器:python3 scripts/fake_validator.py --mutations out/mutations --out out/validator_results.json。

  1. 运行指标计算:python3 scripts/immunity_score.py --validator-results out/validator_results.json --expected expected/expected_failures.json。
  2. 验证数值是否符合阈值:strict_reject_rate >= 0.98,depth_of_diagnostics >= 3,recovery_time_p95_ms <= 1200。

难度: intermediate

名称: 生成可审查的跟踪(Capstone)

问题: 基于所进行的冒烟测试(实践练习 1 和 2),为文件 capstone/validation.md 生成最小报告片段。

解决方案: 创建或打开 capstone/validation.md,并添加包含 seed、算子列表、计算的三个免疫指标及最终判定(verdict: PASS/FAIL)的块。不要提交 out/mutations 目录本身 — 真相的来源应该是可复现的命令。

难度: intermediate

案例研究: 名称: 验证 appointment_latency_spike 故障单

场景: 考虑一个延迟急剧上升的生产故障单(appointment_latency_spike)。根据规范,SLA 为 10 分钟,升级路径从 appointments_oncall 到 sre_lead。基础规范器包含此案例的正确数据。

挑战: 必须确保验证器不会漏掉 severity 字段变为空的情况。如果空字段泄漏到系统中,可能会扭曲 SLA 计算并导致错误地选择故障单负责人,这对值班工程师的吞吐量至关重要。

解决方案: 对 severity 字段应用 Nullify 变异算子。预期验证器在 Given:incident_received 阶段检测到缺陷并输出 EMPTY_REQUIRED_FIELD 错误代码。管道必须在 When:evaluate_sla_window 步骤之前被强制停止。结果关联到 JSON Schema 规则:severity.minLength。

结果: 验证器在计算 SLA 之前成功停止了处理。在 SDD 中记录了证据链:mutation_id、规范中的差异(diff: 'P1' -> '')、诊断代码和路由栈。证明了验证器提供了「解剖式诊断」。

经验教训: 时间异常和空字段应在开始路由和 SLA 计算之前进行检查。

「一个变异体 — 一个预期失败」原则对于无需手动调试即可定位问题至关重要。

相关概念: Nullify 算子

Given/When/Then 格式

strict_reject_rate

名称: 检测升级循环(cdn_error_budget_burn)

场景: 分析一个错误预算燃烧的故障单(cdn_error_budget_burn)。edge_oncall 负责人将 P1 故障单转交给 traffic_sre 团队。

挑战: 使用 EscalationCycle 算子向升级图注入反向边(traffic_sre → edge_oncall)。JSON Schema 对数据格式检查良好,但并不总能表达路由的拓扑行为。必须检查执行回路是否会陷入无限的所有者重新分配。

解决方案: 验证器构建所有者的有向图,并使用 white/gray/black 状态运行深度优先搜索(DFS)。在检测到 gray 节点时,返回 CYCLE_ESCALATION 错误并指出最小循环。失败关联到 When:route_escalation 步骤。

结果: 验证器在执行阶段之前检测到循环并停止流程。报告显示了清晰的失败路径:schema.normalize -> step.when.prepare -> graph.build -> graph.detect_cycle -> halt。

经验教训: 拓扑循环的诊断需要在验证器内进行单独的图遍历。

每个变异体必须关联到具体规则(例如 $defs.escalation_graph.no_cycles),以避免诊断过于笼统。

相关概念: EscalationCycle 算子

图遍历(DFS)

depth_of_diagnostics

学习建议: 始终检查确定性:使用相同的 seed 两次运行变异生成器并比较文件。仅运行一次而没有验证是随机噪声,而非可靠指标。

注意退化场景的类别(空字段、时间异常、升级循环、递归依赖)。开发人员经常忘记图中的反向边。

在学习免疫指标时,始终将其视为向量。如果 strict_reject_rate 上升而 depth_of_diagnostics 下降,则你的回路变得严格但「更盲目」(工程师将不知道如何修复故障单)。

记住规则:out/ 目录不应提交到 Git。仓库中只存储 seed、算子和汇总指标。

附加资源: Runnable example: book2/examples/stress-mutator/README.md — 用于本地运行变异工厂和免疫计算的 Python 工作脚本。

Part 09 feature validation: ../book/part-09-feature-validation.md — 验证的事实纪律,没有它规范变异就失去意义。

Part 20 sdd antipatterns: ../book/part-20-sdd-antipatterns.md — 经典流程错误目录,变异算子基于其构建。

摘要: 规范变异测试将验证器检查转变为可控的工程循环。通过使用变异工厂,你有意创建退化场景(空字段、循环、时间错误)并验证验证器在正确的 Given/When/Then 步骤捕获它们。计算向量免疫指标(strict_reject_rate、depth_of_diagnostics、recovery_time)可以配置 CI 网关,该网关不会放过回归并保护系统免受有毒需求和级联故障的影响。

我的笔记
0 / 10000

笔记保存在当前浏览器中。在其他设备上将不会显示。

课程菜单

课程

在 Qwen Code CLI 开发中使用 SDD。应用课程
进度 0 / 95