Fire 项目测试套件
📁 测试文件结构
tests/
├── conftest.py # Pytest配置和fixtures
├── pytest.ini # Pytest设置和自定义标记
├── pytest_parallel.ini # 并行测试专用配置
├── requirements-test.txt # 测试依赖
├── unit/ # 单元测试
│ ├── test_fee_calculator.py # 交易费用计算器测试
│ ├── test_data_source_architecture.py # 统一数据源架构测试
│ ├── test_environment_fallback.py # 环境回退机制测试
│ ├── test_optimized_data_source.py # 数据源优化测试
│ └── test_backtest_future_function.py # 回测未来函数防护测试
├── trading/ # 交易模块测试
│ ├── test_simulation_engine.py # 模拟交易引擎测试
│ └── test_risk_engine.py # 风险引擎测试
├── integration/ # 集成测试
│ ├── test_trading_flow.py # 完整交易流程测试
│ └── test_backtest_future_function_integration.py # 回测集成测试
└── e2e/ # 端到端测试
├── test_data_source_api.py # 数据源API测试
└── test_trade_api.py # 交易API测试
🧪 测试文件详解
单元测试 (Unit Tests)
test_fee_calculator.py
测试内容: 交易费用计算器 代码关联:
core/models/broker.py- 费用配置模型core/trading/utils/fee_calculator.py- 费用计算逻辑 测试项目:TestFeeCalculator- 美股/港股费用计算测试- 费用精度验证(2位小数)
- 买入/卖出费用差异测试
- 自定义费率配置测试
test_data_source_architecture.py
测试内容: 统一数据源架构适配器 代码关联:
core/data_source/adapters/asset_adapter.py- 资产业务适配器core/data_source/adapters/quote_adapter.py- 行情业务适配器core/data_source/adapters/data_adapter.py- 数据拉取业务适配器core/services/websocket_service_factory.py- WebSocket服务工厂 测试项目:TestAssetAdapter- 资产业务适配器测试TestQuoteAdapter- 行情业务适配器测试TestDataAdapter- 数据拉取业务适配器测试TestWebSocketService- WebSocket服务工厂测试TestSymbolFormat- 股票代码格式规范测试
test_environment_fallback.py
测试内容: 环境回退机制 代码关联:
infrastructure/config/settings.py- 配置管理 测试项目:- 环境变量回退测试
- 默认配置验证
- 配置优先级测试
test_optimized_data_source.py
测试内容: 数据源优化 代码关联:
core/data_source/factories/- 工厂模式core/data_source/adapters/- 适配器模式 测试项目:- 缓存机制测试
- 连接池管理测试
- 性能优化验证
test_backtest_future_function.py
测试内容: 回测未来函数防护 代码关联:
core/trading/strategies/macd_strategy.py- MACD策略core/trading/engines/strategy_engine.py- 策略引擎 测试项目:- 回测模式时间控制测试
- 实时模式时间控制测试
- 策略上下文配置测试
- 历史数据时间范围验证
交易模块测试 (Trading Tests)
test_simulation_engine.py
测试内容: 模拟交易引擎 代码关联:
core/trading/engines/simulation_engine.py- 模拟引擎core/models/trading.py- 交易模型 测试项目:- 订单执行测试
- 资金管理测试
- 持仓管理测试
- 费用计算测试
test_risk_engine.py
测试内容: 风险引擎 代码关联:
core/trading/engines/risk_engine.py- 风险引擎core/models/risk.py- 风险模型 测试项目:- 风险检查测试
- 仓位限制测试
- 风险指标计算测试
集成测试 (Integration Tests)
test_trading_flow.py
测试内容: 完整交易流程 代码关联:
core/trading/engines/trading_session_engine.py- 交易会话引擎core/trading/engines/strategy_engine.py- 策略引擎core/trading/engines/simulation_engine.py- 模拟引擎 测试项目:- 完整交易流程测试
- 策略集成测试
- 风险管理集成测试
- 回测集成测试
test_backtest_future_function_integration.py
测试内容: 回测未来函数集成测试 代码关联:
core/trading/engines/trading_session_engine.py- 交易会话引擎core/trading/engines/time_series_controller.py- 时间序列控制器 测试项目:- 回测会话初始化测试
- 策略上下文配置测试
- 时间范围一致性验证
- 未来函数防护验证
端到端测试 (E2E Tests)
test_data_source_api.py
测试内容: 数据源API端点 代码关联:
api/v1/endpoints/assets.py- 资产API端点api/v1/endpoints/api_test.py- API测试端点api/v1/endpoints/stock_import.py- 数据导入APIapi/v1/endpoints/websocket.py- WebSocket端点 测试项目:TestAssetsAPI- 资产概览API测试TestAPITestEndpoints- API测试端点功能验证TestStockImportAPI- 股票数据导入API测试TestWebSocketAPI- WebSocket连接测试TestSymbolFormatAPI- 股票代码格式验证测试
test_trade_api.py
测试内容: 交易测试模块的数据获取API 代码关联:
api/v1/endpoints/trade_test.py- 交易测试API端点core/data_source/adapters/trade_adapter.py- 交易数据源适配器 测试项目:TestTradeDataRetrievalAPI- 市场类型和订单类型API测试 (8个测试)TestTradeOrdersAPI- 订单相关API测试 (5个测试)TestTradeExecutionsAPI- 成交明细相关API测试 (3个测试)TestTradeAccountAPI- 账户相关API测试 (4个测试)TestTradeAPIErrorHandling- 错误处理测试 (4个测试)TestTradeAPIIntegration- 集成功能测试 (4个测试)
测试范围: 仅测试数据获取相关功能,不测试交易提交功能 测试的API:
- ✅ 获取市场支持的订单类型
- ✅ 获取订单类型必填字段
- ✅ 获取当日订单
- ✅ 获取历史订单
- ✅ 获取订单详情
- ✅ 获取当日成交明细
- ✅ 获取历史成交明细
- ✅ 获取账户余额
- ✅ 估算最大购买数量
不测试的API:
- ❌ 委托下单 (避免真实交易)
- ❌ 改单 (避免真实交易)
- ❌ 撤单 (避免真实交易)
🚀 运行测试
基本命令
# 进入backend目录
cd backend
source venv/bin/activate
# 运行所有测试
pytest tests/ -v
# 运行特定类型测试
pytest tests/unit/ -v # 单元测试
pytest tests/trading/ -v # 交易模块测试
pytest tests/integration/ -v # 集成测试
pytest tests/e2e/ -v # 端到端测试
# 运行特定文件
pytest tests/unit/test_fee_calculator.py -v
pytest tests/e2e/test_data_source_api.py -v
并行测试
快速开始
# 运行单元测试(推荐)
python tests/run_tests.py --unit
# 运行所有测试
python tests/run_tests.py --all
# 查看执行计划
python tests/test_dependencies.py
使用pytest直接执行
# 并行执行单元测试
pytest tests/unit/ -n auto --dist=loadscope
# 并行执行指定测试
pytest tests/unit/test_fee_calculator.py tests/unit/test_environment_fallback.py -n 2
# 串行执行集成测试
pytest tests/integration/ -v
高级并行执行
# 使用高级并行执行器
python tests/run_parallel_tests.py --plan # 查看执行计划
python tests/run_parallel_tests.py --tests test_fee_calculator test_environment_fallback
python tests/run_parallel_tests.py # 运行所有测试
测试配置
测试用户: test_for_dev / test_only_for_dev
测试环境: ENVIRONMENT=test
测试数据库: Redis DB 15
JWT Token: 开发环境永不过期
高级选项
# 带覆盖率报告
pytest tests/ --cov=. --cov-report=html
# 详细输出
pytest tests/ -v -s
# 只运行失败的测试
pytest tests/ --lf
# 在第一个失败时停止
pytest tests/ -x
# 显示最慢的10个测试
pytest tests/ --durations=10
# 并行执行(自动检测CPU核心数)
pytest tests/unit/ -n auto
# 并行执行(指定进程数)
pytest tests/unit/ -n 4
📊 测试覆盖范围
API端点测试
- ✅
/api/v1/assets/*- 资产管理API (35个E2E测试) - ✅
/api/v1/api-test/*- API测试接口 (完整覆盖) - ✅
/api/v1/api-test/trade/*- 交易测试接口 (28个E2E测试) - ✅
/api/v1/settings/*- 设置管理API (完整覆盖) - ✅
/api/v1/stock-data/*- 股票数据API (完整覆盖) - ✅
/api/v1/stock-import/*- 数据导入API (完整覆盖) - ✅ WebSocket服务 - 实时通信测试
架构组件测试
- ✅ 抽象数据源适配器 (5个测试)
- ✅ 配置工厂和客户端工厂 (8个测试)
- ✅ 缓存机制和连接池 (6个测试)
- ✅ 业务适配器 (Asset/Quote/Data/Trade) (12个测试)
- ✅ WebSocket日志服务 (4个测试)
- ✅ 股票代码格式规范 (3个测试)
- ✅ 交易数据源适配器 (28个测试)
- ✅ 交易费用计算器 (15个测试)
- ✅ 模拟交易引擎 (8个测试)
- ✅ 风险引擎 (7个测试)
- ✅ 回测未来函数防护 (7个测试)
不测试的模块
- ❌
/api/v1/brokers/*- 券商管理API (避免数据变更) - ❌
/api/v1/users/*- 用户管理API (避免数据变更) - ❌
/api/v1/auth/*- 认证API (避免数据变更) - ❌
/api/v1/api-test/trade/submit-order- 委托下单API (避免真实交易) - ❌
/api/v1/api-test/trade/replace-order- 改单API (避免真实交易) - ❌
/api/v1/api-test/trade/cancel-order- 撤单API (避免真实交易)
🔧 并行测试系统
测试分类
1. 单元测试 (Unit Tests)
- 位置:
tests/unit/,tests/trading/ - 特点: 无外部依赖,可以完全并行执行
- 标记:
@pytest.mark.unit - 示例:
test_fee_calculator.py,test_environment_fallback.py
2. 集成测试 (Integration Tests)
- 位置:
tests/integration/ - 特点: 有依赖关系,需要按顺序执行
- 标记:
@pytest.mark.integration - 示例:
test_trading_flow.py,test_backtest_future_function_integration.py
3. E2E测试 (End-to-End Tests)
- 位置:
tests/e2e/ - 特点: 完整流程测试,必须串行执行
- 标记:
@pytest.mark.e2e - 示例:
test_data_source_api.py,test_trade_api.py
依赖管理
测试依赖关系
第1轮 (可并行):
├── test_fee_calculator
├── test_data_source_architecture
├── test_environment_fallback
├── test_optimized_data_source
├── test_backtest_future_function
├── test_simulation_engine
└── test_risk_engine
第2轮 (部分并行):
├── test_trading_flow (依赖: test_simulation_engine)
├── test_backtest_future_function_integration (依赖: test_backtest_future_function)
└── test_data_source_api (依赖: test_data_source_architecture)
第3轮 (串行):
└── test_trade_api (依赖: test_trading_flow)
资源隔离
- Redis依赖: 使用独立的数据库编号和会话ID
- Session依赖: 每个测试使用唯一的session_id
- Database依赖: 使用测试专用的数据库配置
性能优化
预期性能提升
- 总测试数: 11个
- 可并行: 7个
- 需串行: 4个
- 预估总时间: 99.0s
- 并行执行预估时间: 53.0s
- 时间节省: 46.0s (46.5%)
实际测试结果
# 串行执行
pytest tests/unit/ -v # 约15-20秒
# 并行执行
pytest tests/unit/ -n auto # 约5-8秒
配置选项
pytest.ini 配置
[pytest]
addopts =
-v
--tb=short
--strict-markers
--disable-warnings
markers =
unit: Unit tests
integration: Integration tests
e2e: End-to-end tests
redis_dependent: Tests that depend on Redis
session_dependent: Tests that depend on trading session
database_dependent: Tests that depend on database
sequential: Tests that must run sequentially
slow: Slow running tests
并行参数说明
-n auto: 自动检测CPU核心数-n 4: 手动指定4个进程--dist=loadscope: 按测试类分组,避免同一类的测试并行运行--dist=loadfile: 按文件分组--dist=loadgroup: 按标记分组
🛠️ 故障排除
常见问题
- 模块导入错误
cd backend source venv/bin/activate - 测试依赖缺失
pip install -r tests/requirements-test.txt - 数据源架构导入错误
pip install -e . - 测试冲突
- 确保每个测试使用独立的资源(session_id, redis数据库等)
- 检查是否有共享状态
- 依赖问题
- 使用
python tests/test_dependencies.py查看依赖关系 - 确保依赖的测试先执行
- 使用
- 性能问题
- 避免在并行测试中使用
time.sleep() - 使用mock替代真实的外部服务
- 避免在并行测试中使用
调试命令
# 查看详细的并行执行信息
pytest tests/unit/ -n 2 -v -s
# 查看测试收集信息
pytest tests/unit/ --collect-only
# 运行单个测试进行调试
pytest tests/unit/test_fee_calculator.py::TestFeeCalculator::test_us_buy_basic -v -s
# 查看测试执行计划
python tests/test_dependencies.py
🔧 测试配置
测试标记
@pytest.mark.unit: 单元测试@pytest.mark.integration: 集成测试@pytest.mark.e2e: 端到端测试@pytest.mark.cache: 缓存相关测试@pytest.mark.slow: 慢测试(在快速模式下跳过)@pytest.mark.redis_dependent: Redis依赖测试@pytest.mark.session_dependent: 交易会话依赖测试@pytest.mark.database_dependent: 数据库依赖测试@pytest.mark.sequential: 必须串行执行的测试
测试环境
- Redis DB: DB 15 (测试专用)
- 环境变量:
ENVIRONMENT=test - 模拟数据: 虚拟生成,不影响真实系统
- 无外部调用: 不调用真实API
📝 测试模板
import pytest
from unittest.mock import Mock, patch
from core.data_source.adapters.asset_adapter import AssetAdapter
@pytest.mark.unit
@pytest.mark.redis_dependent
class TestDataSourceArchitecture:
"""数据源架构测试"""
def setup_method(self):
"""每个测试前的设置"""
# 使用唯一的session_id避免冲突
self.session_id = f"test_session_{uuid.uuid4().hex[:8]}"
self.redis_db = 15 # 测试专用
def test_adapter_initialization(self):
"""测试适配器初始化"""
adapter = AssetAdapter("test_user_123")
assert adapter.user_id == "test_user_123"
@patch('core.data_source.adapters.asset_adapter.AssetDataSourceAdapter')
def test_adapter_functionality(self, mock_adapter):
"""测试适配器功能"""
mock_adapter.return_value.get_positions.return_value = []
adapter = AssetAdapter("test_user_123")
result = adapter.get_positions()
assert result is not None
🎯 最佳实践
1. 编写并行安全的测试
import uuid
class TestSimulationEngine:
def setup_method(self):
# 使用唯一的session_id避免冲突
self.session_id = f"test_session_{uuid.uuid4().hex[:8]}"
self.engine = SimulationEngine(self.user_id, self.session_id, self.initial_capital)
2. 资源隔离
@pytest.fixture(autouse=True)
def setup_test_environment(mock_redis):
"""自动设置测试环境"""
# 在每个测试前清理Redis
mock_redis.flushdb()
yield
# 测试后清理
mock_redis.flushdb()
3. 标记测试
@pytest.mark.unit
@pytest.mark.redis_dependent
class TestDataSourceArchitecture:
"""数据源架构测试"""
pass