单元测试

📎 引用文件

本文引用的文件 - agent/tests/conftest.py - agent/tests/test_agent_loop_trace.py - agent/tests/test_agent_loop_stream_retry.py - agent/tests/test_api_infrastructure.py - agent/tests/test_memory_lifecycle.py - agent/tests/test_factor_operators.py - agent/tests/fixtures/fake_mcp_server.py - pyproject.toml

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 Vibe-Trading 的单元测试体系,聚焦 pytest 框架配置、测试夹具设计、Mock 策略与断言方法,系统说明测试用例组织模式、命名约定与测试数据管理。文档结合仓库中的实际测试样例,覆盖 Agent 循环、API 基础设施、因子计算与记忆系统等关键模块,并给出覆盖率要求、性能基准与并行执行配置建议,以及与其他组件的隔离测试策略和常见问题解决方案。最后总结 TDD 实践与持续集成中的单元测试流程。

项目结构

Vibe-Trading 的后端测试集中在 agent/tests 目录下,采用“按功能/模块划分”的组织方式: - conftest.py:全局 pytest 配置与环境隔离夹具,确保每个测试在干净的环境变量与配置缓存中运行。 - fixtures:共享测试数据与轻量 Mock 服务(如 fake MCP 服务器)。 - 各 test_*.py:围绕具体子系统或功能的测试集,命名遵循 test_<模块或能力>.py。

graph TB A["agent/tests"] --> B["conftest.py<br/>全局夹具与环境隔离"] A --> C["fixtures/<br/>共享数据与Fake服务"] A --> D["test_agent_loop_*.py<br/>Agent 循环测试"] A --> E["test_api_infrastructure.py<br/>API 基础设施测试"] A --> F["test_memory_lifecycle.py<br/>记忆生命周期测试"] A --> G["test_factor_operators.py<br/>因子算子等价性测试"]

图表来源 - agent/tests/conftest.py:1-46 - agent/tests/fixtures/fake_mcp_server.py:1-48

章节来源 - agent/tests/conftest.py:1-46

核心组件

章节来源 - agent/tests/conftest.py:16-46 - agent/tests/test_memory_lifecycle.py:34-72 - agent/tests/test_agent_loop_stream_retry.py:21-68 - agent/tests/test_factor_operators.py:89-105

架构总览

下图展示 Agent 循环在测试环境中的调用链与重试策略,体现流式响应中断后的重试、事件上报与结果聚合。

sequenceDiagram participant T as "测试用例" participant AL as "AgentLoop" participant LLM as "LLM(模拟)" participant TR as "TraceWriter" participant PM as "PersistentMemory" T->>AL : run(user_message, session_id) AL->>PM : 初始化/读取运行上下文 AL->>LLM : stream_chat(messages, tools, callbacks) alt 流中断(ProviderStreamError) LLM-->>AL : 抛出异常 AL->>TR : 记录stream_reset事件 AL->>LLM : 重试一次(stream_chat) LLM-->>AL : 返回成功响应 else 正常 LLM-->>AL : 返回最终内容 end AL->>TR : 写入trace.jsonl(脱敏/外存大文本) AL-->>T : 返回{status,content,...}

图表来源 - agent/tests/test_agent_loop_stream_retry.py:107-144 - agent/tests/test_agent_loop_stream_retry.py:147-194 - agent/tests/test_agent_loop_trace.py:44-83 - agent/tests/test_agent_loop_trace.py:112-149

详细组件分析

Agent 循环测试:流重试与追踪

flowchart TD Start(["开始"]) --> Call["调用LLM流式接口"] Call --> Error{"是否抛出ProviderStreamError?"} Error --> |是| CheckCode{"是否4xx确定性错误?"} CheckCode --> |是| Fail["直接失败<br/>error_code=provider_stream_error"] CheckCode --> |否| Retry["重试一次"] Retry --> Success{"是否成功?"} Success --> |是| WriteTrace["写入trace(脱敏/外存)"] Success --> |否| Fail Error --> |否| WriteTrace WriteTrace --> End(["结束"])

图表来源 - agent/tests/test_agent_loop_stream_retry.py:81-104 - agent/tests/test_agent_loop_stream_retry.py:147-194 - agent/tests/test_agent_loop_trace.py:44-83 - agent/tests/test_agent_loop_trace.py:112-149

章节来源 - agent/tests/test_agent_loop_stream_retry.py:21-68 - agent/tests/test_agent_loop_stream_retry.py:107-144 - agent/tests/test_agent_loop_stream_retry.py:147-194 - agent/tests/test_agent_loop_trace.py:44-83 - agent/tests/test_agent_loop_trace.py:112-149

API 基础设施测试:安全与配置

classDiagram class Security { +require_auth() +require_event_stream_auth() +_parse_cors_origins() +_host_without_port() } class Helpers { +RUNS_DIR +SESSIONS_DIR +ENV_PATH +_read_env_values() +_write_env_values() +_validate_path_param() } class State { +_get_session_service() } class ApiServer { <<thin assembler>> } ApiServer --> Security : "重导出" ApiServer --> Helpers : "重导出" ApiServer --> State : "重导出"

图表来源 - agent/tests/test_api_infrastructure.py:17-47 - agent/tests/test_api_infrastructure.py:101-125 - agent/tests/test_api_infrastructure.py:157-183 - agent/tests/test_api_infrastructure.py:217-339 - agent/tests/test_api_infrastructure.py:347-356

章节来源 - agent/tests/test_api_infrastructure.py:17-47 - agent/tests/test_api_infrastructure.py:101-125 - agent/tests/test_api_infrastructure.py:157-183 - agent/tests/test_api_infrastructure.py:217-339 - agent/tests/test_api_infrastructure.py:347-356

记忆系统测试:生命周期与质量评分

flowchart TD S(["reinforce(entry,event,source)"]) --> CheckFlag{"VT_MEMORY_QUALITY开启?"} CheckFlag --> |否| ReturnFalse["返回False"] CheckFlag --> |是| Lookup["查找条目"] Lookup --> Found{"存在?"} Found --> |否| ReturnFalse Found --> |是| Delta["计算delta(事件+source折扣)"] Delta --> Cap{"达到会话上限?"} Cap --> |是| ReturnFalse Cap --> |否| Update["更新quality_score并钳制[0,1]"] Update --> Persist["持久化到磁盘"] Persist --> ReturnTrue["返回True"]

图表来源 - agent/tests/test_memory_lifecycle.py:182-221 - agent/tests/test_memory_lifecycle.py:228-305 - agent/tests/test_memory_lifecycle.py:313-330 - agent/tests/test_memory_lifecycle.py:338-348

章节来源 - agent/tests/test_memory_lifecycle.py:80-175 - agent/tests/test_memory_lifecycle.py:182-221 - agent/tests/test_memory_lifecycle.py:228-305 - agent/tests/test_memory_lifecycle.py:313-348

因子计算测试:等价性与性能路径

flowchart TD Start(["加载因子算子"]) --> Mode{"bottleneck启用?"} Mode --> |是| Fast["执行优化路径"] Mode --> |否| Slow["执行pandas参考路径"] Fast --> Compare["与参考实现对比"] Slow --> Compare Compare --> Pass{"结果一致?"} Pass --> |是| Done["通过"] Pass --> |否| Fail["失败(差异定位)"]

图表来源 - agent/tests/test_factor_operators.py:21-30 - agent/tests/test_factor_operators.py:36-84 - agent/tests/test_factor_operators.py:111-165 - agent/tests/test_factor_operators.py:235-299

章节来源 - agent/tests/test_factor_operators.py:21-30 - agent/tests/test_factor_operators.py:89-105 - agent/tests/test_factor_operators.py:111-165 - agent/tests/test_factor_operators.py:235-299

概念性总览

以下图示为概念性测试工作流,不直接映射到具体代码文件:

flowchart LR Dev["开发者编写测试(TDD)"] --> Run["本地运行pytest"] Run --> CI["CI流水线执行"] CI --> Coverage["收集覆盖率"] Coverage --> Report["生成报告"] Report --> Feedback["反馈修复/优化"]

依赖关系分析

graph TB subgraph "测试层" T1["test_agent_loop_*"] T2["test_api_infrastructure"] T3["test_memory_lifecycle"] T4["test_factor_operators"] end subgraph "源码层" S1["src.agent.loop / trace"] S2["src.api.* / api_server"] S3["src.memory.*"] S4["src.factors.*"] end T1 --> S1 T2 --> S2 T3 --> S3 T4 --> S4

图表来源 - agent/tests/test_agent_loop_stream_retry.py:107-144 - agent/tests/test_api_infrastructure.py:17-47 - agent/tests/test_memory_lifecycle.py:10-18 - agent/tests/test_factor_operators.py:21-30

章节来源 - agent/tests/test_agent_loop_stream_retry.py:107-144 - agent/tests/test_api_infrastructure.py:17-47 - agent/tests/test_memory_lifecycle.py:10-18 - agent/tests/test_factor_operators.py:21-30

性能考量

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - agent/tests/conftest.py:16-46 - agent/tests/test_agent_loop_stream_retry.py:81-104 - agent/tests/test_factor_operators.py:142-150 - agent/tests/test_memory_lifecycle.py:228-305

结论

Vibe-Trading 的单元测试体系以 pytest 为核心,通过严格的环境隔离、清晰的夹具设计与稳健的 Mock 策略,覆盖了 Agent 循环、API 基础设施、因子计算与记忆系统等关键模块。测试用例采用模块化组织与一致的命名约定,配合等价性断言与数值容差,确保优化路径的正确性与稳定性。建议在 CI 中启用并行执行与覆盖率收集,持续保障代码质量与回归防护。

[本节为总结性内容,不直接分析具体文件]

附录

pytest 配置与并行执行

章节来源 - pyproject.toml:1-200

测试数据与 Mock 服务

章节来源 - agent/tests/fixtures/fake_mcp_server.py:1-48

TDD 实践与 CI 流程

[本节为通用指导,不直接分析具体文件]