什么是 Harness —— 从测试框架到 AI Agent 基础设施

harness cover

# 前言

"Harness" 这个词在软件工程领域出现的频率越来越高。从传统的 Test Harness 到现代的 Agent Harness、Harness Engineering,这个概念在不断演进。特别是在 AI Agent 快速发展的今天,理解 Harness 的本质变得尤为重要。

# 什么是 Harness?

Harness 的字面意思是「马具」或「驾驭」,它象征着对强大力量的控制和引导。在软件工程中,Harness 指的是围绕一个核心系统,构建的输入控制、输出约束、行为测试、反馈循环的工程框架。

# 核心定义

Harness 是一种系统级基础设施,本质是集计划、执行与学习于一体的工程化闭环体系,用于为被测对象提供可控、可观测且可重复的测试环境。

# Harness 的三种形态

# 1. Test Harness(测试驾驭)

最经典的形态。把被测系统放入「测试套」中,提供受控输入,捕获并验证输出。

import unittest

class TestHarness(unittest.TestCase):
    def setUp(self):
        # 准备测试环境
        self.mock_db = MockDatabase()
        self.harness = TestHarness(self.mock_db)

    def test_user_login(self):
        # 驱动执行
        result = self.harness.execute(
            action='login',
            payload={'username': 'test', 'password': '123'}
        )
        # 断言验证
        self.assertEqual(result.status, 'success')
        self.assertIsNotNone(result.token)

# 2. Prompt Harness(提示词驾驭)

专为 LLM 设计,通过系统提示、Few-shot 示例、格式约束将模型输出「驾驭」在可控范围内。

const promptHarness = {
  systemPrompt: `你是一个专业的技术写作助手。
    - 只回答技术相关问题
    - 使用 Markdown 格式
    - 不知道就说不知道`,

  constraints: {
    maxLength: 500,
    format: 'markdown',
    allowedTopics: ['programming', 'ai', 'engineering']
  },

  fewShots: [
    { input: '什么是闭包?', output: '闭包是...' },
    { input: '解释一下 Promise', output: 'Promise 是...' }
  ]
}

# 3. Agent Harness(智能体驾驭)

在 AI Agent 框架中,通过工具定义、Planning 约束、Memory 管理来控制 Agent 的行为路径。

# Harness 的三层闭环

# Harness 的核心能力

能力 描述 示例
环境封装 隔离依赖,提供可控环境 Mock 数据库、模拟 API
输入驱动 按照测试用例发送输入 自动化执行测试步骤
输出验证 断言验证,检查结果 单元测试断言
可观测性 追踪执行过程和状态 日志、监控、追踪

# 实际应用示例

# 用 Harness 测试一个支付模块

class PaymentHarness:
    def __init__(self):
        self.mock_payment_gateway = MockPaymentGateway()
        self.mock_database = MockDatabase()
        self.results = []

    def execute_payment(self, order_id: str, amount: float):
        """驱动支付执行"""
        # 1. 准备环境
        order = self.mock_database.get_order(order_id)

        # 2. 模拟外部依赖
        self.mock_payment_gateway.set_response(
            success=True,
            transaction_id='TXN_12345'
        )

        # 3. 执行被测系统
        result = process_payment(
            order=order,
            gateway=self.mock_payment_gateway
        )

        # 4. 收集结果
        self.results.append(result)
        return result

    def verify(self):
        """验证执行结果"""
        for r in self.results:
            assert r.status == 'completed'
            assert r.transaction_id is not None

# AI Agent 中的上下文 Harness

class AgentContextHarness {
    constructor() {
        this.contextStack = []
        this.maxDepth = 5
    }

    loadContext(skill, relevantDocs) {
        if (this.contextStack.length >= this.maxDepth) {
            // 触发上下文溢出保护
            this.evictOldest()
        }
        this.contextStack.push({
            skill,
            docs: relevantDocs,
            timestamp: Date.now()
        })
    }

    getCurrentContext() {
        return this.contextStack[this.contextStack.length - 1]
    }
}

# 为什么需要 Harness?

# 传统软件测试场景

在没有 Harness 的时代,测试面临诸多挑战:

  • 依赖真实外部服务,成本高且不稳定
  • 测试环境难以复现
  • 结果验证困难,缺乏标准化框架

# AI Agent 时代的新挑战

Harness 解决了这些问题:

  1. 状态管理 — 通过 Context Harness 保持多轮对话状态
  2. 工具调用 — 通过 Tool Harness 标准化工具接口
  3. 行为可控 — 通过 Prompt Harness 约束输出格式
  4. 持续验证 — 通过 Evaluation Harness 确保质量不退化

# 总结

Harness 不仅仅是一个测试工具,它是现代软件工程的基础设施。从传统单元测试到 AI Agent 时代的人机协作,Harness 的概念在不断演进和扩展。

理解 Harness 的本质 —— 构建可控、可观测、可重复的工程化闭环 —— 将帮助我们更好地构建可靠的软件系统。


如果你对 Harness 有更多疑问或实践心得,欢迎留言讨论。