13.2 端到端测试策略
本节讨论端到端测试的多种策略,包括 Mock 测试与真实测试的权衡、测试夹具设计、回归基线管理以及完整的 E2E 测试套件构建。
13.2.1 测试分类
端到端(E2E)测试涉及多种不同的测试策略,需要根据目的选择:
维度
分类
模型调用方式
Mock LLM vs 真实 LLM
工具调用方式
Mock Tools vs 真实工具
数据来源
合成数据 vs 真实数据 vs 众包数据
运行环境
离线 vs 实时在线
评估方式
自动化评估 vs 人工评估
13.2.2 Mock 测试 vs 真实测试
Mock 测试
Mock 测试的实现代码示例:
from unittest.mock import Mock, patch, MagicMock
import asyncio
class MockLLMResponse:
"""模拟LLM响应"""
def __init__(self, tool_calls: list):
self.tool_calls = tool_calls
class E2ETestWithMocks:
"""使用Mock的端到端测试"""
def setup_mock_llm(self):
"""设置Mock LLM"""
self.mock_llm = Mock()
# 预设第一步响应:读取文件
self.mock_llm.generate.side_effect = [
MockLLMResponse([
{"tool_name": "read_file", "args": {"path": "data.txt"}}
]),
MockLLMResponse([
{"tool_name": "analyze_text", "args": {"text": "file content"}}
]),
MockLLMResponse([
{"tool_name": "write_file", "args": {"path": "result.txt", "content": "analysis"}}
])
]
def setup_mock_tools(self):
"""设置Mock工具"""
self.mock_tools = {
"read_file": Mock(return_value="file content"),
"analyze_text": Mock(return_value="analysis result"),
"write_file": Mock(return_value=True),
}
async def test_file_analysis_workflow(self):
"""测试文件分析工作流"""
self.setup_mock_llm()
self.setup_mock_tools()
# 创建Agent(使用Mock)
agent = Agent(
llm=self.mock_llm,
tools=self.mock_tools
)
# 运行任务
result = await agent.run("分析data.txt文件并保存结果到result.txt")
# 验证
assert result.success == True
assert self.mock_tools["read_file"].called
assert self.mock_tools["analyze_text"].called
assert self.mock_tools["write_file"].called
# 验证调用顺序
calls = self.mock_llm.generate.call_args_list
assert len(calls) == 3 # 三步调用Mock 测试的优点:
快速(<100ms)
确定性(相同输入→相同输出)
易于隔离问题
缺点:
无法测试 LLM 实际行为
Mock 可能不够真实
无法测试新的工具组合
真实测试
使用真实 LLM 的测试实现代码:
真实测试的优点:
真实性强
能发现 Mock 无法发现的问题
能评估 LLM 在新任务上的表现
缺点:
慢(每个测试 5-30 秒)
API 费用(真实调用)
不确定性(LLM 输出变化)
13.2.3 测试夹具设计
测试夹具(Test Fixtures)是测试的基础设施,包括测试数据、环境配置等。
13.2.4 回归测试基线
当系统演进时,需要维护一个基线来检测性能退化。
13.2.5 完整的 E2E 测试套件
代码如下:
本节总结:E2E 测试需要结合 Mock 测试(快速反馈)和真实测试(真实验证),使用明确的测试夹具和回归测试基线来确保质量。
最后更新于
