geo/.qoder/repowiki/zh/content/测试策略/测试策略.md

43 KiB
Raw Permalink Blame History

测试策略

**本文引用的文件** - [tests/conftest.py](file://tests/conftest.py) - [tests/test_auth.py](file://tests/test_auth.py) - [tests/test_business_flow.py](file://tests/test_business_flow.py) - [tests/test_citation_engine.py](file://tests/test_citation_engine.py) - [tests/test_citations.py](file://tests/test_citations.py) - [tests/test_content_agents.py](file://tests/test_content_agents.py) - [tests/test_llm_provider.py](file://tests/test_llm_provider.py) - [tests/test_pipeline_engine.py](file://tests/test_pipeline_engine.py) - [tests/test_platform_rules.py](file://tests/test_platform_rules.py) - [tests/test_prompt_template.py](file://tests/test_prompt_template.py) - [tests/test_queries.py](file://tests/test_queries.py) - [tests/test_rag_service.py](file://tests/test_rag_service.py) - [tests/test_scheduler.py](file://tests/test_scheduler.py) - [backend/tests/test_integration/test_full_flow.py](file://backend/tests/test_integration/test_full_flow.py) - [backend/app/main.py](file://backend/app/main.py) - [backend/app/api/deps.py](file://backend/app/api/deps.py) - [backend/app/services/auth.py](file://backend/app/services/auth.py) - [backend/app/workers/citation_engine.py](file://backend/app/workers/citation_engine.py) - [backend/app/workers/scheduler.py](file://backend/app/workers/scheduler.py) - [backend/app/api/auth.py](file://backend/app/api/auth.py) - [backend/app/api/citations.py](file://backend/app/api/citations.py) - [backend/app/api/queries.py](file://backend/app/api/queries.py) - [backend/app/database.py](file://backend/app/database.py) - [backend/app/config.py](file://backend/app/config.py) - [backend/app/agent_framework/agents/content_generator_agent.py](file://backend/app/agent_framework/agents/content_generator_agent.py) - [backend/app/agent_framework/agents/deai_agent.py](file://backend/app/agent_framework/agents/deai_agent.py) - [backend/app/agent_framework/agents/geo_optimizer_agent.py](file://backend/app/agent_framework/agents/geo_optimizer_agent.py) - [backend/app/agent_framework/pipeline/engine.py](file://backend/app/agent_framework/pipeline/engine.py) - [backend/app/agent_framework/pipeline/loader.py](file://backend/app/agent_framework/pipeline/loader.py) - [backend/app/services/llm/factory.py](file://backend/app/services/llm/factory.py)

更新摘要

变更内容

  • 新增代理框架测试章节涵盖ContentGeneratorAgent、DeAIAgent、GEOOptimizerAgent的单元测试策略
  • 新增LLM提供者测试章节包括LLMFactory工厂模式测试、OpenAIProvider和DeepSeekProvider测试
  • 新增管道引擎测试章节涵盖PipelineLoader和PipelineEngine的单元测试策略
  • 新增端到端工作流测试章节,涵盖完整业务流程的集成测试
  • 完善测试最佳实践增加代理框架测试、LLM提供者测试、管道引擎测试和端到端工作流测试的最佳实践指导
  • 更新测试策略以反映新增的测试覆盖范围和架构扩展

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 代理框架测试策略
  7. LLM提供者测试策略
  8. 管道引擎测试策略
  9. 端到端工作流测试策略
  10. 业务流程测试策略
  11. 调度器测试策略
  12. 依赖分析
  13. 性能考虑
  14. 故障排查指南
  15. 结论
  16. 附录

引言

本测试策略文档面向GEO项目的Pytest测试体系覆盖单元测试、集成测试、业务流程测试和端到端工作流测试的设计与实施要点。内容包括测试夹具与模拟对象的组织方式、测试数据管理策略、认证模块、引用引擎、查询处理、代理框架、LLM提供者、管道引擎、业务流程和调度器等关键功能的测试用例设计思路同时给出测试最佳实践包括覆盖率目标、持续集成配置建议以及测试环境管理方案并提供调试技巧与性能测试方法。

项目结构

测试目录位于仓库根目录下的tests采用按功能模块划分的组织方式配合Pytest的conftest集中式夹具与模拟对象确保测试隔离与可重复性。后端应用以FastAPI为核心API层通过依赖注入获取当前用户与数据库会话服务层封装业务逻辑工作器(worker)负责异步任务与平台适配。新增的代理框架、LLM提供者和管道引擎测试进一步完善了测试体系。

graph TB
subgraph "测试层"
C["tests/conftest.py"]
TA["tests/test_auth.py"]
TQ["tests/test_queries.py"]
TC["tests/test_citations.py"]
TCE["tests/test_citation_engine.py"]
TB["tests/test_business_flow.py"]
TS["tests/test_scheduler.py"]
TCA["tests/test_content_agents.py"]
TLP["tests/test_llm_provider.py"]
TPE["tests/test_pipeline_engine.py"]
TF["backend/tests/test_integration/test_full_flow.py"]
end
subgraph "后端应用"
M["backend/app/main.py"]
D["backend/app/api/deps.py"]
DB["backend/app/database.py"]
CFG["backend/app/config.py"]
AUTH_API["backend/app/api/auth.py"]
QUERIES_API["backend/app/api/queries.py"]
CITATIONS_API["backend/app/api/citations.py"]
CE["backend/app/workers/citation_engine.py"]
QS["backend/app/workers/scheduler.py"]
CGA["backend/app/agent_framework/agents/content_generator_agent.py"]
DEAI["backend/app/agent_framework/agents/deai_agent.py"]
GEO["backend/app/agent_framework/agents/geo_optimizer_agent.py"]
PL["backend/app/agent_framework/pipeline/engine.py"]
LOADER["backend/app/agent_framework/pipeline/loader.py"]
FACTORY["backend/app/services/llm/factory.py"]
end
C --> TA
C --> TQ
C --> TC
C --> TCE
C --> TB
C --> TS
C --> TCA
C --> TLP
C --> TPE
TF --> AUTH_API
TF --> QUERIES_API
TF --> CITATIONS_API
TCA --> CGA
TCA --> DEAI
TCA --> GEO
TLP --> FACTORY
TPE --> PL
TPE --> LOADER
TA --> AUTH_API
TQ --> QUERIES_API
TC --> CITATIONS_API
TCE --> CE
TS --> QS
AUTH_API --> D
QUERIES_API --> D
CITATIONS_API --> D
D --> DB
DB --> CFG
M --> AUTH_API
M --> QUERIES_API
M --> CITATIONS_API

图表来源

章节来源

核心组件

  • 测试夹具与模拟
    • 会话级调度器模拟:在测试启动时替换查询调度器,避免真实后台任务影响测试稳定性。
    • 用户与令牌提供模拟用户对象、JWT访问令牌及请求头便于认证相关接口测试。
    • 异步HTTP客户端基于ASGI传输创建异步HTTP客户端用于端到端API测试。
    • 依赖覆盖:通过依赖注入覆盖当前用户解析逻辑,简化认证流程。
    • 内存数据库使用SQLite内存数据库进行集成测试确保测试隔离性。
    • FakeLLMProvider自定义FakeLLMProvider类模拟LLM调用返回预设响应避免真实网络请求。
    • AsyncMock广泛使用AsyncMock替代真实异步操作确保测试的确定性和可重复性。
  • 测试数据管理
    • 使用pytest fixture生成模拟模型对象如查询、引用记录保证测试数据一致性与可读性。
    • 通过patch对服务层函数进行桩替隔离外部依赖提升测试确定性。
    • 直接操作数据库模型进行复杂场景测试,如权限隔离和统计计算。
    • 代理框架测试中使用TaskMessage构建测试任务模拟Agent执行流程。
  • 测试运行与并发
    • 使用pytest-asyncio标记异步测试确保事件循环正确初始化与清理。
    • 支持并行执行多个测试文件,提高测试执行效率。
    • 管道引擎测试中使用dry-run模式通过dispatcher=None实现无真实任务分发的测试。

章节来源

架构总览

下图展示了测试与被测系统的交互关系测试通过异步HTTP客户端直接调用FastAPI路由路由依赖当前用户与数据库会话服务层完成业务逻辑工作器负责平台查询与品牌匹配。新增的代理框架测试通过FakeLLMProvider模拟LLM调用管道引擎测试通过dry-run模式验证Pipeline执行流程。

sequenceDiagram
participant T as "测试用例"
participant AC as "异步HTTP客户端"
participant APP as "FastAPI应用"
participant R_AUTH as "认证路由"
participant R_QUERIES as "查询路由"
participant R_CIT as "引用路由"
participant DEPS as "依赖注入(get_current_user)"
participant SVC as "服务层"
participant DB as "数据库"
T->>AC : 发起HTTP请求
AC->>APP : ASGI传输调用
APP->>DEPS : 解析当前用户
DEPS->>DB : 查询用户
DB-->>DEPS : 返回用户
APP->>R_AUTH : 认证相关端点
APP->>R_QUERIES : 查询相关端点
APP->>R_CIT : 引用相关端点
R_AUTH->>SVC : 调用服务
R_QUERIES->>SVC : 调用服务
R_CIT->>SVC : 调用服务
SVC->>DB : 数据持久化/查询
DB-->>SVC : 返回结果
SVC-->>APP : 返回响应
APP-->>AC : 序列化响应
AC-->>T : 断言结果

图表来源

详细组件分析

认证模块测试策略

  • 测试目标
    • 注册成功与重复邮箱错误处理
    • 登录成功与密码错误场景
    • 当前用户信息获取(已认证与未认证)
  • 关键测试点
    • 使用patch对注册与登录服务函数进行桩替控制返回值与异常
    • 通过依赖覆盖与令牌头验证路由鉴权中间件行为
  • 用例设计要点
    • 成功路径断言状态码与响应体字段
    • 失败路径断言HTTP状态码与错误详情
    • 未认证路径断言401并检查依赖覆盖清理
sequenceDiagram
participant T as "测试用例"
participant AC as "异步HTTP客户端"
participant AUTH as "认证路由"
participant SVC as "认证服务"
participant DEPS as "依赖注入(get_current_user)"
T->>AC : POST /api/v1/auth/register
AC->>AUTH : 路由处理
AUTH->>SVC : 注册服务
SVC-->>AUTH : 返回用户或抛出异常
AUTH-->>AC : 201/400
AC-->>T : 断言
T->>AC : POST /api/v1/auth/login
AC->>AUTH : 路由处理
AUTH->>SVC : 登录服务
SVC-->>AUTH : 返回用户或None
AUTH-->>AC : 200/401
AC-->>T : 断言
T->>AC : GET /api/v1/auth/me
AC->>AUTH : 路由处理
AUTH->>DEPS : 解析当前用户
DEPS-->>AUTH : 返回用户或抛出401
AUTH-->>AC : 200/401
AC-->>T : 断言

图表来源

章节来源

引擎与查询处理测试策略

  • 测试目标
    • 品牌匹配器:精确、别名、模糊匹配与无匹配场景
    • 竞争品牌检测器:在文本中识别除目标品牌外的竞争品牌
    • 引擎执行流程:单平台查询、任务状态更新、记录创建与异常处理
  • 关键测试点
    • 单元测试直接构造BrandMatcher与CompetitorDetector断言匹配结果与置信度、位置等字段
    • 集成测试通过patch平台适配器返回AI响应验证引擎整合后的综合输出
  • 用例设计要点
    • 文本分段与位置提取:验证引用出现在第几段及上下文截取
    • 平台适配器替换:确保引擎执行单平台流程时能捕获异常并写入失败记录
classDiagram
class BrandMatcher {
+match(text) dict
-_extract_candidates(text) list
-_extract_position_and_context(text, keyword) tuple
}
class CompetitorDetector {
+detect(text, target_brand) list
}
class CitationEngine {
+execute_query(query, db) list
+execute_single_platform(keyword, platform, target_brand, brand_aliases) dict
-_get_or_create_task(db, query_id, platform) QueryTask
-_calculate_next_query_at(frequency) datetime
+close() void
}
BrandMatcher <.. CitationEngine : "使用"
CompetitorDetector <.. CitationEngine : "使用"

图表来源

章节来源

引用数据与报告测试策略

  • 测试目标
    • 引用列表查询与统计聚合
    • 立即运行查询任务
    • CSV导出格式与响应头校验
  • 关键测试点
    • 通过patch服务函数返回预设数据断言分页、总数与字段
    • 校验CSV内容类型、附件头与关键字段存在性
  • 用例设计要点
    • 统计聚合断言整体指标与按平台细分
    • 导出接口断言响应头与正文内容
sequenceDiagram
participant T as "测试用例"
participant AC as "异步HTTP客户端"
participant CIT as "引用路由"
participant REP as "报告路由"
participant SVC as "服务层"
T->>AC : GET /api/v1/citations/?skip=&limit=
AC->>CIT : 路由处理
CIT->>SVC : 获取引用列表
SVC-->>CIT : 返回(items,total)
CIT-->>AC : 200 + JSON
AC-->>T : 断言
T->>AC : GET /api/v1/citations/stats
AC->>CIT : 路由处理
CIT->>SVC : 获取统计
SVC-->>CIT : 返回统计聚合
CIT-->>AC : 200 + JSON
AC-->>T : 断言
T->>AC : GET /api/v1/reports/export/csv?query_id=
AC->>REP : 路由处理
REP->>SVC : 导出CSV
SVC-->>REP : 返回CSV字符串
REP-->>AC : 200 + text/csv + attachment
AC-->>T : 断言

图表来源

章节来源

查询管理测试策略

  • 测试目标
    • 创建查询(含配额限制场景)
    • 列表查询与分页
    • 更新查询(字段变更)
    • 删除查询
    • 查询不存在与跨用户访问控制
  • 关键测试点
    • 通过patch服务函数返回模拟查询对象或抛出权限异常
    • 断言HTTP状态码与响应体字段
  • 用例设计要点
    • 权限异常断言403与错误详情
    • 跨用户访问断言404模拟查询归属判定
sequenceDiagram
participant T as "测试用例"
participant AC as "异步HTTP客户端"
participant Q as "查询路由"
participant SVC as "服务层"
T->>AC : POST /api/v1/queries/
AC->>Q : 路由处理
Q->>SVC : 创建查询
SVC-->>Q : 返回查询或抛出权限异常
Q-->>AC : 201/403
AC-->>T : 断言
T->>AC : GET /api/v1/queries/?skip=&limit=
AC->>Q : 路由处理
Q->>SVC : 获取查询列表
SVC-->>Q : 返回(items,total)
Q-->>AC : 200 + JSON
AC-->>T : 断言
T->>AC : PUT /api/v1/queries/{id}
AC->>Q : 路由处理
Q->>SVC : 更新查询
SVC-->>Q : 返回更新后的查询或None
Q-->>AC : 200/404
AC-->>T : 断言
T->>AC : DELETE /api/v1/queries/{id}
AC->>Q : 路由处理
Q->>SVC : 删除查询
SVC-->>Q : 返回True/False
Q-->>AC : 204/404
AC-->>T : 断言

图表来源

章节来源

代理框架测试策略

测试目标

代理框架测试专注于验证GEO平台的智能代理执行逻辑包括内容生成代理、去AI化代理和GEO优化代理的功能完整性、错误处理能力和与LLM提供者的集成测试。

关键测试场景

  • ContentGeneratorAgent测试选题生成、文章生成、RAG知识检索、JSON解析、错误处理
  • DeAIAgent测试内容去AI化处理、温度参数验证、输入验证
  • GEOOptimizerAgent测试SEO/GEO优化、JSON降级处理、关键词注入
  • FakeLLMProvider测试模拟LLM调用、流式响应、错误模拟

测试实现策略

  • FakeLLMProvider自定义FakeLLMProvider类模拟LLM调用返回预设响应避免真实网络请求
  • AsyncMock广泛使用AsyncMock替代Redis、数据库和RAG服务调用
  • patch技术通过patch替换LLMFactory.get_default和RAGService隔离外部依赖
  • TaskMessage构建使用_test_make_task辅助函数创建测试任务消息
classDiagram
class ContentGeneratorAgent {
+execute(task) TaskResult
+_generate_topics(task) dict
+_generate_article(task) dict
+_retrieve_knowledge(kb_ids, query) str
+_extract_json(text) str
}
class DeAIAgent {
+execute(task) TaskResult
+_process(task) dict
}
class GEOOptimizerAgent {
+execute(task) TaskResult
+_optimize(task) dict
+_extract_json(text) str
}
class FakeLLMProvider {
+chat(messages, **kwargs) LLMResponse
+chat_stream(messages, **kwargs) AsyncGenerator
+provider_name str
+model_name str
+max_context_length int
}
ContentGeneratorAgent --> FakeLLMProvider : "使用"
DeAIAgent --> FakeLLMProvider : "使用"
GEOOptimizerAgent --> FakeLLMProvider : "使用"

图表来源

测试用例设计要点

  • 内容生成测试验证topics字段解析、article内容生成、word count计算、usage统计
  • RAG集成测试通过AsyncSessionLocal mock验证知识检索上下文注入
  • 错误处理测试模拟LLMError验证failed状态返回和错误消息处理
  • 温度参数测试验证DeAIAgent的temperature=0.9配置
  • JSON解析测试:测试json包裹和普通文本两种输出格式

章节来源

LLM提供者测试策略

测试目标

LLM提供者测试专注于验证GEO平台的LLM抽象层包括工厂模式、OpenAIProvider和DeepSeekProvider的功能完整性、错误处理和流式响应处理。

关键测试场景

  • LLMFactory测试:工厂创建、默认提供者选择、未知提供者处理、提供者列表
  • OpenAIProvider测试聊天响应、重试机制、错误处理、SSE流解析
  • DeepSeekProvider测试基础功能验证、与OpenAIProvider对比
  • LLMResponse测试响应结构验证、usage统计

测试实现策略

  • 环境变量设置通过monkeypatch设置OPENAI_API_KEY和DEEPSEEK_API_KEY
  • httpx模拟使用MagicMock模拟HTTP响应测试各种状态码场景
  • AsyncMock模拟异步HTTP客户端和SSE流响应
  • 重试机制测试通过patch asyncio.sleep避免真实等待时间
classDiagram
class LLMFactory {
+create(provider, model) LLMProvider
+get_default() LLMProvider
+list_providers() list[str]
+register(name, provider_cls) void
}
class OpenAIProvider {
+chat(messages) LLMResponse
+chat_stream(messages) AsyncGenerator
+provider_name str
+model_name str
+max_context_length int
}
class DeepSeekProvider {
+chat(messages) LLMResponse
+chat_stream(messages) AsyncGenerator
+provider_name str
+model_name str
+max_context_length int
}
class LLMProvider {
<<abstract>>
+chat(messages) LLMResponse
+chat_stream(messages) AsyncGenerator
+provider_name str
+model_name str
+max_context_length int
}
LLMFactory --> LLMProvider : "创建"
LLMProvider <|-- OpenAIProvider
LLMProvider <|-- DeepSeekProvider

图表来源

测试用例设计要点

  • 工厂模式测试验证create方法、默认提供者、未知提供者异常处理
  • HTTP响应测试模拟200、429、401等不同状态码的处理逻辑
  • 重试机制测试验证429速率限制的重试行为和401不可重试的处理
  • 流式响应测试验证SSE流的逐token解析和完成信号处理
  • 响应结构测试验证LLMResponse的字段完整性和默认值

章节来源

管道引擎测试策略

测试目标

管道引擎测试专注于验证GEO平台的Pipeline编排能力包括YAML加载、DAG验证、拓扑排序、变量解析和dry-run执行模式。

关键测试场景

  • PipelineLoader测试YAML加载、DAG验证、拓扑排序、变量解析
  • PipelineEngine测试dry-run模式、阶段执行、超时处理、重试机制
  • 变量解析测试:简单变量替换、嵌套路径解析、上下文传递
  • 依赖关系测试:有环图检测、无环图验证、执行顺序保证

测试实现策略

  • YAML模板使用textwrap.dedent创建测试用YAML配置
  • dry-run模式通过dispatcher=None实现无真实任务分发的测试
  • AsyncMock模拟Agent执行和任务状态查询
  • 拓扑排序:验证依赖关系的正确执行顺序
classDiagram
class PipelineLoader {
+load(pipeline_name) Pipeline
+load_from_yaml(yaml_content, pipeline_name) Pipeline
+validate_dag(stages) bool
+resolve_variables(template, context) Any
}
class PipelineEngine {
+execute(pipeline, context) PipelineResult
+_execute_stage(stage, exec_context, stages_context) StageResult
+_topological_sort(stages) list[PipelineStage]
+_resolve_stage_inputs(inputs, context) dict
+_should_skip(stage, failed_stages, skipped_stages) bool
+_evaluate_condition(condition, exec_context, stages_context) bool
+_extract_outputs(stage, output_data) dict
}
class Pipeline {
+name str
+version str
+description str
+variables dict
+stages list[PipelineStage]
}
class PipelineStage {
+name str
+agent str
+action str
+depends_on list[str]
+inputs dict
+outputs list[str]
+timeout_seconds int
+retry_count int
+condition str
+continue_on_failure bool
}
PipelineLoader --> Pipeline : "创建"
PipelineEngine --> Pipeline : "执行"
Pipeline --> PipelineStage : "包含"

图表来源

测试用例设计要点

  • YAML加载测试验证正常YAML的解析和Pipeline对象创建
  • DAG验证测试:测试有环图的异常处理和无环图的验证通过
  • 变量解析测试:验证{var}和{stages.step1.outputs.result}等变量引用
  • dry-run模式测试验证无dispatcher时的模拟执行和结果收集
  • 超时和重试测试:验证阶段级别的超时控制和重试机制

章节来源

端到端工作流测试策略

测试目标

端到端工作流测试专注于验证GEO平台的完整业务流程包括品牌查询、竞争品牌管理、引用数据收集、评分计算和CSV导出的完整链路。

关键测试场景

  • 完整品牌查询流程:品牌创建、竞争品牌添加、查询创建、引用数据模拟、评分计算、历史记录、统计聚合
  • CSV导出流程品牌创建、查询创建、引用数据创建、CSV导出、内容验证
  • 错误处理流程不存在的品牌ID处理、404错误验证

测试实现策略

  • 异步数据库使用SQLite内存数据库和async_sessionmaker
  • 依赖覆盖通过app.dependency_overrides覆盖get_db和get_current_user
  • 测试数据构建:直接操作模型类创建测试数据
  • HTTP客户端使用AsyncClient和ASGITransport进行端到端测试
sequenceDiagram
participant T as "端到端测试"
participant AC as "AsyncClient"
participant API as "FastAPI路由"
participant DB as "异步数据库"
T->>AC : POST /api/v1/brands/
AC->>API : 品牌创建
API->>DB : 插入品牌记录
API-->>AC : 201 + 品牌数据
T->>AC : POST /api/v1/brands/{brand_id}/competitors/
AC->>API : 添加竞争品牌
API->>DB : 插入竞争品牌记录
API-->>AC : 201 + 竞争品牌数据
T->>AC : POST /api/v1/queries/
AC->>API : 创建查询
API->>DB : 插入查询记录
API-->>AC : 201 + 查询数据
T->>AC : POST /api/v1/citations/
AC->>API : 创建引用记录
API->>DB : 插入引用记录
API-->>AC : 201 + 引用数据
T->>AC : GET /api/v1/brands/{brand_id}/score/
AC->>API : 获取品牌评分
API->>DB : 查询引用统计
API-->>AC : 200 + 评分数据

图表来源

测试用例设计要点

  • 数据隔离:使用独立的异步数据库连接和会话
  • 依赖注入通过dependency_overrides确保测试环境的一致性
  • 流程完整性:覆盖从品牌创建到最终评分的完整业务流程
  • 数据验证:验证统计计算的准确性,如提及率、引用率等指标
  • CSV内容验证:验证导出文件的格式和关键字段存在性

章节来源

业务流程测试策略

测试目标

业务流程测试旨在验证GEO应用的核心业务场景包括用户完整注册登录流程、查询词生命周期管理、权限隔离机制、配额限制控制、统计计算准确性以及CSV导出功能。

关键测试场景

  • 完整用户流程:从注册到登录再到查询管理的端到端流程
  • 查询生命周期:创建、更新、暂停、恢复、删除的完整生命周期
  • 权限隔离:确保用户间数据完全隔离
  • 配额限制:免费用户的查询数量限制验证
  • 统计准确性:引用统计数据的正确性验证
  • CSV导出:导出功能的完整性测试

测试实现策略

  • 用户管理通过fixture创建真实用户账户模拟完整的用户生命周期
  • 权限测试:使用两个独立用户账户验证权限隔离机制
  • 数据验证:直接操作数据库模型验证统计计算的准确性
  • 端到端验证通过异步HTTP客户端验证完整的业务流程
sequenceDiagram
participant T as "业务流程测试"
participant AC as "异步HTTP客户端"
participant AUTH as "认证路由"
participant QUERIES as "查询路由"
participant CITATIONS as "引用路由"
participant DB as "数据库"
T->>AC : 注册用户
AC->>AUTH : POST /api/v1/auth/register
AUTH->>DB : 创建用户记录
AUTH-->>AC : 201 Created
T->>AC : 登录用户
AC->>AUTH : POST /api/v1/auth/login
AUTH-->>AC : 200 OK + Token
T->>AC : 创建查询
AC->>QUERIES : POST /api/v1/queries/
QUERIES->>DB : 创建查询记录
QUERIES-->>AC : 201 Created
T->>AC : 验证统计
AC->>CITATIONS : GET /api/v1/citations/stats
CITATIONS->>DB : 查询引用记录
CITATIONS-->>AC : 200 OK + 统计数据
AC-->>T : 断言业务流程正确性

图表来源

测试用例设计要点

  • 用户隔离使用独立fixture创建多个用户确保权限测试的准确性
  • 数据完整性:通过直接操作数据库模型验证统计计算的正确性
  • 流程完整性:覆盖业务流程的所有关键节点和异常场景
  • 边界条件:测试配额限制、权限边界等关键边界条件

章节来源

调度器测试策略

测试目标

调度器测试专注于验证查询调度器的定时任务执行能力,包括调度器的启动/关闭、查询任务筛选机制、频率计算逻辑以及遗留任务处理功能。

关键测试场景

  • 调度器生命周期:启动、正常运行和优雅关闭
  • 查询筛选机制:仅执行活跃且到期的查询任务
  • 频率计算daily和weekly频率的next_query_at计算
  • 遗留任务处理处理超过1分钟未执行的pending任务
  • 异常处理:查询执行失败时的异常处理和日志记录

测试实现策略

  • 调度器控制通过patch替换真实的APScheduler使用AsyncMock控制调度器行为
  • 数据库隔离:使用独立的测试会话,确保调度器测试不影响其他测试
  • 时间控制:通过精确的时间戳控制查询的到期状态
  • 频率验证使用datetime.utcnow()进行精确的时间计算验证
classDiagram
class QueryScheduler {
+start() void
+check_and_execute_queries() void
+check_and_execute_pending_tasks() void
+shutdown() void
-_run_check() void
-_run_pending_tasks_check() void
-_execute_single_query(query, db) void
}
class CitationEngine {
+execute_query(query, db) list
+execute_single_platform(keyword, platform, target_brand, brand_aliases) dict
}
class AsyncIOScheduler {
+add_job(job, trigger, id, name) void
+start() void
+shutdown() void
}
QueryScheduler --> CitationEngine : "调用"
QueryScheduler --> AsyncIOScheduler : "使用"

图表来源

测试用例设计要点

  • 调度器生命周期:验证调度器启动时添加的定时任务和名称
  • 查询筛选:通过创建不同状态和到期时间的查询验证筛选逻辑
  • 频率计算使用绝对误差容差验证next_query_at的计算精度
  • 遗留任务处理验证pending任务的兜底处理机制
  • 异常处理:确保查询执行失败时不会中断整个调度流程

章节来源

依赖分析

  • 测试与被测模块耦合
    • 测试通过ASGI传输直接调用路由避免引入额外适配层
    • 通过依赖覆盖与patch解耦服务层与数据库、第三方平台
    • 业务流程测试直接操作数据库模型,确保测试数据的准确性
    • 代理框架测试通过FakeLLMProvider和AsyncMock解耦LLM调用
    • LLM提供者测试通过httpx模拟和AsyncMock解耦HTTP请求
    • 管道引擎测试通过dry-run模式解耦真实任务分发
  • 外部依赖与集成点
    • 数据库:通过异步引擎与会话管理,测试中可使用内存数据库或独立测试库
    • JWT通过服务层令牌生成与校验测试中直接构造令牌头
    • 平台适配器通过patch替换避免真实网络请求
    • 调度器通过patch替换真实的APScheduler使用AsyncMock控制调度行为
    • LLM提供者通过LLMFactory统一管理测试中可通过patch替换具体实现
  • 循环依赖与风险
    • 当前结构清晰,无明显循环依赖;注意在测试中避免对真实调度器的依赖
graph LR
T_AUTH["测试: 认证"] --> A_AUTH["路由: 认证"]
T_QUERIES["测试: 查询"] --> A_QUERIES["路由: 查询"]
T_CIT["测试: 引用"] --> A_CIT["路由: 引用"]
T_BUSINESS["测试: 业务流程"] --> A_QUERIES
T_BUSINESS --> A_CIT
T_SCHED["测试: 调度器"] --> QS["调度器: QueryScheduler"]
T_AGENTS["测试: 代理框架"] --> CGA["代理: ContentGeneratorAgent"]
T_AGENTS --> DEAI["代理: DeAIAgent"]
T_AGENTS --> GEO["代理: GEOOptimizerAgent"]
T_LLM["测试: LLM提供者"] --> FACTORY["工厂: LLMFactory"]
T_PIPE["测试: 管道引擎"] --> ENGINE["引擎: PipelineEngine"]
T_FULL["测试: 端到端"] --> A_AUTH
T_FULL --> A_QUERIES
T_FULL --> A_CIT
A_AUTH --> S_AUTH["服务: 认证"]
A_QUERIES --> S_QUERY["服务: 查询"]
A_CIT --> S_CIT["服务: 引用"]
S_AUTH --> DB["数据库"]
S_QUERY --> DB
S_CIT --> DB
QS --> CE["引擎: CitationEngine"]
QS --> DB
CGA --> LLM["LLM提供者"]
DEAI --> LLM
GEO --> LLM
ENGINE --> LOADER["加载器: PipelineLoader"]
DB --> CFG["配置"]

图表来源

章节来源

性能考虑

  • 测试并发与资源
    • 使用pytest-asyncio并行执行异步测试减少总耗时
    • 通过会话级调度器模拟避免真实后台任务带来的不稳定因素
    • 业务流程测试使用内存数据库避免磁盘I/O开销
    • 代理框架测试使用FakeLLMProvider避免真实LLM调用的网络延迟
    • LLM提供者测试使用httpx模拟避免真实HTTP请求的网络开销
    • 管道引擎测试使用dry-run模式避免真实任务分发的系统开销
  • 数据库与缓存
    • 建议使用独立测试数据库实例,避免与开发/生产数据冲突
    • 对高频查询场景,可在测试中模拟数据库延迟,评估路由与服务层的超时与重试策略
    • 调度器测试使用AsyncMock避免真实的定时任务执行
    • 代理框架测试使用AsyncMock避免真实Redis和数据库调用
  • 接口响应与序列化
    • 对大列表与统计聚合接口关注JSON序列化开销与分页参数边界
    • 业务流程测试中直接操作数据库模型避免不必要的API调用
    • 端到端测试中合理使用AsyncClient避免过多的HTTP请求
  • 平台适配器性能
    • 通过patch模拟不同响应时延与错误率评估引擎的容错与降级策略
    • 调度器测试中使用精确的时间控制,避免真实的等待时间
    • LLM提供者测试中使用AsyncMock避免真实网络请求的等待时间

故障排查指南

  • 常见问题定位
    • 认证失败:检查令牌生成与头设置、依赖覆盖是否生效
    • 404查询确认查询ID与用户归属检查服务层查询逻辑
    • 403配额检查服务层权限异常抛出与HTTP状态映射
    • 调度器异常检查APScheduler的启动状态和job配置
    • 业务流程失败检查数据库事务和fixture的使用
    • 代理执行失败检查FakeLLMProvider的mock配置和report_progress的patch
    • LLM提供者异常检查API密钥设置和httpx模拟配置
    • 管道执行失败检查YAML配置和依赖关系验证
    • 端到端测试失败:检查数据库连接和依赖覆盖配置
  • 调试技巧
    • 在conftest中临时打印依赖解析过程定位get_current_user解析失败原因
    • 使用pytest的-v与-s选项查看详细输出结合patch的side_effect观察异常传播
    • 对数据库相关测试开启SQLAlchemy echo以查看生成的SQL
    • 调度器测试中使用AsyncMock的assert_called_once()验证调度器行为
    • 代理框架测试中检查report_progress的调用次数和参数
    • LLM提供者测试中验证httpx.post的调用参数和返回值
    • 管道引擎测试中检查拓扑排序和变量解析的中间结果
  • 性能与稳定性
    • 对于长时间运行的异步测试,确保事件循环正确关闭
    • 对需要真实网络请求的场景优先使用patch模拟必要时增加超时与重试
    • 业务流程测试中合理使用fixture避免重复创建昂贵的对象
    • 代理框架测试中使用AsyncMock确保异步操作的正确模拟

结论

本测试策略以Pytest为核心结合会话级调度器模拟、依赖覆盖与patch技术实现了对认证、查询、引用、引擎模块、业务流程、调度器、代理框架、LLM提供者、管道引擎和端到端工作流的全面覆盖。通过明确的夹具与测试数据管理确保测试的可维护性与可重复性。新增的代理框架测试、LLM提供者测试、管道引擎测试和端到端工作流测试进一步完善了测试体系涵盖了智能代理执行、LLM抽象层、Pipeline编排和完整业务流程的关键功能。建议在CI中启用并行执行与覆盖率统计并为数据库、LLM提供者、代理框架和管道引擎建立稳定的模拟层持续提升测试效率与质量。

附录

  • 测试覆盖率要求建议
    • 语句覆盖率≥80%
    • 分支覆盖率≥70%
    • 行覆盖率≥80%
    • 函数/方法覆盖率≥90%
    • 业务流程覆盖率≥95%
    • 调度器覆盖率≥90%
    • 代理框架覆盖率≥90%
    • LLM提供者覆盖率≥90%
    • 管道引擎覆盖率≥90%
    • 端到端工作流覆盖率≥95%
  • 持续集成配置建议
    • 使用GitHub Actions或GitLab CI包含Python版本矩阵、依赖安装、数据库准备、pytest执行与覆盖率上传
    • 将测试与lint、类型检查并行确保主干分支质量
    • 为业务流程测试、调度器测试、代理框架测试、LLM提供者测试、管道引擎测试和端到端工作流测试单独配置执行时间限制
    • 为LLM提供者测试配置环境变量确保API密钥正确设置
  • 测试环境管理
    • 使用独立测试数据库与Redis实例避免污染
    • 通过环境变量切换测试配置,确保敏感信息不泄露
    • 业务流程测试使用内存数据库调度器测试使用AsyncMock
    • 代理框架测试使用FakeLLMProvider和AsyncMock
    • LLM提供者测试使用httpx模拟和环境变量
    • 管道引擎测试使用dry-run模式
    • 端到端测试使用AsyncClient和依赖覆盖
  • 性能测试方法
    • 使用pytest-benchmark或locust对高频路由进行基准测试
    • 对引擎执行流程进行压力测试,评估平台适配器与数据库写入瓶颈
    • 调度器测试中使用时间控制和AsyncMock避免真实的定时等待
    • 业务流程测试中评估端到端流程的响应时间和吞吐量
    • 代理框架测试中评估LLM调用的性能和错误处理
    • LLM提供者测试中评估HTTP请求的性能和重试机制
    • 管道引擎测试中评估Pipeline执行的性能和超时处理
    • 端到端测试中评估完整业务流程的性能和稳定性