一、引言:质量是 Harness 的生命线
在 Harness Engineering 中,AI Agent 是主要的代码生产者。这意味着:
传统的 Code Review 模式不再适用,我们需要一种自动化的、可规模化的质量保障机制。
这就是闭环测试系统的核心价值——它能够在没有人类实时参与的情况下,持续验证 Agent 的输出质量,并驱动 Agent 自我改进。
本文将深入探讨 Harness Engineering 中的闭环测试系统设计。
二、为什么需要闭环测试?
2.1 传统质量保障的局限
传统方式
局限
Harness 中的问题
人工 Code Review
耗时、不可规模化
Agent 产出速度远超人类审查能力
阶段性测试
反馈延迟
Agent 需要即时反馈来迭代改进
静态规则检查
无法验证功能正确性
需要动态验证机制
人工回归测试
覆盖有限
需要自动化、全面的测试覆盖
2.2 闭环测试的核心价值
┌─────────────────────────────────────────────────────────┐
│ 闭环测试的核心价值 │
├─────────────────────────────────────────────────────────┤
│ │
│ 即时反馈 │
│ ├── Agent 生成代码后立即验证 │
│ ├── 错误快速定位,快速修复 │
│ └── 减少无效迭代,提升效率 │
│ │
│ 自动化规模化 │
│ ├── 无需人类实时参与 │
│ ├── 可同时验证多个 Agent 的产出 │
│ └── 支持 24/7 持续运行 │
│ │
│ 持续改进 │
│ ├── 测试结果反馈给 Agent │
│ ├── Agent 学习并优化输出 │
│ └── 形成正向循环,质量持续提升 │
│ │
│ 可追溯可审计 │
│ ├── 完整的测试历史记录 │
│ ├── 质量问题可追溯到具体版本 │
│ └── 支持数据驱动的质量分析 │
│ │
└─────────────────────────────────────────────────────────┘
三、闭环测试系统的架构
3.1 系统整体架构
┌─────────────────────────────────────────────────────────┐
│ 闭环测试系统架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 触发层(Trigger) │ │
│ │ • Agent 代码提交 │ │
│ │ • 定时任务触发 │ │
│ │ • 手动触发 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 测试执行层(Execution) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ 静态测试 │ │ 单元测试 │ │ 集成测试 │ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ │ └─────────────┴─────────────┘ │ │
│ │ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ 端到端 │ │ 性能测试 │ │ 安全测试 │ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ │ └─────────────┴─────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 结果分析层(Analysis) │ │
│ │ • 测试结果聚合 │ │
│ │ • 错误分类和定位 │ │
│ │ • 质量评分计算 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 反馈层(Feedback) │ │
│ │ • 结构化反馈生成 │ │
│ │ • 修复建议提供 │ │
│ │ • 反馈给 Agent │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 决策层(Decision) │ │
│ │ • 通过 → 合并代码 │ │
│ │ • 失败 → Agent 修复(循环) │ │
│ │ • 异常 → 人工介入 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
3.2 闭环流程详解
┌─────────────────────────────────────────────────────────┐
│ 闭环测试流程 │
├─────────────────────────────────────────────────────────┤
│ │
│ Step 1: Agent 生成代码 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Agent 根据任务需求生成代码实现 │ │
│ │ 提交到临时分支或 PR │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ Step 2: 触发测试流水线 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 代码变更触发自动化测试流水线 │ │
│ │ 流水线按阶段顺序执行 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ Step 3: 分层测试执行 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 阶段1: 静态测试(秒级) │ │
│ │ - 语法检查、代码风格、静态分析 │ │
│ │ - 失败则立即反馈,跳过后续阶段 │ │
│ │ │ │
│ │ 阶段2: 单元测试(分钟级) │ │
│ │ - 函数/模块级别的功能验证 │ │
│ │ - 计算覆盖率,验证边界条件 │ │
│ │ │ │
│ │ 阶段3: 集成测试(分钟级) │ │
│ │ - 模块间交互验证 │ │
│ │ - 数据库、外部服务 Mock │ │
│ │ │ │
│ │ 阶段4: 端到端测试(小时级) │ │
│ │ - 完整业务流程验证 │ │
│ │ - 真实环境或高保真仿真 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ Step 4: 结果分析与反馈 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 聚合所有测试结果,生成结构化反馈 │ │
│ │ 包括:错误位置、错误类型、修复建议、参考示例 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ Step 5: 决策与迭代 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 所有测试通过? │ │
│ │ ├── 是 → 代码合并,任务完成 │ │
│ │ └── 否 → 反馈给 Agent │ │
│ │ ↓ │ │
│ │ Agent 分析反馈 │ │
│ │ ↓ │ │
│ │ Agent 生成修复代码 │ │
│ │ ↓ │ │
│ │ 重新触发测试(循环) │ │
│ │ ↓ │ │
│ │ 超过最大迭代次数? │ │
│ │ ├── 是 → 人工介入 │ │
│ │ └── 否 → 继续循环 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
四、分层测试策略
4.1 测试金字塔在 Harness 中的应用
┌─────────────────────────────────────────────────────────┐
│ 测试金字塔(Harness 版) │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ E2E测试 │ ← 少量,核心流程验证 │
│ │ (5%) │ │
│ ┌┴─────────┴┐ │
│ │ 集成测试 │ ← 中等,模块交互验证 │
│ │ (15%) │ │
│ ┌┴───────────┴┐ │
│ │ 单元测试 │ ← 大量,功能细节验证 │
│ │ (50%) │ │
│ ┌┴─────────────┴┐ │
│ │ 静态测试 │ ← 全覆盖,快速反馈 │
│ │ (30%) │ │
│ └───────────────┘ │
│ │
│ 原则: │
│ • 底层测试快速、廉价、覆盖面广 │
│ • 上层测试慢速、昂贵、验证关键路径 │
│ • 失败早发现,快速反馈 │
│ │
└─────────────────────────────────────────────────────────┘
4.2 各层测试详解
第一层:静态测试(秒级)
yaml
复制
# 静态测试配置
static_tests:
# 语法检查
syntax:
- tool: eslint
config: .eslintrc.js
auto_fix: true
- tool: typescript
command: tsc --noEmit
# 代码格式
formatting:
- tool: prettier
check: true
auto_fix: true
# 代码复杂度
complexity:
- tool: sonarjs
max_cyclomatic_complexity: 10
max_cognitive_complexity: 15
# 安全扫描
security:
- tool: snyk
severity_threshold: high
- tool: semgrep
rules: security-audit
执行时间:< 30 秒
失败策略:立即反馈,阻止后续测试
第二层:单元测试(分钟级)
yaml
复制
# 单元测试配置
unit_tests:
framework: jest
# 测试发现
test_match:
- "**/*.test.ts"
- "**/*.spec.ts"
# 覆盖率要求
coverage:
global:
statements: 80
branches: 75
functions: 80
lines: 80
per_file:
statements: 70
branches: 60
# 测试环境
environment: jsdom # 或 node
# 并行执行
max_workers: 4
# 超时设置
test_timeout: 5000 # 5秒
# 快照测试
snapshot:
update: false # 不允许自动更新
执行时间:1-5 分钟
失败策略:生成详细的失败报告,包括失败用例、堆栈跟踪、预期 vs 实际
第三层:集成测试(分钟级)
yaml
复制
# 集成测试配置
integration_tests:
framework: jest
# 测试数据库
database:
type: postgresql
version: "14"
migrations: true
seed_data: tests/fixtures
# 外部服务 Mock
mocks:
- service: payment_api
tool: wiremock
- service: notification_service
tool: nock
# 测试范围
test_match:
- "tests/integration/**/*.test.ts"
# 并发控制
max_concurrent: 2 # 避免资源冲突
# 清理策略
cleanup: after_each # 每个测试后清理数据
执行时间:5-15 分钟
失败策略:定位到具体集成点,提供接口契约对比
第四层:端到端测试(小时级)
yaml
复制
# E2E 测试配置
e2e_tests:
framework: cypress
# 浏览器配置
browser: chrome
headless: true
# 测试环境
base_url: http://localhost:3000
# 测试数据
test_data:
source: fixtures
cleanup: true
# 关键流程
critical_paths:
- user_registration
- checkout_flow
- payment_process
# 视觉回归
visual_testing:
enabled: true
threshold: 0.1 # 1% 像素差异容忍
# 性能阈值
performance:
max_page_load: 3000 # 3秒
max_api_response: 500 # 500ms
执行时间:15-60 分钟
失败策略:录制失败场景视频,提供详细的复现步骤
五、反馈设计与 Agent 协作
5.1 反馈的结构化设计
好的反馈是闭环测试的关键。反馈必须:
- 结构化:机器可读,便于 Agent 解析
- 可行动:提供具体的修复建议
- 上下文丰富:包含足够的定位信息
json
复制
{
"test_run_id": "tr_20260323_001",
"timestamp": "2026-03-23T10:30:00Z",
"agent_id": "codex_agent_01",
"task_id": "feat_login_001",
"summary": {
"total_tests": 150,
"passed": 142,
"failed": 6,
"skipped": 2,
"duration_ms": 125000
},
"results_by_stage": {
"static": {
"status": "passed",
"duration_ms": 15000
},
"unit": {
"status": "failed",
"duration_ms": 45000,
"failures": [
{
"test_file": "src/auth/login.test.ts",
"test_name": "should validate password strength",
"line": 45,
"error": "AssertionError: expected weak password to be rejected",
"expected": "ValidationError: Password too weak",
"actual": "null",
"stack_trace": "...",
"suggestion": "Check the password validation logic in src/auth/validator.ts:23. The regex pattern may be incorrect.",
"related_code": {
"file": "src/auth/validator.ts",
"lines": "20-30"
}
}
]
},
"integration": {
"status": "skipped",
"reason": "previous_stage_failed"
}
},
"quality_metrics": {
"code_coverage": 78.5,
"complexity_score": 85,
"security_score": 92
},
"recommended_actions": [
{
"priority": "high",
"action": "fix_unit_test",
"file": "src/auth/validator.ts",
"description": "Fix password validation regex pattern"
},
{
"priority": "medium",
"action": "improve_coverage",
"description": "Add tests for edge cases in password validation"
}
]
}
5.2 Agent 的修复流程
┌─────────────────────────────────────────────────────────┐
│ Agent 接收反馈并修复的流程 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. 解析反馈 │
│ ├── 提取失败信息(文件、行号、错误类型) │
│ ├── 理解预期行为和实际行为差异 │
│ └── 识别修复优先级 │
│ │
│ 2. 定位问题 │
│ ├── 读取相关代码文件 │
│ ├── 分析代码逻辑和依赖关系 │
│ └── 确定根本原因 │
│ │
│ 3. 生成修复方案 │
│ ├── 基于错误类型选择修复策略 │
│ ├── 参考项目中的类似实现 │
│ └── 生成修复代码 │
│ │
│ 4. 验证修复 │
│ ├── 本地快速验证(如可能) │
│ ├── 提交修复代码 │
│ └── 触发新的测试循环 │
│ │
│ 5. 学习优化 │
│ ├── 记录错误模式 │
│ ├── 更新内部知识库 │
│ └── 避免类似错误再次发生 │
│ │
└─────────────────────────────────────────────────────────┘
六、质量门禁与决策机制
6.1 多级质量门禁
┌─────────────────────────────────────────────────────────┐
│ 多级质量门禁 │
├─────────────────────────────────────────────────────────┤
│ │
│ 门禁 L1:基础质量(必须全部通过) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ • 语法正确性 │ │
│ │ • 代码格式规范 │ │
│ │ • 无高危安全漏洞 │ │
│ │ • 单元测试通过率 > 90% │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ 通过 │
│ 门禁 L2:功能质量(必须全部通过) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ • 单元测试覆盖率 > 80% │ │
│ │ • 集成测试全部通过 │ │
│ │ • 无严重 Bug │ │
│ │ • 代码复杂度达标 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ 通过 │
│ 门禁 L3:系统质量(关键项目要求) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ • 端到端测试通过 │ │
│ │ • 性能指标达标 │ │
│ │ • 安全扫描通过 │ │
│ │ • 可观测性达标(日志、监控) │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ 通过 │
│ 允许合并部署 │
│ │
└─────────────────────────────────────────────────────────┘
6.2 智能决策机制
yaml
复制
# 决策配置
decision_rules:
# 自动通过条件
auto_approve:
conditions:
- all_tests_passed: true
- coverage_above: 85
- no_security_issues: true
- complexity_score_above: 80
action: merge_automatically
# 需要人工审核
manual_review:
conditions:
- coverage_between: [70, 85]
- or:
- security_issues: low
- breaking_changes: true
action: require_human_approval
# 自动拒绝
auto_reject:
conditions:
- security_issues: [high, critical]
- or:
- coverage_below: 70
- tests_failing: true
action: reject_and_request_fix
# 异常处理
exception_handling:
max_iterations: 5 # Agent 最大修复次数
timeout: 2h # 单次任务最大时间
escalation:
- condition: iterations_exceeded
action: escalate_to_human
- condition: timeout_exceeded
action: escalate_to_human
- condition: repeated_failures
action: escalate_to_human
七、度量与持续改进
7.1 关键质量指标
指标类别
指标名称
说明
目标值
效率
平均修复迭代次数
Agent 修复到通过的平均次数
< 2
效率
平均测试执行时间
完整测试流水线执行时间
< 30分钟
质量
测试通过率
所有测试的通过比例
> 95%
质量
代码覆盖率
测试覆盖的代码比例
> 80%
质量
生产缺陷率
部署后发现的缺陷数
< 1/周
稳定性
误报率
测试失败但实际无问题的比例
< 5%
稳定性
测试 flaky 率
不稳定、时好时坏的测试比例
< 2%
7.2 持续改进机制
┌─────────────────────────────────────────────────────────┐
│ 持续改进机制 │
├─────────────────────────────────────────────────────────┤
│ │
│ 数据收集 │
│ ├── 每次测试运行的详细数据 │
│ ├── Agent 修复的历史记录 │
│ └── 生产环境的缺陷报告 │
│ ↓ │
│ 模式分析 │
│ ├── 识别高频失败模式 │
│ ├── 分析 Agent 修复效率 │
│ └── 发现测试覆盖盲区 │
│ ↓ │
│ 优化行动 │
│ ├── 更新约束规则(防止常见错误) │
│ ├── 增强测试用例(覆盖盲区) │
│ ├── 优化反馈质量(更清晰的错误信息) │
│ └── 调整质量门禁(平衡效率和质量) │
│ ↓ │
│ 效果验证 │
│ ├── A/B 测试新规则 │
│ ├── 监控指标变化 │
│ └── 验证改进效果 │
│ ↓ │
│ 知识沉淀 │
│ ├── 更新 Harness 配置 │
│ ├── 完善最佳实践文档 │
│ └── 分享经验教训 │
│ │
└─────────────────────────────────────────────────────────┘
八、实践案例:OpenAI 的闭环测试
8.1 背景
OpenAI Harness 团队的实验:
- 5个月,0行人工代码
- 百万行代码系统
- 80% 任务通过率
8.2 关键实践
实践
说明
效果
分层快速反馈
静态测试(秒)→ 单元测试(分)→ 集成测试(十分)
快速失败,减少无效迭代
自动化修复循环
Agent 接收反馈 → 自动修复 → 重新测试
减少人工干预
严格质量门禁
多层门禁,逐步放行
确保代码质量
全面监控度量
详细的指标收集和分析
数据驱动优化
九、结语:质量是设计出来的
在 Harness Engineering 中,代码质量不是事后检查出来的,而是通过精心设计的闭环测试系统保证的。
一个好的闭环测试系统能够:
- 在秒级发现基础问题
- 在分钟级验证功能正确性
- 在小时级验证系统完整性
- 持续驱动 Agent 自我改进
这是 Harness Engineering 的核心竞争力,也是 AI 时代软件质量保障的新范式。
参考与延伸阅读
- Harness engineering: leveraging Codex in an agent-first world - OpenAI
- Continuous Delivery - Jez Humble
- Test-Driven Development - Kent Beck