# perf_api_test **Repository Path**: hankaizhou/perf_api_test ## Basic Information - **Project Name**: perf_api_test - **Description**: 一个专注于性能测试的API工具库,提供高效、易用的接口测试方案,支持多种测试场景和性能分析,助力开发者快速定位和优化系统性能问题。 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-09 - **Last Updated**: 2026-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 性能测试框架 ## 📋 项目概述 性能测试框架是一个功能完整、架构清晰的测试工具,用于对API接口进行性能测试。框架采用模块化设计,具有高度的可扩展性,能够支持不同类型的接口进行性能测试。 ### ✨ 主要特性 - **模块化设计**:核心功能、接口适配、配置管理等模块分离 - **扩展性架构**:统一的接口抽象层和插件机制 - **灵活的配置系统**:支持通过配置文件或API动态调整测试参数 - **可复用组件**:提供测试工具类、数据生成器和结果分析组件 - **兼容主流性能测试指标**:支持响应时间、成功率、吞吐量等指标采集 - **详细的报告生成**:支持Markdown和Word格式的测试报告 - **Grafana集成**:支持从Grafana获取内存监控数据 - **AI分析集成**:支持使用DeepSeek AI分析测试结果 ## 📁 目录结构 ``` e:\api_test\ ├── adapters/ # 接口适配模块 ├── config/ # 配置管理模块 ├── core/ # 核心功能模块 ├── docs/ # 文档目录 ├── examples/ # 示例脚本 │ ├── example_usage.py # 使用示例脚本 │ ├── grafana_monitor.py # Grafana监控示例 │ └── test_oom.py # OOM测试示例(遗留脚本) ├── logs/ # 日志目录 ├── tests/ # 测试目录 ├── utils/ # 工具模块 ├── .env.example # 环境变量示例文件 ├── .gitignore # Git忽略文件 ├── cli.py # 命令行工具 ├── main.py # 主入口文件 ├── README.md # 项目说明文件 ├── requirements.txt # 依赖文件 ├── setup.py # 安装脚本 └── test_framework.py # 框架测试脚本 ``` ## 🚀 快速开始 ### 1. 环境准备 1. **安装Python 3.8+** - 从 [Python官网](https://www.python.org/downloads/) 下载并安装 2. **安装依赖** ```bash pip install -r requirements.txt ``` 3. **配置环境变量** - 复制 `.env.example` 为 `.env` - 根据实际情况修改配置 ### 2. 配置设置 1. **基础配置** - 打开 `config/default_config.py` 文件 - 修改以下配置: - `http.base_url`:设置为你要测试的API基础地址 - `http.headers`:添加必要的请求头(如认证Token) - `test.concurrency`:设置并发数 - `test.duration`:设置测试持续时间(秒) 2. **AI分析配置(可选)** - 在系统环境变量中设置: - Windows:`set DEEPSEEK_API_KEY=你的DeepSeek API密钥` - macOS/Linux:`export DEEPSEEK_API_KEY=你的DeepSeek API密钥` 3. **Grafana监控配置(可选)** - 修改 `grafana` 部分配置: - `enabled`:设置为 `true` - `url`:设置为Grafana服务器地址 - `api_key`:设置为Grafana API密钥 - `datasource`:设置为数据源名称 - `namespace`:设置为要监控的Kubernetes命名空间 ## 🎯 测试执行 ### 方式1:使用命令行工具(推荐) | 测试类型 | 命令示例 | 详细说明 | |----------|----------|----------| | 快速测试 | `python main.py run quick --base-url https://api.example.com --endpoints /api/test` | **用途**:快速验证接口的基本性能和可用性
**特点**:执行时间短,并发数适中
**适用场景**:开发阶段快速验证、CI/CD集成测试、日常监控 | | 基准测试 | `python main.py run baseline --base-url https://api.example.com --endpoints /api/test` | **用途**:建立性能基准,作为后续测试的参考点
**特点**:执行多次,获取稳定的性能数据
**适用场景**:系统上线前评估、性能优化前后对比 | | 压力测试 | `python main.py run stress --base-url https://api.example.com --endpoints /api/test --concurrency-levels 10,20,30` | **用途**:测试系统在不同负载下的表现,找出系统极限
**特点**:逐步增加并发数,观察系统性能变化
**适用场景**:系统容量规划、稳定性测试 | | 边界测试 | `python main.py run boundary --base-url https://api.example.com --endpoints /api/test --boundary-params '{"page":1,"size":0};{"page":99999,"size":10000}'` | **用途**:测试接口在边界值和异常情况下的表现
**特点**:使用边界参数和异常参数测试
**适用场景**:接口健壮性测试、异常处理验证 | ### 命令参数说明 **通用参数**: - `--base-url`:API基础地址,如 `https://api.example.com`(可选,默认使用配置文件中的值) - `--endpoints`:要测试的接口路径,多个接口用逗号分隔(可选,默认测试配置文件中的所有接口) - `--concurrency`:并发数,如 `5`(适用于快速测试) - `--duration`:测试持续时间(秒),如 `300`(适用于快速测试) **压力测试特有参数**: - `--concurrency-levels`:并发数级别,多个级别用逗号分隔,如 `10,20,30` **边界测试特有参数**: - `--boundary-params`:边界测试参数,多个参数用分号分隔,如 `{"page":1,"size":0};{"page":99999,"size":10000}` ### 使用示例 **示例1:运行快速测试(5线程,5分钟)** ```bash # 测试所有配置的接口 # --concurrency 5:设置5个并发线程 # --duration 300:设置测试持续300秒(5分钟) python main.py run quick --concurrency 5 --duration 300 # 测试指定接口 # --endpoints:指定要测试的接口路径,多个接口用逗号分隔 # --concurrency 5:设置5个并发线程 # --duration 300:设置测试持续300秒(5分钟) python main.py run quick --endpoints /v2/account/media/listVo,/v2/account/business/listVo --concurrency 5 --duration 300 ``` **示例2:运行基准测试** ```bash python main.py run baseline ``` **示例3:运行压力测试** ```bash python main.py run stress --concurrency-levels 5,10,15,20 ``` **示例4:运行边界测试** ```bash python main.py run boundary ``` **也可以使用cli.py执行相同的命令**: ```bash python cli.py run quick --concurrency 5 --duration 300 ``` ### 方式2:使用测试框架 ```bash # 运行完整的框架测试 python test_framework.py ``` ### 方式3:使用示例脚本 ```bash # 运行示例脚本 python examples/example_usage.py # 运行Grafana监控示例 python examples/grafana_monitor.py # 运行遗留的OOM测试脚本(仅作为示例) python examples/test_oom.py ``` ## 📊 结果分析 1. **查看测试报告** - 测试完成后,报告将生成在 `reports` 目录中 - Markdown报告:`reports/test_report_<时间戳>.md` - Word报告:`reports/test_report_<时间戳>.docx` 2. **报告内容分析** - 📋 **测试概览**:包含测试开始/结束时间、总请求数、成功率等 - 📈 **详细结果**:每个接口的响应时间、错误率等 - 🧠 **内存监控数据**:系统和进程内存使用情况 - 🤖 **AI分析结论**:如果启用了AI分析 3. **关键指标解读** - ✅ **成功率**:应达到99%以上 - ⏱️ **响应时间**:根据业务需求评估,通常应在1秒以内 - 🔄 **吞吐量**:单位时间内处理的请求数,反映系统处理能力 - 📉 **TP95/TP99**:95%/99%请求的响应时间,反映系统的稳定性 ## 🧪 核心模块使用指南 ### 1. 测试执行引擎 测试执行引擎负责管理测试的执行过程,包括并发控制和任务调度。 **使用示例**: ```python from core.test_executor import TestExecutor # 初始化执行器,设置并发数为20 executor = TestExecutor(concurrency=20) # 定义测试函数 def test_api(): # 测试逻辑 pass # 运行并发测试,持续300秒 results = executor.run_concurrent_test(test_api, [], duration_seconds=300) # 运行批量测试 test_cases = [ {'target': test_api, 'args': []}, # 更多测试用例 ] batch_results = executor.run_batch_test(test_cases) ``` ### 2. 数据收集模块 数据收集模块负责收集和分析测试数据,包括响应时间、成功率等指标。 **使用示例**: ```python from core.data_collector import DataCollector collector = DataCollector() # 添加测试结果 for result in test_results: collector.add_result(result) # 分析结果 analysis = collector.analyze_results() print(analysis) # 导出结果 collector.export_results('results.json') ``` ### 3. 报告生成模块 报告生成模块负责生成测试报告,支持Markdown和Word格式。 **使用示例**: ```python from core.report_generator import ReportGenerator # 初始化报告生成器 generator = ReportGenerator(report_dir='reports') # 生成Markdown报告 markdown_report = generator.generate_markdown_report(test_results, ai_analysis=None) print(f"Markdown报告已生成: {markdown_report}") # 生成Word报告 word_report = generator.generate_word_report(test_results, ai_analysis=None) if word_report: print(f"Word报告已生成: {word_report}") ``` ### 4. 性能指标采集模块 性能指标采集模块负责采集和分析性能测试指标。 **使用示例**: ```python from core.metrics import MetricsCollector collector = MetricsCollector() # 添加请求记录 collector.add_request(response_time=0.5, success=True, status_code=200) collector.add_request(response_time=1.2, success=True, status_code=200) collector.add_request(response_time=0.8, success=False, status_code=500) # 停止采集 collector.stop() # 获取性能指标 metrics = collector.get_metrics() print(metrics) # 导出指标 collector.export_metrics('metrics.json') ``` ## 🔌 接口适配器开发指南 ### 1. 适配器基类 所有接口适配器都必须继承自`BaseAdapter`类,并实现以下方法: - `send_request()`: 发送请求并返回结果 - `get_name()`: 获取适配器名称 - `get_supported_methods()`: 获取支持的方法 ### 2. HTTP适配器 HTTP适配器用于测试HTTP接口,支持GET、POST、PUT、DELETE等方法。 **使用示例**: ```python from adapters.http import HTTPAdapter # 初始化HTTP适配器 adapter = HTTPAdapter( base_url="https://api.example.com", headers={"Content-Type": "application/json", "Authorization": "Bearer token"} ) # 发送POST请求 result = adapter.send_request( endpoint="/api/users", data={"name": "test", "email": "test@example.com"}, method="POST" ) # 发送GET请求 result = adapter.send_request( endpoint="/api/users", params={"page": 1, "size": 10}, method="GET" ) ``` ### 3. 自定义适配器 要创建自定义适配器,需要继承`BaseAdapter`类并实现必要的方法。 **示例**: ```python from adapters.base import BaseAdapter class WebSocketAdapter(BaseAdapter): def send_request(self, endpoint, data=None, **kwargs): # 实现WebSocket请求逻辑 pass def get_name(self): return "WebSocket" def get_supported_methods(self): return ["CONNECT", "SEND", "CLOSE"] ``` ## ⚙️ 配置系统使用指南 配置系统支持从文件加载配置,以及动态调整配置参数。 **使用示例**: ```python from config import ConfigManager, DEFAULT_CONFIG # 初始化配置管理器 config = ConfigManager("config.json") # 获取配置值 concurrency = config.get("test.concurrency", 10) # 设置配置值 config.set("test.duration", 600) # 更新配置 new_config = {"test": {"timeout": 60}} config.update_config(new_config) # 保存配置 config.save_config("new_config.json") # 重置为默认配置 config.reset_to_default() ``` ## 🛠️ 工具类使用指南 ### 1. 日志工具 日志工具用于配置和管理日志系统。 **使用示例**: ```python from utils import setup_logger # 设置日志 logger = setup_logger( name="performance_test", config={ "level": "INFO", "log_dir": "logs", "max_bytes": 10485760, # 10MB "backup_count": 5 } ) # 使用日志 logger.info("测试开始") logger.error("测试失败") ``` ### 2. 数据生成器 数据生成器用于生成测试数据,支持多种类型的数据生成。 **使用示例**: ```python from utils import DataGenerator # 生成随机字符串 random_str = DataGenerator.generate_string(length=20) # 生成随机数字 random_num = DataGenerator.generate_number(min_value=1, max_value=100) # 生成分页参数 pagination = DataGenerator.generate_pagination_params(page_num=1, page_size=20) # 生成时间范围参数 time_range = DataGenerator.generate_time_range(days=30) ``` ### 3. 结果分析器 结果分析器用于分析测试结果并生成统计数据。 **使用示例**: ```python from utils import ResultAnalyzer # 分析测试结果 analysis = ResultAnalyzer.analyze(test_results) # 生成分析摘要 summary = ResultAnalyzer.generate_summary(analysis) print(summary) # 比较两个测试结果 comparison = ResultAnalyzer.compare_results(results1, results2) # 导出分析结果 ResultAnalyzer.export_analysis(analysis, "analysis.json") ``` ### 4. 内存监控工具 内存监控工具用于监控系统和进程内存使用情况。 **使用示例**: ```python from utils import MemoryMonitor # 初始化内存监控器 monitor = MemoryMonitor(interval=30) # 每30秒采集一次 # 开始监控,持续3600秒 monitor.start_monitoring(duration=3600) # 执行测试... # 停止监控 monitor.stop_monitoring() # 获取内存数据 memory_data = monitor.get_memory_data() # 获取内存监控摘要 summary = monitor.get_summary() # 导出内存数据 monitor.export_data("memory_data.json") ``` ## 📈 性能测试指标说明 框架支持采集以下性能测试指标: | 指标名称 | 说明 | 单位 | |---------|------|------| | 总请求数 | 测试过程中发送的总请求数量 | 个 | | 成功数 | 成功的请求数量 | 个 | | 错误数 | 失败的请求数量 | 个 | | 成功率 | 成功请求占总请求的百分比 | % | | 平均响应时间 | 所有请求的平均响应时间 | 秒 | | 最大响应时间 | 所有请求中的最大响应时间 | 秒 | | 最小响应时间 | 所有请求中的最小响应时间 | 秒 | | TP50 | 50%请求的响应时间不超过此值 | 秒 | | TP90 | 90%请求的响应时间不超过此值 | 秒 | | TP95 | 95%请求的响应时间不超过此值 | 秒 | | TP99 | 99%请求的响应时间不超过此值 | 秒 | | 吞吐量 | 单位时间内处理的请求数 | req/s | | 响应时间分布 | 不同响应时间区间的请求数分布 | 个 | | 状态码分布 | 各状态码的请求数分布 | 个 | ## 🚀 扩展开发示例 ### 1. 自定义适配器 **示例:创建gRPC适配器** ```python from adapters.base import BaseAdapter class GRPCAdapter(BaseAdapter): def __init__(self, channel=None): self.channel = channel def send_request(self, endpoint, data=None, **kwargs): # 实现gRPC请求逻辑 # ... return { "success": True, "elapsed": 0.1, "status": 0, "request_info": {"endpoint": endpoint, "data": data}, "response_info": {"data": "response data"} } def get_name(self): return "gRPC" def get_supported_methods(self): return ["UNARY", "STREAM"] def initialize(self, config): # 初始化gRPC通道 pass def cleanup(self): # 清理gRPC通道 if self.channel: self.channel.close() ``` ### 2. 自定义测试场景 **示例:创建压力测试场景** ```python from core.test_executor import TestExecutor from core.data_collector import DataCollector from adapters.http import HTTPAdapter # 初始化组件 adapter = HTTPAdapter(base_url="https://api.example.com") executor = TestExecutor(concurrency=50) collector = DataCollector() # 定义测试函数 def test_api(): result = adapter.send_request( endpoint="/api/resource", data={"key": "value"}, method="POST" ) return result # 运行压力测试 print("开始压力测试...") results = executor.run_concurrent_test(test_api, [], duration_seconds=1800) # 30分钟 # 收集和分析结果 collector.add_results(results) analysis = collector.analyze_results() # 打印分析结果 print("测试结果分析:") print(f"总请求数: {analysis['total']}") print(f"成功率: {analysis['success_rate']:.2f}%") print(f"平均响应时间: {analysis['avg_response_time']:.3f}s") print(f"吞吐量: {analysis['throughput']:.2f} req/s") ``` ## 🌟 最佳实践 ### 1. 测试设计 - **明确测试目标**:在开始测试前,明确测试的目标和预期结果 - **选择合适的并发数**:根据系统性能和测试目标选择合适的并发数 - **设置合理的测试时长**:确保测试时长足够长,能够反映系统的真实性能 - **准备多样化的测试数据**:使用数据生成器生成多样化的测试数据 ### 2. 配置管理 - **使用配置文件**:将测试参数集中到配置文件中,便于管理和调整 - **环境分离**:为不同环境(开发、测试、生产)创建不同的配置文件 - **版本控制**:将配置文件纳入版本控制,确保测试的可重复性 ### 3. 结果分析 - **关注关键指标**:重点关注成功率、响应时间和吞吐量等关键指标 - **对比分析**:与历史测试结果进行对比,评估系统性能的变化 - **深入分析错误**:分析错误类型和分布,找出系统的薄弱环节 - **生成详细报告**:使用报告生成器生成详细的测试报告,便于团队分析和决策 ### 4. 扩展开发 - **遵循适配器接口**:自定义适配器时,严格遵循BaseAdapter接口 - **保持代码简洁**:确保扩展代码简洁、清晰,易于维护 - **添加文档**:为扩展功能添加详细的文档和使用示例 - **测试扩展**:为扩展功能编写测试,确保其可靠性 ## ➕ 如何添加新接口 ### 1. 接口配置 要添加新接口到性能测试框架,只需在 `config/api_config.py` 文件中添加接口配置: ```python # 在 API_CONFIG 字典中添加新的接口配置 API_CONFIG = { "media_account": { "endpoint": "/v2/account/media/listVo", "method": "POST", "payload": {"pageNum": 1, "pageSize": 10}, "boundary_params": [ {"pageNum": 99999, "pageSize": 10}, # 大页码 {"pageNum": 1, "pageSize": 0}, # 零页大小 {"pageNum": 1, "pageSize": -1}, # 负数页大小 {"pageNum": 1, "pageSize": 10000} # 大页大小 ], "description": "媒体账户列表接口" }, "business_account": { "endpoint": "/v2/account/business/listVo", "method": "POST", "payload": { "pageNum": 1, "pageSize": 10, "params": { "beginEffectTime": "2026-01-27", "endEffectTime": "2026-02-25" } }, "boundary_params": [ {"pageNum": 99999, "pageSize": 10, "params": {"beginEffectTime": "2026-01-27", "endEffectTime": "2026-02-25"}}, {"pageNum": 1, "pageSize": 0, "params": {"beginEffectTime": "2026-01-27", "endEffectTime": "2026-02-25"}}, {"pageNum": 1, "pageSize": -1, "params": {"beginEffectTime": "2026-01-27", "endEffectTime": "2026-02-25"}}, {"pageNum": 1, "pageSize": 10000, "params": {"beginEffectTime": "2026-01-27", "endEffectTime": "2026-02-25"}}, {"beginEffectTime": "2026/02/25", "endEffectTime": "2026/02/25"}, # 格式错误 {"endEffectTime": "2026-02-25"}, # 缺失开始时间 {"beginEffectTime": "2026-01-27"} # 缺失结束时间 ], "description": "商机账户列表接口" }, # 新接口配置示例 "new_interface": { "endpoint": "/v2/path/to/interface", "method": "POST", "payload": {"key": "value"}, "boundary_params": [ {"key": "value1"}, {"key": "value2"} ], "description": "新接口描述" } } ``` ### 2. 接口配置字段说明 - **endpoint**:接口路径,如 `/v2/account/media/listVo` - **method**:请求方法,默认为 `POST` - **payload**:默认请求参数 - **boundary_params**:边界测试参数,用于测试接口在边界值和异常情况下的表现 - **description**:接口描述,用于在报告中显示 ### 3. 运行新接口测试 添加新接口后,框架会自动识别并将其包含在测试中: ```python from tests.test_scenarios import TestScenarios # 初始化测试场景 scenarios = TestScenarios(base_url="http://your-api-server.com", headers={"Authorization": "Bearer your-token"}) # 运行所有接口测试(包括新添加的接口) results = scenarios.run_all_interfaces_test(test_type="baseline") # 运行指定接口测试 results = scenarios.run_interface_test("new_interface", test_type="stress") # 运行所有边界测试 results = scenarios.run_all_boundary_tests() ``` ### 4. 报告生成 新接口的测试结果会自动包含在生成的测试报告中,包括接口描述、测试指标等信息。 ## 🔧 常见问题处理 | 问题 | 可能原因 | 解决方案 | |------|----------|----------| | API认证失败 | 认证Token错误或过期 | 检查请求头中的认证Token是否正确,确认Token是否过期 | | 测试结果异常 | 网络不稳定或系统负载高 | 检查网络连接,确认目标系统是否正常运行,调整测试参数 | | 内存监控失败 | 缺少psutil库或权限不足 | 确保安装了psutil库,检查系统权限 | | 报告生成失败 | 缺少python-docx库或权限不足 | 确保安装了python-docx库,检查报告目录权限 | | Grafana连接失败 | URL或API密钥错误 | 检查Grafana URL和API密钥是否正确,确认网络是否能访问Grafana | ## 📄 版本历史 ### v1.0.0 - 初始版本 - 实现核心功能模块 - 支持HTTP接口测试 - 提供基本的性能指标采集 - 生成Markdown和Word格式报告 ## 🤝 贡献指南 欢迎贡献代码和提出改进建议!请遵循以下步骤: 1. Fork 仓库 2. 创建特性分支 3. 提交更改 4. 推送到分支 5. 创建Pull Request ## 📄 许可证 本框架采用MIT许可证,详见LICENSE文件。