TestingPipeline_README.md
9.91 KB
搜索引擎测试流水线指南
概述
本文档介绍了搜索引擎项目的完整测试流水线,包括测试环境搭建、测试执行、结果分析等内容。测试流水线设计用于commit前的自动化质量保证。
🏗️ 测试架构
测试层次
测试流水线
├── 代码质量检查 (Code Quality)
│ ├── 代码格式化检查 (Black, isort)
│ ├── 静态分析 (Flake8, MyPy, Pylint)
│ └── 安全扫描 (Safety, Bandit)
│
├── 单元测试 (Unit Tests)
│ ├── RequestContext测试
│ ├── Searcher测试
│ ├── QueryParser测试
│ └── BooleanParser测试
│
├── 集成测试 (Integration Tests)
│ ├── 端到端搜索流程测试
│ ├── 多组件协同测试
│ └── 错误处理测试
│
├── API测试 (API Tests)
│ ├── REST API接口测试
│ ├── 参数验证测试
│ ├── 并发请求测试
│ └── 错误响应测试
│
└── 性能测试 (Performance Tests)
├── 响应时间测试
├── 并发性能测试
└── 资源使用测试
核心组件
- RequestContext: 请求级别的上下文管理器,用于跟踪测试过程中的所有数据
- 测试环境管理: 自动化启动/停止测试依赖服务
- 测试执行引擎: 统一的测试运行和结果收集
- 报告生成系统: 多格式的测试报告生成
🚀 快速开始
本地测试环境
启动测试环境
# 启动所有必要的测试服务 ./scripts/start_test_environment.sh运行完整测试套件
# 运行所有测试 python scripts/run_tests.py
# 或者使用pytest直接运行 pytest tests/ -v
3. **停止测试环境**
```bash
./scripts/stop_test_environment.sh
CI/CD测试
GitHub Actions
- Push到主分支自动触发
- Pull Request自动运行
- 手动触发支持
测试报告
- 自动生成并上传
- PR评论显示测试摘要
- 详细报告下载
📋 测试类型详解
1. 单元测试 (Unit Tests)
位置: tests/unit/
目的: 测试单个函数、类、模块的功能
覆盖范围:
test_context.py: RequestContext功能测试test_searcher.py: Searcher核心功能测试test_query_parser.py: QueryParser处理逻辑测试
运行方式:
# 运行所有单元测试
pytest tests/unit/ -v
# 运行特定测试
pytest tests/unit/test_context.py -v
# 生成覆盖率报告
pytest tests/unit/ --cov=. --cov-report=html
2. 集成测试 (Integration Tests)
位置: tests/integration/
目的: 测试多个组件协同工作的功能
覆盖范围:
test_search_integration.py: 完整搜索流程集成- 数据库、ES、搜索器集成测试
- 错误传播和处理测试
运行方式:
# 运行集成测试(需要启动测试环境)
pytest tests/integration/ -v -m "not slow"
# 运行包含慢速测试的集成测试
pytest tests/integration/ -v
3. API测试 (API Tests)
位置: tests/integration/test_api_integration.py
目的: 测试HTTP API接口的功能和性能
覆盖范围:
- 基本搜索API
- 参数验证
- 错误处理
- 并发请求
- Unicode支持
运行方式:
# 运行API测试
pytest tests/integration/test_api_integration.py -v
4. 性能测试 (Performance Tests)
目的: 验证系统性能指标
测试内容:
- 搜索响应时间
- API并发处理能力
- 资源使用情况
运行方式:
# 运行性能测试
python scripts/run_performance_tests.py
🛠️ 环境配置
测试环境要求
- Python环境 ```bash # 创建测试环境 conda create -n searchengine-test python=3.9 conda activate searchengine-test
# 安装依赖 pip install -r requirements.txt pip install pytest pytest-cov pytest-json-report
2. **Elasticsearch**
```bash
# 使用Docker启动ES
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
elasticsearch:8.8.0
- 环境变量
bash export ES_HOST="http://localhost:9200" export ES_USERNAME="elastic" export ES_PASSWORD="changeme" export API_HOST="127.0.0.1" export API_PORT="6003" export CUSTOMER_ID="test_customer" export TESTING_MODE="true"
服务依赖
测试环境需要以下服务:
Elasticsearch (端口9200)
- 存储和搜索测试数据
- 支持中文和英文索引
API服务 (端口6003)
- FastAPI测试服务
- 提供搜索接口
测试数据库
- 预配置的测试索引
- 包含测试数据
📊 测试报告
报告类型
实时控制台输出
- 测试进度显示
- 失败详情
- 性能摘要
JSON格式报告
{ "timestamp": "2024-01-01T10:00:00", "summary": { "total_tests": 150, "passed": 148, "failed": 2, "success_rate": 98.7 }, "suites": { ... } }文本格式报告
- 人类友好的格式
- 包含测试摘要和详情
- 适合PR评论
HTML覆盖率报告
- 代码覆盖率可视化
- 分支和行覆盖率
- 缺失测试高亮
报告位置
test_logs/
├── unit_test_results.json # 单元测试结果
├── integration_test_results.json # 集成测试结果
├── api_test_results.json # API测试结果
├── test_report_20240101_100000.txt # 文本格式摘要
├── test_report_20240101_100000.json # JSON格式详情
└── htmlcov/ # HTML覆盖率报告
🔄 CI/CD集成
GitHub Actions工作流
触发条件:
- Push到主分支
- Pull Request创建/更新
- 手动触发
工作流阶段:
代码质量检查
- 代码格式验证
- 静态代码分析
- 安全漏洞扫描
单元测试
- 多Python版本矩阵测试
- 代码覆盖率收集
- 自动上传到Codecov
集成测试
- 服务依赖启动
- 端到端功能测试
- 错误处理验证
API测试
- 接口功能验证
- 参数校验测试
- 并发请求测试
性能测试
- 响应时间检查
- 资源使用监控
- 性能回归检测
测试报告生成
- 结果汇总
- 报告上传
- PR评论更新
工作流配置
文件: .github/workflows/test.yml
关键特性:
- 并行执行提高效率
- 服务容器化隔离
- 自动清理资源
- 智能缓存依赖
🧪 测试最佳实践
1. 测试编写原则
- 独立性: 每个测试应该独立运行
- 可重复性: 测试结果应该一致
- 快速执行: 单元测试应该快速完成
- 清晰命名: 测试名称应该描述测试内容
2. 测试数据管理
# 使用fixture提供测试数据
@pytest.fixture
def sample_customer_config():
return CustomerConfig(
customer_id="test_customer",
es_index_name="test_products"
)
# 使用mock避免外部依赖
@patch('search.searcher.ESClient')
def test_search_with_mock_es(mock_es_client, test_searcher):
mock_es_client.search.return_value = mock_response
result = test_searcher.search("test query")
assert result is not None
3. RequestContext集成
def test_with_context(test_searcher):
context = create_request_context("test-req", "test-user")
result = test_searcher.search("test query", context=context)
# 验证context被正确更新
assert context.query_analysis.original_query == "test query"
assert context.get_stage_duration("elasticsearch_search") > 0
4. 性能测试指南
def test_search_performance(client):
start_time = time.time()
response = client.get("/search", params={"q": "test query"})
response_time = (time.time() - start_time) * 1000
assert response.status_code == 200
assert response_time < 2000 # 2秒内响应
🚨 故障排除
常见问题
- Elasticsearch连接失败 ```bash # 检查ES状态 curl http://localhost:9200/_cluster/health
# 重启ES服务 docker restart elasticsearch
2. **测试端口冲突**
```bash
# 检查端口占用
lsof -i :6003
# 修改API端口
export API_PORT="6004"
依赖包缺失
# 重新安装依赖 pip install -r requirements.txt pip install pytest pytest-cov pytest-json-report测试数据问题
# 重新创建测试索引 curl -X DELETE http://localhost:9200/test_products ./scripts/start_test_environment.sh
调试技巧
详细日志输出
pytest tests/unit/test_context.py -v -s --tb=long运行单个测试
pytest tests/unit/test_context.py::TestRequestContext::test_create_context -v调试模式
import pdb; pdb.set_trace()性能分析
pytest --profile tests/
📈 持续改进
测试覆盖率目标
- 单元测试: > 90%
- 集成测试: > 80%
- API测试: > 95%
性能基准
- 搜索响应时间:
- API并发处理: 100 QPS
- 系统资源使用:
质量门禁
- 所有测试必须通过
- 代码覆盖率不能下降
- 性能不能显著退化
- 不能有安全漏洞
📚 相关文档
🤝 贡献指南
- 为新功能编写对应的测试
- 确保测试覆盖率不下降
- 遵循测试命名约定
- 更新相关文档
- 运行完整测试套件后提交
通过这套完整的测试流水线,我们可以确保搜索引擎代码的质量、性能和可靠性,为用户提供稳定高效的搜索服务。