"世界上有一种痛苦叫 Agent 测试。你给它一个输入,它给你一千种可能。传统的断言?不存在的。你只能祈祷它不要今天心情好就正常工作,明天心情差就给你搞崩溃。测试一个 Agent,就像测试一只猫——它想配合的时候无可挑剔,不想配合的时候你拿它一点办法没有。"
📖 什么是 Agent Testing
Agent Testing(智能体测试)是验证 AI Agent 行为是否符合预期的系统性方法。与传统软件测试不同,Agent 具有非确定性的特点——同一个输入可能产生不同的输出,这使得传统的"输入→断言"测试模式不再够用。
核心挑战:Agent 不是函数——f(x) 不一定等于 y。它更像是一个"概率性的决策者",你需要在不确定中找到确定性的信心。
Agent vs 传统软件测试
| 维度 | 传统软件 | AI Agent |
|---|---|---|
| 确定性 | ✅ 同输入同输出 | ❌ 每次可能不同 |
| 测试方法 | 断言 assert | 评估 evaluate |
| 边界清晰 | ✅ 明确 | ❌ 模糊 |
| 回归测试 | ✅ 稳定 | ⚠️ 需要容忍波动 |
🏗️ Agent 测试金字塔
🔴 E2E Agent 测试(少量,最贵)
🟠 集成测试(中等数量)
🟡 AI Evals(核心)
🟢 工具/函数单元测试(大量,最便宜)
第 1 层:工具单元测试
Agent 使用的工具函数,测试方式和传统代码完全一样:
# 测试工具函数 - 传统断言,确定性高
def test_search_tool():
result = search_articles(query="AI工具", limit=5)
assert len(result) <= 5
assert all("AI" in article.title for article in result)
assert all(article.score > 0 for article in result)
# 测试数据处理函数
def test_format_sitemap():
urls = ["https://miaoquai.com/tools/chatgpt.html"]
xml = format_sitemap(urls)
assert "<urlset" in xml
assert "https://miaoquai.com" in xml
第 2 层:AI Evals(评估测试)
这是 Agent 测试的核心——用 LLM 来评估 LLM 的输出:
# OpenClaw Agent Eval 框架
class AgentEval:
def __init__(self, judge_model="claude-3-5-sonnet"):
self.judge = judge_model
def evaluate(self, test_case):
# 运行 Agent
response = self.agent.run(test_case.input)
# 用另一个 LLM 来评估输出
judgment = self.judge.evaluate(
prompt=f"""
评估以下 Agent 回复的质量:
用户问题: {test_case.input}
Agent 回复: {response}
评估标准: {test_case.criteria}
评分 (1-5):
原因:
"""
)
return {
"score": judgment.score,
"reason": judgment.reason,
"passed": judgment.score >= test_case.threshold
}
# 定义测试用例
test_cases = [
{
"name": "工具推荐应包含价格信息",
"input": "推荐一个好用的 AI 写作工具",
"criteria": "回复必须: 1)推荐具体工具 2)包含定价信息 3)链接可访问",
"threshold": 4 # 最低4分才算通过
},
{
"name": "技术问题应给出代码示例",
"input": "怎么用 MCP 协议连接本地数据库",
"criteria": "回复必须: 1)解释 MCP 概念 2)包含可运行的代码 3)有错误处理",
"threshold": 4
}
]
第 3 层:集成测试
# 测试 Agent 与外部系统的集成
async def test_agent_github_integration():
# Mock GitHub API
with mock_github_api(issues=[...], prs=[...]):
agent = create_agent("miaoquai-ops")
result = await agent.run("检查今天需要处理的 GitHub issues")
# 验证 Agent 调用了正确的工具
assert agent.tool_calls["github_list_issues"].called
assert "3 个 issue" in result # 模糊匹配
第 4 层:E2E Agent 测试
# 端到端测试 - 最接近真实使用场景
async def test_daily_news_generation():
agent = create_agent("miaoquai-ops")
# 模拟一天的完整工作流
result = await agent.run("执行今日 AI 新闻日报生成任务")
# 验证最终产出
assert os.path.exists("/var/www/miaoquai/news/2026-04-29.html")
# 验证内容质量(用 Eval)
content = read_file(result.file_path)
eval_result = await eval_news_page(content)
assert eval_result.score >= 4
🚀 OpenClaw 实战
妙趣AI 的测试体系
# 妙趣AI 测试配置
const testSuite = {
# 工具单元测试 - 每次 deploy 前跑
unitTests: {
"format_sitemap": "sitemap 格式正确",
"generate_html": "HTML 结构完整",
"extract_trending": "热词提取准确"
},
# Agent Evals - 每天 cron 跑
agentEvals: {
"glossary_page": {
input: "生成 RAG 术语解释页面",
criteria: "包含定义、原理、代码示例、内链",
threshold: 4
},
"news_digest": {
input: "生成今日 AI 新闻日报",
criteria: "包含 5+ 条新闻、有来源链接、有妙趣风格",
threshold: 4
}
},
# E2E 测试 - 每周跑一次
e2eTests: [
"完整日报生成流程",
"SEO 页面批量生成",
"Discord 消息发送"
]
};
💡 OpenClaw 测试最佳实践:
1. 工具函数 100% 覆盖:这些是确定性的,传统测试完全适用
2. Eval 用小模型做 Judge:省钱且够用
3. 测试数据版本化:把 golden inputs/outputs 存入 Git
4. 设置合理的 threshold:不要要求 5 分完美,4 分已经很好
5. E2E 测试用 staging 环境:别拿生产环境开刀
1. 工具函数 100% 覆盖:这些是确定性的,传统测试完全适用
2. Eval 用小模型做 Judge:省钱且够用
3. 测试数据版本化:把 golden inputs/outputs 存入 Git
4. 设置合理的 threshold:不要要求 5 分完美,4 分已经很好
5. E2E 测试用 staging 环境:别拿生产环境开刀
⚖️ LLM-as-Judge 详解
LLM-as-Judge 是 Agent 测试的核心方法论——用一个(通常是更强大的)LLM 来评估另一个 LLM 的输出。
评估维度
| 维度 | 说明 | 示例 |
|---|---|---|
| 正确性 | 事实是否准确 | 代码是否可运行 |
| 完整性 | 是否覆盖要求 | 是否包含所有必需信息 |
| 风格一致性 | 是否符合预设风格 | 是否有"妙趣风格" |
| 安全性 | 是否有有害输出 | 是否泄露敏感信息 |
| 效率 | 是否简洁有效 | 是否有多余步骤 |
⚠️ LLM-as-Judge 的局限性:
1. 位置偏差:评委倾向于给排在前面的答案高分
2. 长度偏差:评委倾向于给更长的答案高分
3. 自我偏好:评委倾向给自己同类模型的输出高分
4. 成本:大量 eval 需要消耗不少 token
解决方案:随机打乱顺序、使用不同模型做交叉评估、定期人工抽检。
1. 位置偏差:评委倾向于给排在前面的答案高分
2. 长度偏差:评委倾向于给更长的答案高分
3. 自我偏好:评委倾向给自己同类模型的输出高分
4. 成本:大量 eval 需要消耗不少 token
解决方案:随机打乱顺序、使用不同模型做交叉评估、定期人工抽检。
📦 测试框架推荐
| 框架 | 特点 | 适用场景 |
|---|---|---|
| OpenAI Evals | 官方,模板丰富 | OpenAI 模型 |
| LangSmith | 可观测+评估一体 | LangChain 生态 |
| Braintrust | 开源,灵活评估 | 多模型 |
| AgentBench | Agent 专项 benchmark | 学术研究 |
| 自建 Evals | 最灵活,零依赖 | 生产 Agent |
📝 总结
测试 Agent 不像测试一个计算器——你按 1+1 期望它显示 2,但它可能给你一首诗。Agent 测试的本质不是"验证正确性",而是"建立信心"——让你有把握把它推上线。记住:完美的 Agent 不存在,但足够好的 Agent 可以通过系统化测试获得。
快速上手清单:
✅ 1. 先测工具函数(传统测试,确定性高)
✅ 2. 建立 Eval 测试集(10-20 个关键场景)
✅ 3. 设置合理的 threshold(4 分就够了)
✅ 4. E2E 测试覆盖核心工作流
✅ 5. 定期人工抽检(每周 5-10 条)
✅ 1. 先测工具函数(传统测试,确定性高)
✅ 2. 建立 Eval 测试集(10-20 个关键场景)
✅ 3. 设置合理的 threshold(4 分就够了)
✅ 4. E2E 测试覆盖核心工作流
✅ 5. 定期人工抽检(每周 5-10 条)