@umacloud/knowledge 1.0.14 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/00-governance/knowledge-map.md +1 -1
- package/agentic-delivery/01-standards/context-engineering-for-delivery.md +94 -0
- package/agentic-delivery/01-standards/eval-driven-delivery.md +90 -0
- package/agentic-delivery/01-standards/generated-code-failure-modes.md +91 -0
- package/agentic-delivery/01-standards/production-readiness-scorecard.md +79 -0
- package/agentic-delivery/01-standards/self-improving-memory-and-regression-sets.md +80 -0
- package/agentic-delivery/01-standards/spec-as-contract.md +88 -0
- package/agentic-delivery/01-standards/test-discipline-for-generated-code.md +94 -0
- package/agentic-delivery/01-standards/test-integrity-and-anti-gaming.md +92 -0
- package/agentic-delivery/01-standards/verifier-critic-pattern.md +89 -0
- package/ai/agent-evaluation-benchmark.md +1 -1
- package/ai/ai-agent-memory-context-management.md +1 -1
- package/ai/ai-cost-capacity-optimization-playbook.md +1 -1
- package/ai/ai-data-security-and-compliance-playbook.md +1 -1
- package/ai/ai-domain-index-and-checklist.md +1 -1
- package/ai/ai-governance-maturity-model.md +1 -1
- package/ai/ai-model-selection-and-routing-strategy.md +1 -1
- package/ai/ai-observability-and-oncall-runbook.md +1 -1
- package/ai/ai-rag-engineering-playbook.md +1 -1
- package/ai/ai-red-team-and-safety-evaluation.md +1 -1
- package/ai/ai-release-readiness-and-rollback-gate.md +1 -1
- package/ai/llm-agent-engineering-deep-dive.md +1 -1
- package/ai/prompt-and-tool-guardrails.md +1 -1
- package/api/01-standards/api-versioning-and-deprecation-policy.md +100 -0
- package/architecture/01-standards/configuration-and-environment-management.md +104 -0
- package/architecture/01-standards/domain-driven-design-complete.md +105 -0
- package/architecture/02-playbooks/migration-playbook.md +1 -1
- package/architecture/02-playbooks/system-design-playbook.md +1 -1
- package/architecture/adr-template-and-examples.md +1 -1
- package/architecture/configuration-management.md +95 -1158
- package/architecture/resilience-and-disaster-patterns.md +87 -27
- package/architecture/system-architecture-deep-dive.md +1 -1
- package/backend/01-standards/dependency-and-supply-chain-hygiene.md +90 -0
- package/backend/01-standards/error-handling-taxonomy.md +88 -0
- package/backend/01-standards/idempotency-and-safe-retries.md +101 -0
- package/backend/01-standards/message-queue-patterns.md +96 -374
- package/backend/01-standards/queue-and-consumer-reliability.md +98 -0
- package/backend/01-standards/resilience-and-fault-tolerance.md +101 -0
- package/backend/01-standards/transactions-and-concurrency-control.md +92 -0
- package/cicd/cicd-blueprint-deep-dive.md +1 -1
- package/cicd/release-readiness-gate.md +78 -27
- package/cloud-native/01-standards/container-security.md +1 -1
- package/cloud-native/01-standards/kubernetes-complete.md +1 -1
- package/cloud-native/02-playbooks/gitops-with-argocd.md +1 -1
- package/cloud-native/02-playbooks/k8s-troubleshooting-playbook.md +1 -1
- package/cloud-native/02-playbooks/multicloud-governance.md +1 -1
- package/cloud-native/02-playbooks/serverless-patterns.md +1 -1
- package/cloud-native/02-playbooks/service-mesh-playbook.md +1 -1
- package/cloud-native/03-checklists/container-security-checklist.md +1 -1
- package/cloud-native/03-checklists/k8s-production-readiness-checklist.md +1 -1
- package/cloud-native/04-antipatterns/container-antipatterns.md +1 -1
- package/cloud-native/04-antipatterns/k8s-antipatterns.md +1 -1
- package/cloud-native/05-cases/case-k8s-migration.md +1 -1
- package/cloud-native/05-cases/case-k8s-scaling.md +1 -1
- package/cloud-native/05-cases/case-k8s-security-incident.md +1 -1
- package/cloud-native/06-glossary/cloud-native-glossary.md +1 -1
- package/compliance/01-standards/audit-logging-and-evidence.md +111 -0
- package/compliance/01-standards/privacy-and-compliance-readiness.md +119 -0
- package/data/data-governance-and-modeling-deep-dive.md +1 -1
- package/design/ux-system-deep-dive.md +1 -1
- package/development/00-governance/document-template.md +1 -1
- package/development/01-standards/code-review-and-pr-hygiene.md +85 -0
- package/development/03-checklists/production-readiness-checklist.md +6 -6
- package/development/09-maturity/quarterly-audit-template.md +1 -1
- package/development/11-ui-excellence/ui-aesthetic-system.md +1 -1
- package/development/13-implementation-assets/knowledge-gates-execution.md +1 -1
- package/development/api-contract-and-versioning-guide.md +1 -1
- package/development/api-governance-complete.md +1 -1
- package/development/backend-engineering-complete.md +1 -1
- package/development/code-review-quality-complete.md +11 -34
- package/development/concurrency-reliability-complete.md +1 -1
- package/development/database-engineering-complete.md +1 -1
- package/development/engineering-effectiveness-complete.md +1 -1
- package/development/engineering-standards-deep-dive.md +1 -1
- package/development/frontend-engineering-complete.md +1 -1
- package/development/performance-capacity-complete.md +1 -1
- package/development/refactor-migration-complete.md +1 -1
- package/development/refactoring-and-techdebt-playbook.md +1 -1
- package/development/security-in-development-complete.md +1 -1
- package/experts/architect/contract-first-api-design.md +140 -0
- package/experts/product-manager/prd-template-and-structure.md +144 -0
- package/experts/product-manager/requirements-engineering-ears.md +133 -0
- package/experts/qa-lead/test-plan-template.md +127 -0
- package/frontend/01-standards/accessibility-acceptance-gate.md +91 -0
- package/frontend/01-standards/accessibility-complete.md +3 -3
- package/frontend/01-standards/ui-states-and-resilient-data-fetching.md +97 -0
- package/high-quality-engineering-playbook.md +1 -1
- package/incident/02-playbooks/chaos-engineering-playbook.md +1 -1
- package/incident/postmortem-and-response-deep-dive.md +1 -1
- package/mobile/01-standards/flutter-complete.md +5 -5
- package/mobile/01-standards/react-native-complete.md +5 -5
- package/mobile/02-playbooks/mobile-performance.md +6 -6
- package/mobile/03-checklists/mobile-release-checklist.md +2 -2
- package/mobile/04-antipatterns/mobile-antipatterns.md +2 -2
- package/observability/01-standards/observability-and-slo-operations.md +88 -0
- package/observability/01-standards/observability-standards.md +2 -0
- package/operations/01-standards/cost-and-finops-engineering.md +84 -0
- package/operations/01-standards/production-readiness-review.md +103 -0
- package/operations/aiops-anomaly-detection.md +1 -1
- package/operations/capacity-planning.md +1 -1
- package/operations/chaos-engineering.md +1 -1
- package/operations/incident-command-system.md +1 -1
- package/operations/observability-complete.md +1 -1
- package/operations/slo-sli-playbook.md +1 -1
- package/operations/sre-operations-deep-dive.md +1 -1
- package/package.json +1 -1
- package/performance/01-standards/performance-budgets-and-load-testing.md +91 -0
- package/product/feature-prioritization-framework.md +1 -1
- package/product/kpi-and-metric-tree.md +1 -1
- package/product/product-discovery-and-prd-deep-dive.md +1 -1
- package/release-engineering/01-standards/feature-flag-lifecycle.md +92 -0
- package/release-engineering/01-standards/progressive-delivery-and-release.md +92 -0
- package/release-engineering/02-playbooks/release-rollback-and-recovery-playbook.md +99 -0
- package/release-engineering/03-checklists/release-rollback-readiness-checklist.md +61 -0
- package/release-engineering/04-antipatterns/release-antipatterns.md +63 -0
- package/security/01-standards/authorization-and-access-control.md +94 -0
- package/security/02-playbooks/incident-response-security-playbook.md +1 -1
- package/security/02-playbooks/penetration-testing-playbook.md +1 -1
- package/security/security-architecture-deep-dive.md +1 -1
- package/security/threat-modeling-stride-playbook.md +1 -1
- package/testing/01-standards/ci-test-gates-and-coverage.md +93 -0
- package/testing/01-standards/contract-testing-and-api-contracts.md +102 -0
- package/testing/01-standards/test-data-and-ephemeral-environments.md +105 -0
- package/testing/02-playbooks/e2e-testing-playbook.md +1 -1
- package/testing/risk-based-test-matrix.md +1 -1
- package/testing/testing-strategy-deep-dive.md +1 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ci-test-gates-and-coverage
|
|
3
|
+
title: CI 测试门禁与覆盖率规范(商业级必读)
|
|
4
|
+
domain: testing
|
|
5
|
+
category: 01-standards
|
|
6
|
+
difficulty: intermediate
|
|
7
|
+
tags: [ci, quality-gate, coverage, flaky, required-checks, mutation-testing, pipeline, 门禁, 覆盖率, 商业级]
|
|
8
|
+
quality_score: 95
|
|
9
|
+
last_updated: 2026-06-29
|
|
10
|
+
---
|
|
11
|
+
# CI 测试门禁与覆盖率规范(商业级必读)
|
|
12
|
+
|
|
13
|
+
> 写了测试但不在 CI 里强制跑、不阻断合并,等于没写。商业级交付要求:**每次改动都自动验证,红就不能合**。
|
|
14
|
+
> 本规范定义哪些检查在哪个阶段跑、覆盖率怎么卡、flaky 怎么治,让"绿色"真正可信。
|
|
15
|
+
|
|
16
|
+
## 1. 门禁原则
|
|
17
|
+
|
|
18
|
+
- **快速反馈分层**:把检查按"快→慢"分层,快的先挂、早失败(fail fast),别让开发者等 30 分钟才看到一个拼写错。
|
|
19
|
+
- **必过即阻断**:被列为"required check"的项失败,PR **不可合并**——靠分支保护强制,而不是靠自觉。
|
|
20
|
+
- **可信的绿**:绿色必须代表"真的没问题"。flaky(随机红/绿)会侵蚀信任,让人习惯性"重跑一下",必须当一类缺陷治理。
|
|
21
|
+
- **可复现**:CI 跑的就是别人本地能跑的同一套命令;锁依赖版本、固定随机种子与时钟。
|
|
22
|
+
|
|
23
|
+
## 2. 分阶段执行什么
|
|
24
|
+
|
|
25
|
+
| 阶段 | 触发 | 跑什么 | 目标时长 |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| 提交前 / 本地钩子 | commit/push | 格式化、lint、改动文件的快速单测 | 秒级 |
|
|
28
|
+
| PR(必过门禁)| 每次 PR & 更新 | lint + 类型检查 + 全量单测 + 集成测 + 契约校验 + 构建 + SAST/依赖扫描 | < 10 分钟 |
|
|
29
|
+
| 合并到主干 | merge | 上面全部 + 关键路径 E2E 冒烟 | < 20 分钟 |
|
|
30
|
+
| 夜间 / 定时 | 定时 | 全量 E2E、性能基准、变异测试、可视回归、SCA 全扫 | 不阻断开发 |
|
|
31
|
+
|
|
32
|
+
要点:**慢而全的**(完整 E2E、性能、变异测试)放夜间,避免拖慢每次 PR;**快而关键的**(单测、集成、契约、lint、构建)进 PR 必过门禁。
|
|
33
|
+
|
|
34
|
+
## 3. PR 必过检查清单(required checks)
|
|
35
|
+
|
|
36
|
+
每个 PR 合并前必须全绿:
|
|
37
|
+
- [ ] 代码格式化无 diff(formatter 干净)。
|
|
38
|
+
- [ ] Lint 0 错误(pedantic/严格级别,警告即错误)。
|
|
39
|
+
- [ ] 静态类型检查通过。
|
|
40
|
+
- [ ] 全量单元测试通过。
|
|
41
|
+
- [ ] 集成测试通过(含真实 DB/依赖的关键读写)。
|
|
42
|
+
- [ ] 接口契约校验通过(见 `contract-testing-and-api-contracts`)。
|
|
43
|
+
- [ ] 项目构建成功(产物可生成)。
|
|
44
|
+
- [ ] 依赖漏洞扫描 + 静态安全扫描(SAST)无新增高危。
|
|
45
|
+
- [ ] 覆盖率达标(见 §4),且**新增/改动代码**覆盖率达阈值。
|
|
46
|
+
- [ ] 无密钥/凭据泄漏(secret 扫描)。
|
|
47
|
+
|
|
48
|
+
## 4. 覆盖率怎么卡
|
|
49
|
+
|
|
50
|
+
覆盖率是**护栏不是目标**——100% 行覆盖也能全是无断言的假测试。正确用法:
|
|
51
|
+
|
|
52
|
+
- **关注变更覆盖(diff/patch coverage)**:本次改动的新增/修改代码覆盖率必须达阈值(如 ≥ 80%)。这比"全库总覆盖率"更能防止"新代码不写测试"。
|
|
53
|
+
- **设全局下限 + 禁止下降**:总覆盖率有底线(如关键模块 ≥ 80%、整体 ≥ 70%),且 PR 不得让覆盖率**净下降**。
|
|
54
|
+
- **分层看覆盖**:核心领域逻辑/计费/权限要求高覆盖(含分支);UI 胶水、生成代码、配置可豁免。
|
|
55
|
+
- **分支覆盖 > 行覆盖**:行覆盖会漏掉未走到的条件分支;对关键逻辑要求分支覆盖。
|
|
56
|
+
- **变异测试做抽查(夜间)**:行覆盖只证明"代码被执行",变异测试改变代码看测试是否能发现,证明"断言真的有效"。对核心模块定期跑,揪出"覆盖了但没断言"的空测试。
|
|
57
|
+
|
|
58
|
+
覆盖率反模式:为冲数字写无断言测试、把难测代码排除统计、只看总数不看变更覆盖。
|
|
59
|
+
|
|
60
|
+
## 5. Flaky 测试治理
|
|
61
|
+
|
|
62
|
+
flaky 是 CI 的头号信任杀手,按缺陷对待:
|
|
63
|
+
- **检测**:同一提交多次运行结果不一致即 flaky;记录失败率。
|
|
64
|
+
- **隔离(quarantine)**:确认 flaky 后立刻移出必过门禁(打标隔离)、建工单限期修,**但不允许**长期挂着无人管。
|
|
65
|
+
- **根因**:常见是时间/随机/并发顺序依赖、共享可变状态、真网络、未等待异步、测试间数据污染。修复方向:注入可控时钟与种子、每用例独立数据与事务回滚、显式等待替代 sleep、并行安全。
|
|
66
|
+
- **禁止"重跑掩盖"**:把"重试直到绿"当默认策略会永久隐藏真 bug;自动重试只用于明确隔离区,且计数告警。
|
|
67
|
+
|
|
68
|
+
## 6. 测试数据与环境
|
|
69
|
+
|
|
70
|
+
- 集成测试用**一次性真实依赖**(容器化 DB/内存库),每用例自带数据、跑完清理或事务回滚,互不污染。
|
|
71
|
+
- 不依赖共享/生产测试库;不依赖"先跑某测试"的隐式顺序。
|
|
72
|
+
- 测试可**并行**:无全局可变状态、无固定端口冲突、数据隔离。
|
|
73
|
+
- 确定性:固定随机种子、可注入时钟、稳定排序,杜绝时序/时区导致的 flaky。
|
|
74
|
+
|
|
75
|
+
## 7. 反模式(出现即不合格)
|
|
76
|
+
|
|
77
|
+
1. **写了测试不进 CI**:本地偶尔跑,主干随时可坏。
|
|
78
|
+
2. **检查非必过**:失败也能合并(没接分支保护)。
|
|
79
|
+
3. **覆盖率只看总数**:新代码零测试但总数没掉,蒙混过关。
|
|
80
|
+
4. **为覆盖率写无断言测试**:数字漂亮,实则没验证任何行为。
|
|
81
|
+
5. **flaky 长期隔离无人修**:隔离区变垃圾堆,真问题被埋。
|
|
82
|
+
6. **全量慢测试塞进每个 PR**:反馈 40 分钟,没人愿等,干脆跳过。
|
|
83
|
+
7. **CI 与本地命令不一致**:本地绿 CI 红,无法复现。
|
|
84
|
+
|
|
85
|
+
## 8. 最低交付 checklist
|
|
86
|
+
|
|
87
|
+
- [ ] 分支保护开启,关键检查设为 required,红则不可合。
|
|
88
|
+
- [ ] PR 门禁 < 10 分钟,包含 lint/类型/单测/集成/契约/构建/安全扫描。
|
|
89
|
+
- [ ] 慢测试(全 E2E/性能/变异/可视回归)放夜间,不拖 PR。
|
|
90
|
+
- [ ] 变更覆盖率达阈值 + 总覆盖率不下降,核心模块要分支覆盖。
|
|
91
|
+
- [ ] flaky 有检测、隔离、限期修流程,不靠"重跑"掩盖。
|
|
92
|
+
- [ ] 测试数据隔离、可并行、确定性(固定种子/时钟)。
|
|
93
|
+
- [ ] CI 跑的命令与本地一致、可复现。
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: contract-testing-and-api-contracts
|
|
3
|
+
title: 契约测试与接口契约规范(商业级必读)
|
|
4
|
+
domain: testing
|
|
5
|
+
category: 01-standards
|
|
6
|
+
difficulty: intermediate
|
|
7
|
+
tags: [contract-testing, consumer-driven, api-contract, schema-validation, integration, ci-gate, 契约测试, 商业级]
|
|
8
|
+
quality_score: 95
|
|
9
|
+
last_updated: 2026-06-29
|
|
10
|
+
---
|
|
11
|
+
# 契约测试与接口契约规范(商业级必读)
|
|
12
|
+
|
|
13
|
+
> 前后端、服务与服务之间靠"接口契约"协作。只跑各自的单测,无法发现"后端悄悄改了字段、前端还在用旧字段"这类**集成断裂**。
|
|
14
|
+
> 契约测试用机器可验证的方式锁住接口形状:一方改了不兼容的契约,CI 立刻红,而不是等到联调或生产才炸。
|
|
15
|
+
|
|
16
|
+
## 1. 契约测试解决什么
|
|
17
|
+
|
|
18
|
+
- **集成断裂在合并前暴露**:消费方(前端/下游服务)对提供方(API/上游服务)的期望被固化成可执行契约;提供方改坏了,提供方的 CI 就失败。
|
|
19
|
+
- **不必拉起整套环境**:契约测试用契约 + 桩,比端到端联调快得多、稳得多,可在每次 PR 跑。
|
|
20
|
+
- **明确的责任边界**:契约是双方共同签署的事实来源;谁破坏谁负责。
|
|
21
|
+
|
|
22
|
+
契约测试**不替代**集成/E2E,它补在金字塔的"集成层",专门保接口对齐(见 `testing/01-standards/test-strategy-and-layering`)。
|
|
23
|
+
|
|
24
|
+
## 2. 两种契约校验
|
|
25
|
+
|
|
26
|
+
### A. 模式契约(Schema Contract)
|
|
27
|
+
以接口定义文件(OpenAPI / GraphQL SDL / protobuf)为单一事实来源,校验**真实流量**符合模式:
|
|
28
|
+
- **提供方**:集成测试里,断言每个端点的真实响应满足声明的模式(字段、类型、必填、状态码)。响应多/少/错字段即失败。
|
|
29
|
+
- **消费方**:从前端代码里抽取所有 `fetch`/HTTP 调用,断言每个被调用的"路径+方法+请求/响应形状"都存在于契约中——杜绝"调了一个契约里不存在的端点"或"端点在活跃消费方下被悄悄改形状"。
|
|
30
|
+
- **破坏性 diff**:把新契约与上一发布版对比,删字段/改类型/收紧校验/改状态码语义=破坏性变更,未升版本则阻断合并。
|
|
31
|
+
|
|
32
|
+
### B. 消费者驱动契约(Consumer-Driven Contract)
|
|
33
|
+
当多个消费方依赖同一提供方时,让**消费方**声明"我实际用到的请求/响应子集",汇总成提供方必须满足的契约:
|
|
34
|
+
```
|
|
35
|
+
1. 每个消费方写出它对提供方的期望(请求样例 → 期望响应样例)。
|
|
36
|
+
2. 这些期望被收集(共享契约仓/broker),形成提供方的契约集合。
|
|
37
|
+
3. 提供方在 CI 回放所有消费方期望:任一不满足即失败。
|
|
38
|
+
4. 部署前用"能否部署(can-i-deploy)"判定:该版本是否兼容当前所有线上消费方。
|
|
39
|
+
```
|
|
40
|
+
价值:提供方只需保证"被真正用到的部分"稳定,敢于删改无人使用的字段;消费方不会被上游静默破坏。
|
|
41
|
+
|
|
42
|
+
## 3. 工作流
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
契约先行(见 experts/architect/contract-first-api-design)
|
|
46
|
+
│
|
|
47
|
+
├─ 提供方:实现 → 契约校验测试(真实响应 vs 模式)→ 回放消费方期望
|
|
48
|
+
│
|
|
49
|
+
└─ 消费方:对着契约/Mock 开发 → 用契约桩做集成测试(不打真实提供方)
|
|
50
|
+
│
|
|
51
|
+
CI 门禁:契约 lint + 双向校验 + 破坏性 diff + can-i-deploy
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- 消费方测试用**契约生成的 Mock/桩**代替真实提供方,既快又能在提供方未就绪时并行开发。
|
|
55
|
+
- 提供方测试用**真实实现**回放契约,确保不是"对着自己的假设测自己"。
|
|
56
|
+
|
|
57
|
+
## 4. 契约必须锁住的内容
|
|
58
|
+
|
|
59
|
+
| 维度 | 校验点 |
|
|
60
|
+
|---|---|
|
|
61
|
+
| 路径 / 方法 | 每个被消费的端点都存在 |
|
|
62
|
+
| 请求 | 必填/可选字段、类型、格式、枚举、范围 |
|
|
63
|
+
| 响应(按状态码)| 成功与各错误码的 body 形状 + 示例 |
|
|
64
|
+
| 状态码集合 | 200/201/204/400/401/403/404/409/422/429/5xx 按操作声明 |
|
|
65
|
+
| 错误信封 | 全局统一的错误结构(code/message/details) |
|
|
66
|
+
| 鉴权 | 哪些端点需鉴权、需要的 scope/role |
|
|
67
|
+
| 分页 / 幂等 | 集合的分页契约、不安全操作的幂等键 |
|
|
68
|
+
| 版本 | 破坏性变更的信号与版本策略 |
|
|
69
|
+
|
|
70
|
+
## 5. 兼容性规则
|
|
71
|
+
|
|
72
|
+
- **加字段、加端点、放宽校验 = 兼容**(消费方须容忍未知字段——收到多余字段不报错)。
|
|
73
|
+
- **删/改字段、改类型、收紧校验、改状态码语义 = 破坏**:必须升主版本 + 走弃用流程(标记弃用 → 公告 → sunset 日期 → 旧版本流量耗尽后再删)。
|
|
74
|
+
- 把"契约破坏性 diff"做成 CI 检查:未升版本的破坏性变更直接 fail。
|
|
75
|
+
|
|
76
|
+
## 6. CI 门禁(契约相关)
|
|
77
|
+
|
|
78
|
+
每次 PR 应执行:
|
|
79
|
+
- [ ] **契约 lint**:模式合法、命名一致、每个操作带示例。
|
|
80
|
+
- [ ] **提供方响应校验**:集成测试断言真实响应符合契约。
|
|
81
|
+
- [ ] **消费方调用校验**:前端/下游调用的路径与形状都在契约内。
|
|
82
|
+
- [ ] **消费者期望回放**:提供方满足所有已注册消费方契约。
|
|
83
|
+
- [ ] **破坏性 diff**:对比上一发布契约,破坏未升版即阻断。
|
|
84
|
+
- [ ] **can-i-deploy**:发布前确认该版本兼容当前线上各消费方。
|
|
85
|
+
|
|
86
|
+
## 7. 反模式(出现即不合格)
|
|
87
|
+
|
|
88
|
+
1. **只有单测、无契约校验**:前后端各自绿,集成处断裂。
|
|
89
|
+
2. **契约是写完代码后补的文档**:从未被任何 CI 检查,与代码漂移。
|
|
90
|
+
3. **消费方对着真实提供方做集成**:慢、脆、提供方未就绪就卡住;该用契约桩。
|
|
91
|
+
4. **提供方对着自己的假设测自己**:没回放真实消费方期望。
|
|
92
|
+
5. **静默破坏性变更**:改字段不升版本,线上消费方被打挂。
|
|
93
|
+
6. **不容忍未知字段**:提供方加个可选字段,消费方就崩——脆契约。
|
|
94
|
+
|
|
95
|
+
## 8. 最低交付 checklist
|
|
96
|
+
|
|
97
|
+
- [ ] 接口有机器可读契约(OpenAPI/SDL/proto)作为单一事实来源。
|
|
98
|
+
- [ ] 提供方有"真实响应 vs 契约"的自动化校验测试。
|
|
99
|
+
- [ ] 消费方有"调用 vs 契约"的自动化校验,且用契约桩做集成。
|
|
100
|
+
- [ ] 多消费方场景启用消费者驱动契约 + can-i-deploy。
|
|
101
|
+
- [ ] 破坏性变更检测进 CI,未升版本即阻断合并。
|
|
102
|
+
- [ ] 弃用走"标记→公告→sunset→下线"流程,不静默删改。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: test-data-and-ephemeral-environments
|
|
3
|
+
title: 测试数据管理与临时环境规范(商业级必读)
|
|
4
|
+
domain: testing
|
|
5
|
+
category: 01-standards
|
|
6
|
+
difficulty: intermediate
|
|
7
|
+
tags: [test-data, fixtures, factories, seeding, ephemeral-environment, preview-environment, anonymization, isolation, 测试数据, 临时环境, 预览环境, 商业级]
|
|
8
|
+
quality_score: 95
|
|
9
|
+
last_updated: 2026-06-29
|
|
10
|
+
---
|
|
11
|
+
# 测试数据管理与临时环境规范(商业级必读)
|
|
12
|
+
|
|
13
|
+
> 测试不可信,往往不是因为代码错,而是因为**数据脏、环境脏**:上一条用例残留的数据污染下一条、用生产真实个人数据跑测试、几十个分支抢同一个共享 staging。
|
|
14
|
+
> 商业级团队把"测试数据如何造、如何隔离、用完如何清"和"每个改动跑在自己的一次性环境里"当成工程能力来建,而不是靠人手摆数据。
|
|
15
|
+
|
|
16
|
+
## 1. 核心原则
|
|
17
|
+
|
|
18
|
+
- **确定性**:同一套用例每次跑的数据状态一致,结果可复现;不依赖"今天库里恰好有什么"。
|
|
19
|
+
- **隔离**:每个用例/每条流水线/每个分支拥有自己的数据与环境,互不串味,可并行。
|
|
20
|
+
- **自给自足**:用例自己准备所需数据(前置),不假设环境里已经存在某条记录。
|
|
21
|
+
- **用完即清**:数据和环境都有明确的销毁路径,绝不无限堆积、绝不长期占用。
|
|
22
|
+
- **绝不用真实个人数据**:测试库里不放生产 PII,用脱敏或合成数据(见 `compliance/01-standards/privacy-and-compliance-readiness`)。
|
|
23
|
+
|
|
24
|
+
## 2. 测试数据的四种来源
|
|
25
|
+
|
|
26
|
+
| 方式 | 做法 | 适用 | 注意 |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| 工厂/构建器(factory)| 用代码按需生成对象,字段给合理默认、按用例覆盖关键字段 | 单元/集成测试首选 | 默认值要合法,只显式写"与本用例相关"的字段 |
|
|
29
|
+
| 固定夹具(fixture)| 预定义一组静态数据集,测试前加载 | 参照数据、枚举、种子账号 | 易腐化,变更要同步;别塞进巨型共享夹具 |
|
|
30
|
+
| 合成数据(synthetic)| 按规则/分布批量生成仿真数据 | 性能/容量/边界测试 | 要覆盖边界与异常分布,不只是"理想数据" |
|
|
31
|
+
| 脱敏生产数据 | 取生产快照后**不可逆脱敏/掩码**再用 | 需要真实形态/规模时 | 脱敏必须在数据离开生产边界前完成;保留引用完整性 |
|
|
32
|
+
|
|
33
|
+
要点:优先工厂法(表达力强、随用例演进);固定夹具只放稳定的参照数据;**绝不**直接拷生产库进测试环境。
|
|
34
|
+
|
|
35
|
+
## 3. 数据脱敏与合成
|
|
36
|
+
|
|
37
|
+
- **脱敏规则**:姓名/邮箱/手机/证件/卡号等可识别字段一律替换、掩码或令牌化;保留格式有效性(邮箱仍是邮箱)和**引用完整性**(外键仍能对上)。
|
|
38
|
+
- **不可逆**:脱敏后不能反推回真人——别用可逆加密冒充脱敏。
|
|
39
|
+
- **一致性**:同一真实值在多表脱敏成同一假值,避免 join 断裂。
|
|
40
|
+
- **合成优先**:能用规则造的就别取生产;合成数据零隐私风险、可覆盖边界,是长期方向。
|
|
41
|
+
|
|
42
|
+
## 4. 测试数据生命周期(每条用例必须闭环)
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
准备(setup) → 执行(act) → 断言(assert) → 清理(teardown)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- **准备**:用例自己创建所需数据,带唯一标识(如随机后缀)避免与并发用例撞键。
|
|
49
|
+
- **清理**:优先用**事务回滚**(用例跑在事务里,结束回滚,最快最干净);不能回滚时用显式删除或在隔离的库/schema 里跑。
|
|
50
|
+
- **不依赖执行顺序**:用例之间无隐式依赖,任意打乱/单独跑都通过。
|
|
51
|
+
- **不留垃圾**:失败的用例也要能清理(teardown 放在 finally/fixture 析构里)。
|
|
52
|
+
|
|
53
|
+
## 5. 隔离级别(从强到弱)
|
|
54
|
+
|
|
55
|
+
| 级别 | 隔离手段 | 并行度 | 成本 |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| 进程内 | 内存库/事务回滚 | 高 | 低 |
|
|
58
|
+
| schema/库级 | 每个 worker 一套 schema 或独立库 | 高 | 中 |
|
|
59
|
+
| 容器级 | 每条流水线起一套临时容器栈 | 中 | 中 |
|
|
60
|
+
| 环境级 | 每个分支/PR 一套临时环境 | 中 | 高 |
|
|
61
|
+
|
|
62
|
+
原则:能用更轻的隔离就别上更重的;CI 里并行跑的测试**必须**至少做到 schema/库级隔离,否则互相污染、随机翻红。
|
|
63
|
+
|
|
64
|
+
## 6. 临时/预览环境(ephemeral / preview)
|
|
65
|
+
|
|
66
|
+
- **定义**:为一次改动(一个 PR/一个分支)**自动拉起、用完自动销毁**的完整运行环境,让评审者和 QA 能在合并前看到真实运行效果。
|
|
67
|
+
- **声明式 + 自动化**:环境由代码/配置定义(基础设施即代码),从零一键重建;**绝不**手工攒环境。
|
|
68
|
+
- **自动生命周期**:PR 打开 → 自动部署预览环境 → 评论里回链接;PR 合并/关闭 → 自动销毁,绝不遗留。
|
|
69
|
+
- **种子数据**:预览环境用脱敏/合成种子数据自动初始化,达到可演示状态,不连生产数据。
|
|
70
|
+
- **隔离与成本**:每个预览环境互相隔离;设**TTL 自动回收**和资源上限,防止环境无限堆积烧钱。
|
|
71
|
+
- **与渐进式发布衔接**:预览环境用于"合并前看效果",与上线后的金丝雀放量是两件事(见 `release-engineering/01-standards/progressive-delivery-and-release`)。
|
|
72
|
+
|
|
73
|
+
## 7. 环境分层与数据策略
|
|
74
|
+
|
|
75
|
+
| 环境 | 数据 | 持久性 |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| 本地/单测 | 工厂生成 + 事务回滚 | 即用即弃 |
|
|
78
|
+
| CI 集成测试 | 容器内临时库 + 种子 | 流水线结束即销毁 |
|
|
79
|
+
| 预览(每 PR)| 脱敏/合成种子 | PR 关闭即销毁 |
|
|
80
|
+
| staging | 接近生产的脱敏数据 | 长期,但定期刷新与清理 |
|
|
81
|
+
| 生产 | 真实数据 | 受合规与保留策略约束 |
|
|
82
|
+
|
|
83
|
+
staging 不是垃圾场:定期刷新脱敏数据、清理过期记录,让它真正"接近生产"。
|
|
84
|
+
|
|
85
|
+
## 8. 反模式(出现即不合格)
|
|
86
|
+
|
|
87
|
+
1. **测试间共享可变数据**:用例 A 造的数据被用例 B 读,顺序一变就翻红。
|
|
88
|
+
2. **生产数据直灌测试**:把真实 PII 拷进测试/预览环境,隐私事故。
|
|
89
|
+
3. **不清理**:用例只建不删,库越跑越脏,最后只能"重建环境"。
|
|
90
|
+
4. **巨型共享夹具**:一个庞大夹具喂所有用例,改一处崩一片,没人敢动。
|
|
91
|
+
5. **手工长寿 staging**:靠人手摆的"祖传环境",没人能从零重建。
|
|
92
|
+
6. **抢占共享环境**:几十个分支共用一个 staging,互相覆盖、排队等待。
|
|
93
|
+
7. **预览环境不回收**:临时环境只建不销,资源无限堆积。
|
|
94
|
+
8. **依赖隐式现存数据**:用例假设"库里本来就有 id=1 的用户"。
|
|
95
|
+
|
|
96
|
+
## 9. 最低交付 checklist
|
|
97
|
+
|
|
98
|
+
- [ ] 测试数据用工厂/构建器按需生成,带唯一标识,不撞键。
|
|
99
|
+
- [ ] 每条用例自给自足、不依赖执行顺序、用完即清(优先事务回滚)。
|
|
100
|
+
- [ ] CI 并行测试至少做到 schema/库级隔离,互不污染。
|
|
101
|
+
- [ ] 测试/预览环境绝不使用生产真实个人数据,统一脱敏或合成。
|
|
102
|
+
- [ ] 脱敏不可逆、保持格式有效与引用完整、跨表一致。
|
|
103
|
+
- [ ] 预览环境由 IaC 定义,PR 打开自动拉起、关闭自动销毁,带 TTL 回收。
|
|
104
|
+
- [ ] 预览环境自动种子数据到可演示状态。
|
|
105
|
+
- [ ] staging 数据定期刷新与清理,保持接近生产。
|