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测试(快速反馈)和真实测试(真实验证),使用明确的测试夹具和回归测试基线来确保质量。

最后更新于