接口自动化测试(Python+pytest+PyMySQL+Jenkins)
接口自动化测试
一个完整的企业级接口自动化测试解决方案
📋 目录
- 项目介绍
- 技术架构
- 功能特性
- 项目结构
- 环境要求
- 安装部署
- 使用方法
- 测试用例说明
- 预期结果
- 报告系统
- 配置说明
- 数据库设计
- Jenkins集成
- 常见问题
- 项目亮点
- 扩展指南
- 联系方式
🚀 项目介绍
项目背景
接口自动化测试作为现代软件开发流程的核心环节,已成为保障系统质量、提升交付效率的关键手段。本项目基于Python技术栈,构建了一套完整的接口自动化测试解决方案,旨在为开发团队提供高效、稳定、易维护的API测试框架。
项目目标
- 🎯 全面覆盖: 实现对RESTful API的全方位测试覆盖
- 🔧 易于维护: 提供清晰的项目结构和详细的文档说明
- 📊 丰富报告: 生成多种格式的测试报告和统计分析
- 🔄 持续集成: 支持Jenkins等CI/CD平台的无缝集成
- 📈 可扩展性: 支持快速扩展到其他API系统的测试
被测系统
本项目选择 Restful Booker API 作为被测系统:
- 系统地址: https://restful-booker.herokuapp.com
- 系统类型: RESTful API演示系统
- 主要功能: 酒店预订管理系统
- 接口覆盖: 认证、预订CRUD操作、健康检查等
项目价值
- 教学价值: 完整展示企业级接口测试项目的标准实现
- 实用价值: 可直接应用于实际项目的接口测试工作
- 参考价值: 提供接口测试领域的最佳实践和设计模式
🏗️ 技术架构
核心技术栈
技术组件 | 版本 | 用途说明 |
---|---|---|
Python | 3.8+ | 主要编程语言,提供丰富的测试生态 |
pytest | 7.4.3 | 现代化测试框架,支持丰富的插件 |
requests | 2.31.0 | HTTP客户端库,用于API调用 |
PyMySQL | 1.1.0 | MySQL数据库连接和操作 |
loguru | 0.7.2 | 现代化日志记录库 |
allure-pytest | 2.13.2 | 美观的测试报告生成 |
Faker | 19.12.0 | 测试数据生成库 |
Jinja2 | 3.0+ | 模板引擎,用于报告生成 |
Jenkins | 2.0+ | 持续集成平台 |
架构设计原则
- 分层架构: 清晰的分层设计,便于维护和扩展
- 模块化: 高内聚、低耦合的模块设计
- 可配置: 支持多环境配置和灵活的参数调整
- 可扩展: 插件化架构,易于添加新功能
- 可观测: 完整的日志记录和监控体系
✨ 功能特性
🧪 测试框架功能
- ✅ 多层次测试分类: 支持冒烟测试、回归测试、功能测试
- ✅ 参数化测试: 数据驱动的测试用例设计
- ✅ 并发执行: 多进程并行测试,提升执行效率
- ✅ 标记系统: 灵活的测试用例标记和筛选
- ✅ 前置后置: 完善的setup/teardown机制
- ✅ 断言增强: 丰富的断言方法和错误信息
🌐 API测试功能
- ✅ HTTP方法支持: GET、POST、PUT、PATCH、DELETE
- ✅ 认证机制: Token认证、Cookie管理
- ✅ 请求重试: 自动重试机制,提升稳定性
- ✅ 响应验证: 状态码、响应体、响应时间验证
- ✅ 数据格式: JSON、XML、表单数据支持
- ✅ 文件上传: 支持文件上传接口测试
📊 数据管理功能
- ✅ 数据库集成: MySQL数据库完整集成
- ✅ 测试数据管理: JSON格式的结构化测试数据
- ✅ 动态数据生成: Faker库生成随机测试数据
- ✅ 数据持久化: 测试结果和日志的持久化存储
- ✅ 数据清理: 自动化的测试数据清理机制
📈 报告系统
- ✅ HTML报告: pytest-html生成的标准报告
- ✅ Allure报告: 美观的交互式测试报告
- ✅ 自定义报告: 基于数据库的定制化报告
- ✅ 实时统计: 测试执行过程的实时统计
- ✅ 多格式输出: HTML、XML、JSON等多种格式
📝 日志系统
- ✅ 分级日志: DEBUG、INFO、WARNING、ERROR等级别
- ✅ 文件轮转: 自动管理日志文件大小和数量
- ✅ 结构化日志: 测试步骤、API调用分类记录
- ✅ 实时输出: 控制台和文件同步输出
- ✅ 日志分析: 支持日志查询和分析
🔄 持续集成
- ✅ Jenkins流水线: 完整的CI/CD配置
- ✅ 多环境支持: 生产、测试环境配置
- ✅ 参数化构建: 灵活的构建参数配置
- ✅ 邮件通知: 测试结果自动通知
- ✅ 定时执行: 支持定时触发测试
📁 项目结构
接口自动化测试项目/
├── 📋 配置管理
│ ├── config/
│ │ ├── config.py # 主配置文件
│ │ └── database.py # 数据库配置
│ ├── .env # 环境变量配置
│ ├── pytest.ini # pytest配置
│ └── conftest.py # pytest全局配置
│
├── 🧪 测试用例
│ └── testcases/
│ ├── test_auth.py # 认证接口测试(5个用例)
│ └── test_booking.py # 预订管理测试(16个用例)
│
├── 🛠️ 工具服务
│ └── utils/
│ ├── api_client.py # HTTP客户端封装
│ ├── database_helper.py # 数据库操作封装
│ ├── logger.py # 日志工具
│ └── report_generator.py # 报告生成器
│
├── 📊 数据管理
│ ├── data/
│ │ ├── test_data.json # 测试数据配置
│ │ └── sql/ # SQL脚本目录
│ ├── logs/ # 日志文件目录
│ └── reports/ # 测试报告目录
│
├── 🚀 执行脚本
│ ├── run_tests.py # 主测试执行脚本
│ ├── install.py # 环境安装脚本
│ ├── init_database.py # 数据库初始化脚本
│ ├── generate_test_data.py # 测试数据生成脚本
│ └── test_example.py # 功能验证脚本
│
├── 📚 项目文档
│ ├── README.md # 项目说明文档
│ ├── QUICKSTART.md # 快速开始指南
│ └── 项目总结.md # 项目总结报告
│
├── 🔧 CI/CD配置
│ ├── Jenkinsfile # Jenkins流水线配置
│ └── requirements.txt # Python依赖包
│
└── 📦 其他文件├── .gitignore # Git忽略文件└── LICENSE # 开源协议
目录说明
目录/文件 | 说明 | 重要程度 |
---|---|---|
config/ | 配置文件目录,包含所有配置相关文件 | ⭐⭐⭐⭐⭐ |
testcases/ | 测试用例目录,包含所有测试脚本 | ⭐⭐⭐⭐⭐ |
utils/ | 工具类目录,提供各种工具函数 | ⭐⭐⭐⭐⭐ |
data/ | 数据目录,包含测试数据和SQL脚本 | ⭐⭐⭐⭐ |
reports/ | 报告目录,存放生成的测试报告 | ⭐⭐⭐⭐ |
logs/ | 日志目录,存放运行日志 | ⭐⭐⭐ |
run_tests.py | 主执行脚本,提供便捷的测试执行 | ⭐⭐⭐⭐⭐ |
Jenkinsfile | CI/CD配置,用于持续集成 | ⭐⭐⭐⭐ |
💻 环境要求
基础环境
组件 | 版本要求 | 说明 |
---|---|---|
操作系统 | Windows 10+, macOS 10.14+, Ubuntu 18.04+ | 支持主流操作系统 |
Python | 3.8+ | 推荐使用Python 3.9或3.10 |
MySQL | 5.7+ | 可选,用于测试结果存储 |
Git | 2.0+ | 用于代码版本管理 |
Python环境
# 检查Python版本
python3 --version
# 输出示例: Python 3.9.7# 检查pip版本
pip3 --version
# 输出示例: pip 21.2.4
可选组件
组件 | 用途 | 安装方式 |
---|---|---|
Allure | 生成美观的测试报告 | npm install -g allure-commandline |
Jenkins | 持续集成平台 | 官网下载安装 |
Docker | 容器化部署 | 官网下载安装 |
🔧 安装部署
方式一:自动安装(推荐)
# 1. 克隆项目
git clone <项目地址>
cd 接口自动化测试项目# 2. 运行自动安装脚本
python3 install.py# 3. 验证安装
python3 test_example.py
方式二:手动安装
Mac/Linux 环境
# 1. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate# 2. 升级pip
pip install --upgrade pip# 3. 安装依赖
pip install -r requirements.txt# 4. 配置环境变量
cp .env.example .env
# 编辑.env文件,配置数据库等信息# 5. 初始化数据库(可选)
python3 init_database.py# 6. 验证安装
python3 test_example.py
Windows 环境
# 1. 创建虚拟环境
python -m venv venv
venv\Scripts\activate# 2. 升级pip
pip install --upgrade pip# 3. 安装依赖
pip install -r requirements.txt# 4. 配置环境变量
copy .env.example .env
# 使用记事本编辑.env文件# 5. 初始化数据库(可选)
python init_database.py# 6. 验证安装
python test_example.py
数据库配置(可选)
如果需要使用数据库功能:
# 1. 启动MySQL服务
# Mac: brew services start mysql
# Windows: net start mysql
# Linux: sudo systemctl start mysql# 2. 创建数据库
mysql -u root -p
CREATE DATABASE api_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 3. 配置.env文件
DATABASE_ENABLED=true
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=api_test# 4. 初始化数据库
python3 init_database.py
验证安装
运行验证脚本确保所有组件正常工作:
python3 test_example.py
预期输出:
============================================================
接口自动化测试项目 - 功能验证
============================================================
🔍 测试模块导入...✅ config.config✅ utils.logger✅ utils.api_client✅ utils.database_helper✅ 所有模块导入成功⚙️ 测试配置...✅ 配置验证通过🌐 测试API客户端...✅ API客户端连接正常🗄️ 测试数据库连接...✅ 数据库连接正常🔐 测试认证API...✅ 认证API正常============================================================
测试结果总结
============================================================
总测试数: 6
通过数: 6
失败数: 0
通过率: 100.0%🎉 所有测试通过!项目配置正确,可以开始使用。
🎮 使用方法
快速开始
# 运行冒烟测试(推荐首次使用)
python3 run_tests.py --suite smoke# 查看帮助信息
python3 run_tests.py --help
基础测试执行
1. 按测试套件执行
# 执行所有测试
python3 run_tests.py# 执行冒烟测试(核心功能验证)
python3 run_tests.py --suite smoke# 执行回归测试(全面功能验证)
python3 run_tests.py --suite regression# 执行认证相关测试
python3 run_tests.py --suite auth# 执行预订管理测试
python3 run_tests.py --suite booking
2. 按环境执行
# 在生产环境执行测试
python3 run_tests.py --env production# 在测试环境执行测试
python3 run_tests.py --env staging
3. 并发执行
# 使用4个进程并发执行
python3 run_tests.py --parallel 4# 自动检测CPU核心数并发执行
python3 run_tests.py --parallel auto
4. 报告生成
# 生成HTML报告
python3 run_tests.py --report html# 生成Allure报告
python3 run_tests.py --report allure# 生成所有类型报告
python3 run_tests.py --report both
5. 高级选项
# 详细输出模式
python3 run_tests.py --verbose# 禁用数据库功能
python3 run_tests.py --no-db# 清理旧的测试结果
python3 run_tests.py --clean# 组合使用
python3 run_tests.py --suite regression --parallel 4 --verbose --report both
使用pytest直接执行
# 基础执行
pytest# 按标记执行
pytest -m smoke # 冒烟测试
pytest -m regression # 回归测试
pytest -m "auth or booking" # 认证或预订测试
pytest -m "smoke and not slow" # 冒烟测试但排除慢速测试# 按文件执行
pytest testcases/test_auth.py # 执行认证测试文件
pytest testcases/test_booking.py # 执行预订测试文件# 按测试方法执行
pytest testcases/test_auth.py::TestAuth::test_auth_with_valid_credentials# 并发执行
pytest -n 4 # 4进程并发
pytest -n auto # 自动检测进程数# 生成报告
pytest --html=reports/report.html --self-contained-html
pytest --alluredir=reports/allure-results# 详细输出
pytest -v # 详细模式
pytest -s # 显示print输出
pytest -vv # 更详细模式# 失败重试
pytest --maxfail=1 # 第一个失败后停止
pytest --tb=short # 简短的错误信息
数据管理
1. 数据库操作
# 初始化数据库
python3 init_database.py# 查看数据库状态
python3 -c "
from utils.database_helper import DatabaseHelper
from config.config import Config
from utils.logger import setup_loggerlogger = setup_logger()
db = DatabaseHelper(Config, logger)
print('数据库连接正常')
"
2. 测试数据生成
# 生成测试数据
python3 generate_test_data.py# 查看生成的数据
cat data/test_data.json
3. 日志查看
# 查看最新日志
tail -f logs/api_test.log# 查看错误日志
tail -f logs/api_test_error.log# 搜索特定内容
grep "ERROR" logs/api_test.log
grep "test_auth" logs/api_test.log
报告查看
1. HTML报告
# 生成并打开HTML报告
python3 run_tests.py --report html
open reports/report.html # Mac
start reports/report.html # Windows
xdg-open reports/report.html # Linux
2. Allure报告
# 生成Allure数据
python3 run_tests.py --report allure# 启动Allure服务查看报告
allure serve reports/allure-results# 生成静态Allure报告
allure generate reports/allure-results -o reports/allure-report --clean
3. 自定义报告
# 生成自定义报告(需要数据库)
python3 -c "
from utils.report_generator import ReportGenerator
from utils.database_helper import DatabaseHelper
from config.config import Config
from utils.logger import setup_loggerlogger = setup_logger()
db = DatabaseHelper(Config, logger)
generator = ReportGenerator(db)
generator.generate_html_report('reports/custom_report.html')
print('自定义报告生成完成')
"# 查看自定义报告
open reports/custom_report.html
调试和故障排除
1. 调试模式
# 启用调试日志
export LOG_LEVEL=DEBUG
python3 run_tests.py --suite smoke --verbose# 单步调试特定测试
pytest testcases/test_auth.py::TestAuth::test_auth_with_valid_credentials -s -vv
2. 网络问题排查
# 测试网络连接
curl -I https://restful-booker.herokuapp.com/ping# 测试API可用性
python3 -c "
import requests
response = requests.get('https://restful-booker.herokuapp.com/ping')
print(f'状态码: {response.status_code}')
print(f'响应: {response.text}')
"
3. 数据库问题排查
# 测试数据库连接
mysql -h localhost -u root -p -e "SELECT 1"# 检查数据库配置
python3 -c "
from config.config import Config
print(f'数据库主机: {Config.DB_HOST}')
print(f'数据库端口: {Config.DB_PORT}')
print(f'数据库名称: {Config.DB_NAME}')
print(f'数据库启用: {Config.DATABASE_ENABLED}')
"
📝 测试用例说明
测试用例概览
测试模块 | 用例数量 | 覆盖功能 | 执行时间 |
---|---|---|---|
认证测试 | 5个 | 用户认证、权限验证 | ~10秒 |
预订管理 | 16个 | CRUD操作、异常处理 | ~30秒 |
总计 | 21个 | 完整业务流程 | ~40秒 |
认证测试用例详情
1. test_auth_with_valid_credentials
- 测试目的: 验证有效凭据能够成功获取认证token
- 测试步骤:
- 准备有效的用户名和密码
- 发送POST请求到/auth接口
- 验证响应状态码为200
- 验证响应中包含token字段
- 验证token不为空且长度大于0
- 预期结果: 成功获取有效的认证token
- 标记:
@pytest.mark.smoke
,@pytest.mark.auth
2. test_auth_with_invalid_credentials
- 测试目的: 验证无效凭据无法获取认证token
- 测试步骤:
- 准备无效的用户名和密码
- 发送POST请求到/auth接口
- 验证响应状态码为200
- 验证响应中包含reason字段
- 验证reason字段值为"Bad credentials"
- 预期结果: 返回认证失败的错误信息
- 标记:
@pytest.mark.regression
,@pytest.mark.auth
3. test_auth_with_empty_credentials
- 测试目的: 验证空凭据的处理
- 测试数据: 用户名和密码均为空字符串
- 预期结果: 返回认证失败信息
4. test_auth_with_missing_username
- 测试目的: 验证缺少用户名字段的处理
- 测试数据: 只提供密码,不提供用户名
- 预期结果: 返回认证失败信息
5. test_auth_with_missing_password
- 测试目的: 验证缺少密码字段的处理
- 测试数据: 只提供用户名,不提供密码
- 预期结果: 返回认证失败信息
预订管理测试用例详情
基础功能测试
1. test_ping_health_check
- 测试目的: 验证系统健康状态
- 测试步骤:
- 发送GET请求到/ping接口
- 验证响应状态码为201
- 验证响应内容为"Created"
- 预期结果: 系统正常运行
- 标记:
@pytest.mark.smoke
,@pytest.mark.booking
2. test_get_booking_list
- 测试目的: 验证获取预订列表功能
- 测试步骤:
- 发送GET请求到/booking接口
- 验证响应状态码为200
- 验证响应为数组格式
- 验证数组元素包含bookingid字段
- 预期结果: 成功获取预订ID列表
- 标记:
@pytest.mark.smoke
,@pytest.mark.booking
3. test_create_booking
- 测试目的: 验证创建新预订功能
- 测试数据:
{"firstname": "John","lastname": "Doe","totalprice": 100,"depositpaid": true,"bookingdates": {"checkin": "2024-01-01","checkout": "2024-01-02"},"additionalneeds": "Breakfast"
}
- 测试步骤:
- 准备有效的预订数据
- 发送POST请求到/booking接口
- 验证响应状态码为200
- 验证响应包含bookingid和booking字段
- 验证返回的预订信息与发送的数据一致
- 预期结果: 成功创建预订并返回预订信息
- 标记:
@pytest.mark.smoke
,@pytest.mark.booking
查询功能测试
4. test_get_booking_by_id
- 测试目的: 验证根据ID获取预订详情
- 测试步骤:
- 先获取一个有效的预订ID
- 发送GET请求到/booking/{id}接口
- 验证响应状态码为200
- 验证响应包含必要字段
- 验证bookingdates字段结构
- 预期结果: 成功获取预订详细信息
- 标记:
@pytest.mark.regression
,@pytest.mark.booking
5. test_get_nonexistent_booking
- 测试目的: 验证获取不存在预订的处理
- 测试数据: 使用不存在的预订ID (999999)
- 测试步骤:
- 发送GET请求到/booking/999999接口
- 验证响应状态码为404
- 预期结果: 返回404未找到错误
- 标记:
@pytest.mark.regression
,@pytest.mark.booking
更新功能测试
6. test_update_booking
- 测试目的: 验证完整更新预订功能
- 前置条件: 需要有效的认证token
- 测试步骤:
- 创建一个测试预订
- 准备更新数据
- 设置认证token
- 发送PUT请求更新预订
- 验证更新后的数据
- 预期结果: 成功更新预订信息
- 标记:
@pytest.mark.regression
,@pytest.mark.booking
7. test_partial_update_booking
- 测试目的: 验证部分更新预订功能
- 测试数据: 只更新firstname和totalprice字段
- 测试步骤:
- 创建一个测试预订
- 准备部分更新数据
- 发送PATCH请求部分更新
- 验证更新的字段已改变
- 验证未更新的字段保持原值
- 预期结果: 成功部分更新预订信息
- 标记:
@pytest.mark.regression
,@pytest.mark.booking
删除功能测试
8. test_delete_booking
- 测试目的: 验证删除预订功能
- 前置条件: 需要有效的认证token
- 测试步骤:
- 创建一个测试预订
- 设置认证token
- 发送DELETE请求删除预订
- 验证响应状态码为201
- 验证预订已被删除(GET请求返回404)
- 预期结果: 成功删除预订
- 标记:
@pytest.mark.regression
,@pytest.mark.booking
异常处理测试
9. test_create_booking_with_invalid_data
- 测试目的: 验证无效数据的处理
- 测试数据: 包含空字段、负数价格、无效日期等
- 预期结果: 系统能够正确处理无效数据
10. test_update_nonexistent_booking
- 测试目的: 验证更新不存在预订的处理
- 测试数据: 使用不存在的预订ID
- 预期结果: 返回适当的错误响应
测试数据设计
1. 有效数据
{"valid_booking_data": {"firstname": "John","lastname": "Doe","totalprice": 100,"depositpaid": true,"bookingdates": {"checkin": "2024-01-01","checkout": "2024-01-02"},"additionalneeds": "Breakfast"}
}
2. 无效数据
{"invalid_booking_data": {"firstname": "","lastname": "","totalprice": -1,"depositpaid": "invalid","bookingdates": {"checkin": "invalid-date","checkout": "invalid-date"}}
}
3. 边界数据
- 最大长度字符串
- 最小/最大数值
- 特殊字符
- Unicode字符
测试执行策略
1. 冒烟测试策略
- 目标: 验证核心功能正常
- 用例: 4个核心用例
- 执行频率: 每次代码提交后
- 执行时间: < 15秒
2. 回归测试策略
- 目标: 全面功能验证
- 用例: 所有21个用例
- 执行频率: 每日定时执行
- 执行时间: < 60秒
3. 并发测试策略
- 目标: 验证系统并发处理能力
- 方式: 多进程并行执行
- 配置: 2-4个进程
- 监控: 响应时间、成功率
🎯 预期结果
测试执行预期结果
1. 冒烟测试预期结果
# 执行命令
python3 run_tests.py --suite smoke --verbose# 预期输出
============================================================
接口自动化测试执行脚本
============================================================
执行时间: 2025-06-29 09:45:37
测试套件: smoke
测试环境: production
并发进程: 1
报告类型: both
详细模式: 是
数据库功能: 启用
==============================================================================================================
接口自动化测试开始执行
开始时间: 2025-06-29 09:45:38
===================================================== test session starts ===
collected 21 items / 17 deselected / 4 selectedtestcases/test_auth.py::TestAuth::test_auth_with_valid_credentials PASSED [ 25%]
testcases/test_booking.py::TestBooking::test_ping_health_check PASSED [ 50%]
testcases/test_booking.py::TestBooking::test_get_booking_list PASSED [ 75%]
testcases/test_booking.py::TestBooking::test_create_booking PASSED [100%]==================================================
接口自动化测试执行完成
结束时间: 2025-06-29 09:45:42
退出状态: 0
==============================================================================================================
测试执行总结
============================================================
✅ 测试执行成功
退出代码: 0
结束时间: 2025-06-29 09:45:42报告位置:HTML报告: reports/report.htmlAllure报告: reports/allure-results自定义报告: reports/custom_report.html
============================================================
2. 回归测试预期结果
# 执行命令
python3 run_tests.py --suite regression# 预期统计
总用例数: 17个
通过用例: 15-17个
失败用例: 0-2个
跳过用例: 0个
执行时间: 30-60秒
通过率: 85-100%
3. 并发测试预期结果
# 执行命令
python3 run_tests.py --parallel 4# 预期性能
执行时间: 减少50-70%
资源占用: CPU使用率提升
稳定性: 无并发冲突
成功率: 与串行执行一致
API响应预期结果
1. 认证接口预期响应
成功认证响应:
{"token": "abc123def456ghi789"
}
失败认证响应:
{"reason": "Bad credentials"
}
2. 预订接口预期响应
获取预订列表:
[{"bookingid": 1},{"bookingid": 2},{"bookingid": 3}
]
创建预订成功:
{"bookingid": 123,"booking": {"firstname": "John","lastname": "Doe","totalprice": 100,"depositpaid": true,"bookingdates": {"checkin": "2024-01-01","checkout": "2024-01-02"},"additionalneeds": "Breakfast"}
}
获取预订详情:
{"firstname": "John","lastname": "Doe","totalprice": 100,"depositpaid": true,"bookingdates": {"checkin": "2024-01-01","checkout": "2024-01-02"},"additionalneeds": "Breakfast"
}
3. 错误响应预期结果
404 未找到:
状态码: 404
响应体: Not Found
405 方法不允许:
状态码: 405
响应体: Method Not Allowed
性能指标预期结果
1. 响应时间指标
接口类型 | 平均响应时间 | 95%响应时间 | 最大响应时间 |
---|---|---|---|
认证接口 | < 2秒 | < 3秒 | < 5秒 |
查询接口 | < 1.5秒 | < 2.5秒 | < 4秒 |
创建接口 | < 2秒 | < 3秒 | < 5秒 |
更新接口 | < 2秒 | < 3秒 | < 5秒 |
删除接口 | < 1.5秒 | < 2.5秒 | < 4秒 |
2. 成功率指标
测试类型 | 目标成功率 | 实际成功率 | 说明 |
---|---|---|---|
冒烟测试 | 100% | 100% | 核心功能必须全部通过 |
回归测试 | ≥95% | 95-100% | 允许少量非核心功能失败 |
并发测试 | ≥90% | 90-100% | 考虑网络波动影响 |
压力测试 | ≥85% | 85-95% | 高负载下的表现 |
3. 资源使用指标
资源类型 | 预期使用量 | 实际使用量 | 优化建议 |
---|---|---|---|
内存 | < 100MB | 50-80MB | 正常范围 |
CPU | < 50% | 20-40% | 正常范围 |
网络 | < 10MB | 5-8MB | 正常范围 |
磁盘 | < 50MB | 20-30MB | 日志和报告 |
数据库预期结果
1. 表结构验证
-- 测试结果表
DESCRIBE test_results;
+---------------+------------------------------------------+------+-----+-------------------+
| Field | Type | Null | Key | Default |
+---------------+------------------------------------------+------+-----+-------------------+
| id | int(11) | NO | PRI | NULL |
| test_name | varchar(255) | NO | | NULL |
| test_class | varchar(255) | NO | | NULL |
| test_method | varchar(255) | NO | | NULL |
| test_status | enum('PASS','FAIL','SKIP','ERROR') | NO | | NULL |
| test_duration | decimal(10,3) | YES | | 0.000 |
| error_message | text | YES | | NULL |
| test_data | json | YES | | NULL |
| created_time | timestamp | NO | | CURRENT_TIMESTAMP |
| updated_time | timestamp | NO | | CURRENT_TIMESTAMP |
+---------------+------------------------------------------+------+-----+-------------------+
2. 数据插入验证
-- 查看测试结果数据
SELECT test_name, test_status, test_duration
FROM test_results
ORDER BY created_time DESC
LIMIT 5;-- 预期结果
+----------------------------------+-------------+---------------+
| test_name | test_status | test_duration |
+----------------------------------+-------------+---------------+
| test_auth_with_valid_credentials | PASS | 2.156 |
| test_ping_health_check | PASS | 1.234 |
| test_get_booking_list | PASS | 1.567 |
| test_create_booking | PASS | 2.345 |
+----------------------------------+-------------+---------------+
3. API日志验证
-- 查看API调用日志
SELECT request_method, request_url, response_status_code, response_time
FROM api_logs
ORDER BY created_time DESC
LIMIT 5;-- 预期结果
+----------------+------------------------------------------+----------------------+---------------+
| request_method | request_url | response_status_code | response_time |
+----------------+------------------------------------------+----------------------+---------------+
| POST | /auth | 200 | 1.534 |
| GET | /ping | 201 | 1.522 |
| GET | /booking | 200 | 1.234 |
| POST | /booking | 200 | 2.156 |
+----------------+------------------------------------------+----------------------+---------------+
报告预期结果
1. HTML报告内容
报告概览:
- 测试总数: 21个
- 通过数: 19-21个
- 失败数: 0-2个
- 跳过数: 0个
- 执行时间: 30-60秒
- 通过率: 90-100%
详细信息:
- 每个测试用例的执行状态
- 失败用例的错误信息
- 执行时间统计
- 环境信息
2. Allure报告内容
Overview页面:
- 测试执行趋势图
- 测试结果分布饼图
- 执行时间统计
- 环境信息
Suites页面:
- 按测试套件分组
- 每个套件的执行结果
- 测试用例详情
Graphs页面:
- 测试结果趋势
- 执行时间分布
- 失败原因分析
3. 自定义报告内容
测试统计:
总测试数: 21
通过: 20 (95.2%)
失败: 1 (4.8%)
跳过: 0 (0%)
错误: 0 (0%)
总执行时间: 45.67秒
平均执行时间: 2.17秒
API调用统计:
总API调用: 45次
成功调用: 44次 (97.8%)
失败调用: 1次 (2.2%)
平均响应时间: 1.65秒
日志预期结果
1. 应用日志示例
2025-06-29 09:45:23 | INFO | 开始执行测试: test_auth_with_valid_credentials
2025-06-29 09:45:23 | INFO | 步骤: 准备有效的认证数据
2025-06-29 09:45:23 | INFO | 发送API请求: POST https://restful-booker.herokuapp.com/auth
2025-06-29 09:45:25 | INFO | 收到API响应: 状态码200, 响应时间1.534秒
2025-06-29 09:45:25 | INFO | ✓ 断言通过: 状态码验证通过
2025-06-29 09:45:25 | INFO | ✓ 断言通过: token字段验证通过
2025-06-29 09:45:25 | INFO | 测试执行完成: test_auth_with_valid_credentials, 状态: 完成, 时长: 2.156秒
2. 错误日志示例
2025-06-29 09:45:30 | ERROR | ✗ 断言失败: 状态码验证失败
2025-06-29 09:45:30 | ERROR | 期望值: 200
2025-06-29 09:45:30 | ERROR | 实际值: 500
2025-06-29 09:45:30 | ERROR | 错误: API请求失败
2025-06-29 09:45:30 | ERROR | 异常详情: ConnectionError: Failed to establish connection
异常情况预期处理
1. 网络异常
现象: 网络连接超时或失败
预期处理:
- 自动重试3次
- 记录详细错误日志
- 标记测试为失败
- 继续执行其他测试
2. 数据库异常
现象: 数据库连接失败
预期处理:
- 禁用数据库相关功能
- 测试正常执行
- 日志记录警告信息
- 跳过数据库相关验证
3. 认证失败
现象: 无法获取有效token
预期处理:
- 跳过需要认证的测试
- 记录认证失败原因
- 执行不需要认证的测试
- 在报告中标明跳过原因
4. 系统维护
现象: 被测系统返回503错误
预期处理:
- 识别系统维护状态
- 暂停测试执行
- 发送通知邮件
- 等待系统恢复后重试
📊 报告系统
报告类型概览
报告类型 | 生成工具 | 特点 | 适用场景 |
---|---|---|---|
HTML报告 | pytest-html | 简洁、快速 | 日常开发调试 |
Allure报告 | allure-pytest | 美观、交互 | 演示、分析 |
自定义报告 | 自研工具 | 定制、深度 | 管理汇报 |
JUnit报告 | pytest | 标准、兼容 | CI/CD集成 |
HTML报告详情
1. 报告生成
# 生成HTML报告
pytest --html=reports/report.html --self-contained-html# 或使用执行脚本
python3 run_tests.py --report html
2. 报告内容
概览信息:
- 测试执行时间
- 测试结果统计
- 环境信息
- 执行参数
详细结果:
- 每个测试用例的状态
- 执行时间
- 错误信息(如有)
- 测试步骤日志
示例截图:
Test Results Summary
====================
21 tests ran in 45.67 secondsResults:
✅ 20 passed
❌ 1 failed
⏭️ 0 skippedEnvironment:
Python: 3.9.7
Platform: macOS-12.6-arm64
Packages: pytest-7.4.3, requests-2.31.0
Allure报告详情
1. 报告生成
# 生成Allure数据
pytest --alluredir=reports/allure-results# 启动Allure服务
allure serve reports/allure-results# 生成静态报告
allure generate reports/allure-results -o reports/allure-report --clean
2. 报告页面
Overview页面:
- 测试执行趋势图表
- 测试结果分布饼图
- 执行环境信息
- 测试套件统计
Suites页面:
- 按测试文件分组
- 测试类和方法层级
- 执行状态和时间
- 错误信息展示
Graphs页面:
- 测试结果趋势
- 执行时间分布
- 严重程度分布
- 失败原因分类
Timeline页面:
- 测试执行时间线
- 并发执行可视化
- 资源使用情况
3. 高级功能
测试步骤记录:
import allure@allure.step("发送认证请求")
def send_auth_request(username, password):# 测试步骤实现pass@allure.attach(body, name="API响应", attachment_type=allure.attachment_type.JSON)
def attach_response(response):# 附件添加pass
测试分类标记:
@allure.feature("用户认证")
@allure.story("登录功能")
@allure.severity(allure.severity_level.CRITICAL)
def test_login():pass
自定义报告详情
1. 报告特色
- 数据库驱动: 基于数据库数据生成
- 模板定制: 使用Jinja2模板引擎
- 深度分析: 提供详细的统计分析
- 中文界面: 完全中文化的报告界面
2. 报告内容
测试概览:
<div class="summary"><div class="summary-card"><h3>21</h3><p>总测试数</p></div><div class="summary-card passed"><h3>20</h3><p>通过</p></div><div class="summary-card failed"><h3>1</h3><p>失败</p></div>
</div>
详细统计:
- 通过率: 95.24%
- 总执行时间: 45.67秒
- 平均执行时间: 2.17秒
- API调用次数: 45次
- 数据库操作: 23次
测试结果表格:
测试用例 | 状态 | 执行时间 | 错误信息 | 执行时间 |
---|---|---|---|---|
test_auth_with_valid_credentials | PASS | 2.156秒 | - | 2025-06-29 09:45:25 |
test_ping_health_check | PASS | 1.234秒 | - | 2025-06-29 09:45:26 |
3. 报告生成
# 生成自定义报告
from utils.report_generator import ReportGenerator
from utils.database_helper import DatabaseHelperdb_helper = DatabaseHelper(Config, logger)
generator = ReportGenerator(db_helper)
generator.generate_html_report('reports/custom_report.html')
JUnit报告详情
1. 用途说明
JUnit XML格式是CI/CD系统的标准格式,支持:
- Jenkins测试结果展示
- GitLab CI测试报告
- GitHub Actions集成
- 其他CI/CD平台
2. 报告生成
# 生成JUnit XML报告
pytest --junitxml=reports/junit.xml
3. 报告格式
<?xml version="1.0" encoding="utf-8"?>
<testsuites><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="21" time="45.67"><testcase classname="testcases.test_auth.TestAuth"name="test_auth_with_valid_credentials"time="2.156"/><testcase classname="testcases.test_booking.TestBooking"name="test_ping_health_check"time="1.234"/><testcase classname="testcases.test_booking.TestBooking"name="test_create_booking_with_invalid_data"time="1.567"><failure message="AssertionError: 期望状态码400,实际状态码200">测试失败详细信息...</failure></testcase></testsuite>
</testsuites>
报告对比分析
1. 功能对比
功能特性 | HTML报告 | Allure报告 | 自定义报告 | JUnit报告 |
---|---|---|---|---|
生成速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
美观程度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
交互性 | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ |
定制性 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
CI集成 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
2. 使用建议
日常开发: 使用HTML报告,快速查看测试结果
演示汇报: 使用Allure报告,美观的可视化展示
深度分析: 使用自定义报告,详细的数据分析
CI/CD集成: 使用JUnit报告,标准化集成
报告自动化
1. 自动生成脚本
#!/bin/bash
# 自动生成所有类型报告echo "开始生成测试报告..."# 执行测试并生成报告
python3 run_tests.py --report both# 生成自定义报告
python3 -c "
from utils.report_generator import ReportGenerator
from utils.database_helper import DatabaseHelper
from config.config import Config
from utils.logger import setup_loggerlogger = setup_logger()
db = DatabaseHelper(Config, logger)
generator = ReportGenerator(db)
generator.generate_html_report()
print('自定义报告生成完成')
"# 生成Allure静态报告
if command -v allure &> /dev/null; thenallure generate reports/allure-results -o reports/allure-report --cleanecho "Allure静态报告生成完成"
fiecho "所有报告生成完成!"
echo "HTML报告: reports/report.html"
echo "Allure报告: reports/allure-report/index.html"
echo "自定义报告: reports/custom_report.html"
2. 报告发布
# 报告发布到Web服务器
import shutil
import osdef publish_reports():"""发布报告到Web服务器"""# 复制报告到Web目录web_dir = "/var/www/html/test-reports"if os.path.exists("reports/report.html"):shutil.copy("reports/report.html", f"{web_dir}/latest.html")if os.path.exists("reports/allure-report"):shutil.copytree("reports/allure-report", f"{web_dir}/allure", dirs_exist_ok=True)if os.path.exists("reports/custom_report.html"):shutil.copy("reports/custom_report.html", f"{web_dir}/custom.html")print("报告发布完成")print(f"访问地址: http://your-server.com/test-reports/")---## ⚙️ 配置说明### 环境变量配置项目使用`.env`文件管理环境变量,支持灵活的配置管理。#### 1. 主要配置项```bash
# ================================
# API相关配置
# ================================
BASE_URL=https://restful-booker.herokuapp.com # 被测系统基础URL
REQUEST_TIMEOUT=30 # 请求超时时间(秒)
MAX_RETRIES=3 # 最大重试次数
REQUEST_INTERVAL=0.5 # 请求间隔时间(秒)# ================================
# 认证相关配置
# ================================
AUTH_USERNAME=admin # 认证用户名
AUTH_PASSWORD=password123 # 认证密码# ================================
# 数据库相关配置
# ================================
DATABASE_ENABLED=true # 是否启用数据库功能
DB_HOST=localhost # 数据库主机地址
DB_PORT=3306 # 数据库端口
DB_USER=root # 数据库用户名
DB_PASSWORD=chuankangkk # 数据库密码
DB_NAME=api_test # 数据库名称
DB_CHARSET=utf8mb4 # 数据库字符集# ================================
# 日志相关配置
# ================================
LOG_LEVEL=INFO # 日志级别
LOG_FILE_PATH=logs/api_test.log # 日志文件路径
LOG_MAX_SIZE=10 # 日志文件最大大小(MB)
LOG_BACKUP_COUNT=5 # 日志文件保留数量# ================================
# 测试报告相关配置
# ================================
HTML_REPORT_PATH=reports/report.html # HTML报告路径
ALLURE_RESULTS_PATH=reports/allure-results # Allure报告数据路径# ================================
# 邮件通知相关配置(可选)
# ================================
EMAIL_ENABLED=false # 是否启用邮件通知
SMTP_SERVER=smtp.qq.com # SMTP服务器地址
SMTP_PORT=587 # SMTP端口
SMTP_USERNAME= # SMTP用户名
SMTP_PASSWORD= # SMTP密码
EMAIL_RECIPIENTS= # 收件人列表(逗号分隔)
2. 配置文件优先级
- 环境变量 (最高优先级)
- .env文件
- 默认配置 (最低优先级)
# 配置加载示例
import os
from dotenv import load_dotenvload_dotenv() # 加载.env文件# 优先级:环境变量 > .env文件 > 默认值
BASE_URL = os.getenv("BASE_URL", "https://restful-booker.herokuapp.com")
3. 多环境配置
# 开发环境配置
cp .env .env.dev
# 编辑.env.dev,设置开发环境参数# 测试环境配置
cp .env .env.test
# 编辑.env.test,设置测试环境参数# 生产环境配置
cp .env .env.prod
# 编辑.env.prod,设置生产环境参数# 使用指定环境配置
export ENV=test
python3 run_tests.py # 会自动加载.env.test
pytest配置详解
1. pytest.ini配置
[tool:pytest]
# 测试文件匹配模式
python_files = test_*.py
python_classes = Test*
python_functions = test_*# 测试目录
testpaths = testcases# 命令行选项
addopts =-v # 详细输出--tb=short # 简短的错误回溯--strict-markers # 严格标记模式--html=reports/report.html # HTML报告--self-contained-html # 自包含HTML--alluredir=reports/allure-results # Allure报告数据# 标记定义
markers =smoke: 冒烟测试用例regression: 回归测试用例auth: 认证相关测试booking: 预订管理测试slow: 执行时间较长的测试用例# 日志配置
log_cli = true # 启用CLI日志
log_cli_level = INFO # CLI日志级别
log_cli_format = %(asctime)s [%(levelname)8s] %(name)s: %(message)s
log_cli_date_format = %Y-%m-%d %H:%M:%S# 过滤警告
filterwarnings =ignore::UserWarningignore::DeprecationWarning
2. conftest.py配置
# 全局fixture配置
@pytest.fixture(scope="session")
def config():"""会话级别的配置fixture"""return Config()@pytest.fixture(scope="session")
def api_client(config, logger):"""会话级别的API客户端fixture"""client = APIClient(config.BASE_URL, logger)yield clientclient.close_session()@pytest.fixture(scope="function")
def auth_token(api_client, config):"""函数级别的认证token fixture"""auth_data = {"username": config.AUTH_USERNAME,"password": config.AUTH_PASSWORD}response = api_client.post("/auth", json=auth_data)if response.status_code == 200:return response.json().get("token")return None
数据库配置详解
1. 连接配置
# 数据库连接参数
DB_CONFIG = {'host': 'localhost','port': 3306,'user': 'root','password': 'chuankangkk','database': 'api_test','charset': 'utf8mb4','autocommit': True,'cursorclass': pymysql.cursors.DictCursor
}
2. 连接池配置
# 连接池参数
POOL_CONFIG = {'pool_size': 5, # 连接池大小'max_overflow': 10, # 最大溢出连接数'pool_timeout': 30, # 获取连接超时时间'pool_recycle': 3600, # 连接回收时间
}
3. 数据库优化配置
-- MySQL配置优化
SET GLOBAL max_connections = 200;
SET GLOBAL innodb_buffer_pool_size = 128M;
SET GLOBAL query_cache_size = 32M;
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
日志配置详解
1. 日志级别说明
级别 | 数值 | 说明 | 使用场景 |
---|---|---|---|
DEBUG | 10 | 调试信息 | 开发调试 |
INFO | 20 | 一般信息 | 正常运行 |
WARNING | 30 | 警告信息 | 潜在问题 |
ERROR | 40 | 错误信息 | 错误处理 |
CRITICAL | 50 | 严重错误 | 系统故障 |
2. 日志格式配置
# 控制台日志格式
CONSOLE_FORMAT = ("<green>{time:YYYY-MM-DD HH:mm:ss}</green> | ""<level>{level: <8}</level> | ""<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | ""<level>{message}</level>"
)# 文件日志格式
FILE_FORMAT = ("{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | ""{name}:{function}:{line} | {message}"
)
3. 日志轮转配置
# 日志轮转参数
ROTATION_CONFIG = {'rotation': '10 MB', # 文件大小轮转'retention': 5, # 保留文件数量'compression': 'zip', # 压缩格式'encoding': 'utf-8', # 文件编码
}
测试数据配置
1. JSON数据结构
{"auth": {"valid_credentials": {"username": "admin","password": "password123"},"invalid_credentials": [{"username": "invalid_user","password": "invalid_password"}]},"booking": {"valid_bookings": [{"firstname": "John","lastname": "Doe","totalprice": 100,"depositpaid": true,"bookingdates": {"checkin": "2024-01-01","checkout": "2024-01-02"},"additionalneeds": "Breakfast"}]}
}
2. 数据生成配置
# Faker配置
FAKER_CONFIG = {'locales': ['zh_CN', 'en_US'], # 支持的语言'seed': 12345, # 随机种子
}# 数据生成规则
DATA_RULES = {'firstname': 'fake.first_name()','lastname': 'fake.last_name()','totalprice': 'random.randint(50, 500)','checkin': 'fake.date_between(start_date="today", end_date="+30d")','checkout': 'checkin + timedelta(days=random.randint(1, 7))'
}
🗄️ 数据库设计
数据库概览
项目使用MySQL数据库存储测试结果、API调用日志和测试数据,支持完整的测试数据管理和分析。
1. 数据库架构
表结构详细设计
1. 测试结果表 (test_results)
CREATE TABLE test_results (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',test_name VARCHAR(255) NOT NULL COMMENT '测试用例名称',test_class VARCHAR(255) NOT NULL COMMENT '测试类名',test_method VARCHAR(255) NOT NULL COMMENT '测试方法名',test_status ENUM('PASS', 'FAIL', 'SKIP', 'ERROR') NOT NULL COMMENT '测试状态',test_duration DECIMAL(10, 3) DEFAULT 0.000 COMMENT '测试执行时长(秒)',error_message TEXT COMMENT '错误信息',test_data JSON COMMENT '测试数据',created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',INDEX idx_test_name (test_name),INDEX idx_test_status (test_status),INDEX idx_created_time (created_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试结果表';
字段说明:
test_name
: 完整的测试用例名称,如 “test_auth_with_valid_credentials”test_class
: 测试类名,如 “TestAuth”test_method
: 测试方法名,如 “test_auth_with_valid_credentials”test_status
: 测试执行状态,支持通过、失败、跳过、错误四种状态test_duration
: 测试执行时长,精确到毫秒error_message
: 测试失败时的错误信息test_data
: 测试使用的数据,JSON格式存储
2. API调用日志表 (api_logs)
CREATE TABLE api_logs (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',test_case VARCHAR(255) NOT NULL COMMENT '关联的测试用例',request_method VARCHAR(10) NOT NULL COMMENT '请求方法',request_url VARCHAR(500) NOT NULL COMMENT '请求URL',request_headers JSON COMMENT '请求头',request_body TEXT COMMENT '请求体',response_status_code INT COMMENT '响应状态码',response_headers JSON COMMENT '响应头',response_body TEXT COMMENT '响应体',response_time DECIMAL(10, 3) DEFAULT 0.000 COMMENT '响应时间(秒)',created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',INDEX idx_test_case (test_case),INDEX idx_request_method (request_method),INDEX idx_response_status_code (response_status_code),INDEX idx_created_time (created_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='API调用日志表';
字段说明:
test_case
: 关联的测试用例名称,用于追踪API调用来源request_method
: HTTP请求方法,如GET、POST、PUT等request_url
: 完整的请求URLrequest_headers
: 请求头信息,JSON格式存储request_body
: 请求体内容response_status_code
: HTTP响应状态码response_headers
: 响应头信息,JSON格式存储response_body
: 响应体内容response_time
: API响应时间,精确到毫秒
3. 测试数据表 (test_data)
CREATE TABLE test_data (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',data_type VARCHAR(50) NOT NULL COMMENT '数据类型',data_name VARCHAR(100) NOT NULL COMMENT '数据名称',data_value JSON NOT NULL COMMENT '数据值',description TEXT COMMENT '数据描述',is_active BOOLEAN DEFAULT TRUE COMMENT '是否启用',created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',INDEX idx_data_type (data_type),INDEX idx_data_name (data_name),INDEX idx_is_active (is_active),UNIQUE KEY uk_type_name (data_type, data_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试数据表';
字段说明:
data_type
: 数据类型分类,如 “auth”、"booking"等data_name
: 数据名称标识,如 “valid_credentials”data_value
: 具体的数据值,JSON格式存储description
: 数据描述信息is_active
: 是否启用该数据
4. 测试环境表 (test_environments)
CREATE TABLE test_environments (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',env_name VARCHAR(50) NOT NULL UNIQUE COMMENT '环境名称',base_url VARCHAR(255) NOT NULL COMMENT '基础URL',auth_username VARCHAR(100) COMMENT '认证用户名',auth_password VARCHAR(100) COMMENT '认证密码',database_config JSON COMMENT '数据库配置',other_config JSON COMMENT '其他配置',is_active BOOLEAN DEFAULT TRUE COMMENT '是否启用',created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',INDEX idx_env_name (env_name),INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试环境配置表';
字段说明:
env_name
: 环境名称,如 “production”、“staging”base_url
: 该环境的基础URL地址auth_username
: 该环境的认证用户名auth_password
: 该环境的认证密码database_config
: 该环境的数据库配置,JSON格式other_config
: 其他配置信息,JSON格式
数据库操作示例
1. 测试结果操作
# 保存测试结果
def save_test_result(db_helper, test_name, status, duration, error_msg=None):"""保存测试结果到数据库"""db_helper.save_test_result(test_name=test_name,test_class="TestAuth",test_method="test_auth_with_valid_credentials",status=status,duration=duration,error_message=error_msg,test_data={"username": "admin", "password": "password123"})# 查询测试结果
def get_test_results(db_helper, limit=10):"""获取最近的测试结果"""return db_helper.get_test_results(limit=limit)# 统计测试结果
def get_test_statistics(db_helper):"""获取测试统计信息"""sql = """SELECTtest_status,COUNT(*) as count,AVG(test_duration) as avg_duration,MAX(test_duration) as max_duration,MIN(test_duration) as min_durationFROM test_resultsWHERE created_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)GROUP BY test_status"""return db_helper.fetch_all(sql)
2. API日志操作
# 保存API调用日志
def save_api_log(db_helper, test_case, method, url, request_data, response_data):"""保存API调用日志"""db_helper.save_api_log(test_case=test_case,method=method,url=url,request_headers=request_data.get('headers'),request_body=request_data.get('body'),status_code=response_data.get('status_code'),response_headers=response_data.get('headers'),response_body=response_data.get('body'),response_time=response_data.get('response_time'))# 查询API调用统计
def get_api_statistics(db_helper):"""获取API调用统计"""sql = """SELECTrequest_method,response_status_code,COUNT(*) as call_count,AVG(response_time) as avg_response_time,MAX(response_time) as max_response_timeFROM api_logsWHERE created_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)GROUP BY request_method, response_status_codeORDER BY call_count DESC"""return db_helper.fetch_all(sql)
3. 测试数据操作
# 获取测试数据
def get_test_data(db_helper, data_type, data_name=None):"""获取指定类型的测试数据"""return db_helper.get_test_data(data_type=data_type, data_name=data_name)# 更新测试数据
def update_test_data(db_helper, data_type, data_name, new_value):"""更新测试数据"""sql = """UPDATE test_dataSET data_value = %s, updated_time = CURRENT_TIMESTAMPWHERE data_type = %s AND data_name = %s"""db_helper.execute_sql(sql, (json.dumps(new_value), data_type, data_name))
数据库维护
1. 数据清理策略
-- 清理30天前的测试结果
DELETE FROM test_results
WHERE created_time < DATE_SUB(NOW(), INTERVAL 30 DAY);-- 清理7天前的API日志
DELETE FROM api_logs
WHERE created_time < DATE_SUB(NOW(), INTERVAL 7 DAY);-- 清理无效的测试数据
DELETE FROM test_data
WHERE is_active = FALSE AND updated_time < DATE_SUB(NOW(), INTERVAL 90 DAY);
2. 数据备份脚本
#!/bin/bash
# 数据库备份脚本BACKUP_DIR="/backup/api_test"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/api_test_$DATE.sql"# 创建备份目录
mkdir -p $BACKUP_DIR# 执行备份
mysqldump -u root -p$DB_PASSWORD \--single-transaction \--routines \--triggers \api_test > $BACKUP_FILE# 压缩备份文件
gzip $BACKUP_FILE# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -deleteecho "数据库备份完成: $BACKUP_FILE.gz"
3. 性能优化
-- 添加索引优化查询性能
CREATE INDEX idx_test_results_composite ON test_results(test_status, created_time);
CREATE INDEX idx_api_logs_composite ON api_logs(test_case, created_time);-- 分析表统计信息
ANALYZE TABLE test_results;
ANALYZE TABLE api_logs;
ANALYZE TABLE test_data;
ANALYZE TABLE test_environments;-- 优化表结构
OPTIMIZE TABLE test_results;
OPTIMIZE TABLE api_logs;
🔄 Jenkins集成
Jenkins流水线概览
项目提供完整的Jenkins流水线配置,支持自动化的测试执行、报告生成和结果通知。
1. 流水线特性
- ✅ 参数化构建: 支持测试套件、环境选择
- ✅ 多阶段执行: 环境准备、依赖安装、测试执行、报告生成
- ✅ 并行支持: 支持并发测试执行
- ✅ 报告集成: 自动生成和发布测试报告
- ✅ 邮件通知: 测试结果自动通知
- ✅ 失败处理: 完善的错误处理和恢复机制
2. 流水线架构
Jenkinsfile详解
1. 流水线参数
pipeline {agent anyparameters {choice(name: 'TEST_SUITE',choices: ['all', 'smoke', 'regression', 'auth', 'booking'],description: '选择要执行的测试套件')choice(name: 'ENVIRONMENT',choices: ['production', 'staging'],description: '选择测试环境')choice(name: 'PARALLEL_COUNT',choices: ['1', '2', '4', 'auto'],description: '并发执行进程数')booleanParam(name: 'SEND_EMAIL',defaultValue: false,description: '是否发送邮件通知')booleanParam(name: 'CLEAN_WORKSPACE',defaultValue: true,description: '是否清理工作空间')}
}
2. 环境变量配置
environment {PYTHON_VERSION = '3.8'PROJECT_NAME = 'api-automation-test'REPORT_DIR = 'reports'ALLURE_RESULTS = 'reports/allure-results'VENV_PATH = 'venv'// 动态设置环境变量BASE_URL = "${params.ENVIRONMENT == 'staging' ? 'https://restful-booker-staging.herokuapp.com' : 'https://restful-booker.herokuapp.com'}"
}
3. 主要阶段详解
环境准备阶段:
stage('环境准备') {steps {script {echo "开始环境准备..."// 清理工作空间if (params.CLEAN_WORKSPACE) {cleanWs()}// 检出代码checkout scm// 显示构建信息echo "构建参数:"echo " 测试套件: ${params.TEST_SUITE}"echo " 测试环境: ${params.ENVIRONMENT}"echo " 并发数: ${params.PARALLEL_COUNT}"echo " 邮件通知: ${params.SEND_EMAIL}"}}
}
依赖安装阶段:
stage('依赖安装') {steps {script {echo "开始安装依赖..."// 创建虚拟环境sh """python3 -m venv ${VENV_PATH}source ${VENV_PATH}/bin/activatepip install --upgrade pippip install -r requirements.txt"""echo "依赖安装完成"}}
}
测试执行阶段:
stage('执行测试') {steps {script {echo "开始执行测试..."// 构建pytest命令def pytestArgs = ""switch(params.TEST_SUITE) {case 'smoke':pytestArgs = "-m smoke"breakcase 'regression':pytestArgs = "-m regression"breakcase 'auth':pytestArgs = "-m auth"breakcase 'booking':pytestArgs = "-m booking"breakdefault:pytestArgs = ""}// 添加并发参数if (params.PARALLEL_COUNT != '1') {pytestArgs += " -n ${params.PARALLEL_COUNT}"}// 执行测试sh """source ${VENV_PATH}/bin/activatemkdir -p ${REPORT_DIR}pytest ${pytestArgs} \--html=${REPORT_DIR}/report.html \--self-contained-html \--alluredir=${ALLURE_RESULTS} \--junitxml=${REPORT_DIR}/junit.xml \-v"""}}post {always {// 收集测试结果junit "${REPORT_DIR}/junit.xml"// 发布HTML报告publishHTML([allowMissing: false,alwaysLinkToLastBuild: true,keepAll: true,reportDir: "${REPORT_DIR}",reportFiles: 'report.html',reportName: 'HTML测试报告'])// 发布Allure报告allure([includeProperties: false,jdk: '',properties: [],reportBuildPolicy: 'ALWAYS',results: [[path: "${ALLURE_RESULTS}"]]])}}
}
Jenkins配置指南
1. Jenkins环境要求
组件 | 版本要求 | 说明 |
---|---|---|
Jenkins | 2.400+ | 支持Pipeline语法 |
Python | 3.8+ | 测试执行环境 |
Git | 2.0+ | 代码版本控制 |
Allure Plugin | 2.8+ | 报告生成插件 |
HTML Publisher | 1.25+ | HTML报告发布 |
2. 必需插件安装
# 通过Jenkins CLI安装插件
java -jar jenkins-cli.jar -s http://localhost:8080/ install-plugin \pipeline-stage-view \allure-jenkins-plugin \htmlpublisher \email-ext \build-timeout \timestamper \ws-cleanup
3. 全局工具配置
Python配置:
管理Jenkins > 全局工具配置 > Python
名称: Python3
路径: /usr/bin/python3 (或实际Python路径)
Allure配置:
管理Jenkins > 全局工具配置 > Allure Commandline
名称: Allure
安装方式: 自动安装
版本: 2.20.1
4. 项目配置步骤
创建Pipeline项目:
- 新建任务 → Pipeline
- 项目名称: api-automation-test
- 描述: 接口自动化测试项目
配置源码管理:
源码管理: Git
Repository URL: https://github.com/your-repo/api-automation-test.git
Credentials: 添加Git凭据
Branch: */main
配置构建触发器:
✅ GitHub hook trigger for GITScm polling
✅ Poll SCM: H/5 * * * * (每5分钟检查一次)
✅ Build periodically: H 2 * * * (每天凌晨2点执行)
Pipeline配置:
Definition: Pipeline script from SCM
SCM: Git
Repository URL: (同上)
Script Path: Jenkinsfile
高级Jenkins配置
1. 多分支流水线
// Jenkinsfile.multibranch
pipeline {agent anystages {stage('分支检测') {steps {script {def branchName = env.BRANCH_NAMEecho "当前分支: ${branchName}"// 根据分支选择测试策略if (branchName == 'main') {env.TEST_SUITE = 'regression'} else if (branchName.startsWith('feature/')) {env.TEST_SUITE = 'smoke'} else {env.TEST_SUITE = 'smoke'}}}}// 其他阶段...}
}
2. 矩阵构建配置
pipeline {agent nonestages {stage('矩阵测试') {matrix {axes {axis {name 'ENVIRONMENT'values 'production', 'staging'}axis {name 'TEST_SUITE'values 'smoke', 'regression'}}stages {stage('执行测试') {agent anysteps {script {echo "执行 ${ENVIRONMENT} 环境的 ${TEST_SUITE} 测试"sh """source venv/bin/activatepython3 run_tests.py --env ${ENVIRONMENT} --suite ${TEST_SUITE}"""}}}}}}}
}
3. 邮件通知配置
post {always {script {if (params.SEND_EMAIL) {def buildStatus = currentBuild.result ?: 'SUCCESS'def subject = "${buildStatus}: ${env.JOB_NAME} #${env.BUILD_NUMBER}"def body = """<h2>测试执行${buildStatus == 'SUCCESS' ? '成功' : '失败'}</h2><table border="1"><tr><td><strong>项目</strong></td><td>${env.JOB_NAME}</td></tr><tr><td><strong>构建号</strong></td><td>${env.BUILD_NUMBER}</td></tr><tr><td><strong>测试套件</strong></td><td>${params.TEST_SUITE}</td></tr><tr><td><strong>测试环境</strong></td><td>${params.ENVIRONMENT}</td></tr><tr><td><strong>构建时间</strong></td><td>${new Date()}</td></tr><tr><td><strong>执行时长</strong></td><td>${currentBuild.durationString}</td></tr></table><h3>快速链接</h3><ul><li><a href="${env.BUILD_URL}">构建详情</a></li><li><a href="${env.BUILD_URL}HTML_20测试报告/">HTML报告</a></li><li><a href="${env.BUILD_URL}allure/">Allure报告</a></li></ul>"""emailext (subject: subject,body: body,mimeType: 'text/html',to: '${DEFAULT_RECIPIENTS}',attachLog: buildStatus != 'SUCCESS')}}}
}
性能优化建议
1. 构建性能优化
// 设置构建超时
options {timeout(time: 30, unit: 'MINUTES')timestamps()buildDiscarder(logRotator(numToKeepStr: '10'))
}// 并行执行阶段
parallel {stage('单元测试') {steps {sh 'python3 -m pytest tests/unit/'}}stage('集成测试') {steps {sh 'python3 -m pytest tests/integration/'}}
}
2. 缓存优化
// 缓存Python依赖
stage('缓存依赖') {steps {script {def cacheKey = sh(script: "md5sum requirements.txt | cut -d' ' -f1",returnStdout: true).trim()if (fileExists("cache/venv-${cacheKey}")) {echo "使用缓存的虚拟环境"sh "cp -r cache/venv-${cacheKey} venv"} else {echo "创建新的虚拟环境"sh """python3 -m venv venvsource venv/bin/activatepip install -r requirements.txtmkdir -p cachecp -r venv cache/venv-${cacheKey}"""}}}
}
3. 资源管理
// 资源限制
agent {label 'test-agent'customWorkspace '/opt/jenkins/workspace/api-test'
}// 清理策略
post {cleanup {script {// 清理大文件sh 'find . -name "*.log" -size +10M -delete'sh 'find . -name "*.tmp" -delete'// 清理虚拟环境sh 'rm -rf venv'}}
}---## ❓ 常见问题### 安装和配置问题#### Q1: Python版本兼容性问题
**问题**: 提示Python版本过低或不兼容
**解决方案**:
```bash
# 检查Python版本
python3 --version# 如果版本低于3.8,需要升级Python
# macOS
brew install python@3.9# Ubuntu
sudo apt update
sudo apt install python3.9# Windows
# 从官网下载Python 3.9+安装包
Q2: 依赖包安装失败
问题: pip install失败或包冲突
解决方案:
# 升级pip
pip install --upgrade pip# 使用虚拟环境
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windows# 清理缓存重新安装
pip cache purge
pip install -r requirements.txt# 如果仍有问题,尝试指定源
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
Q3: 数据库连接失败
问题: 无法连接到MySQL数据库
解决方案:
# 检查MySQL服务状态
# macOS
brew services list | grep mysql# Linux
sudo systemctl status mysql# Windows
net start mysql# 检查连接参数
mysql -h localhost -u root -p# 创建数据库
CREATE DATABASE api_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 检查用户权限
GRANT ALL PRIVILEGES ON api_test.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
测试执行问题
Q4: 测试用例执行失败
问题: 测试用例运行时出现各种错误
解决方案:
# 检查网络连接
curl -I https://restful-booker.herokuapp.com/ping# 检查API可用性
python3 -c "
import requests
try:response = requests.get('https://restful-booker.herokuapp.com/ping', timeout=10)print(f'API状态: {response.status_code}')
except Exception as e:print(f'API连接失败: {e}')
"# 运行单个测试用例调试
pytest testcases/test_auth.py::TestAuth::test_auth_with_valid_credentials -v -s# 查看详细日志
tail -f logs/api_test.log
Q5: 并发测试不稳定
问题: 并发执行时出现随机失败
解决方案:
# 减少并发数
python3 run_tests.py --parallel 2# 增加请求间隔
# 在.env文件中设置
REQUEST_INTERVAL=1.0# 增加超时时间
REQUEST_TIMEOUT=60# 检查系统资源
top
free -h
Q6: 认证token获取失败
问题: 无法获取有效的认证token
解决方案:
# 手动测试认证接口
curl -X POST https://restful-booker.herokuapp.com/auth \-H "Content-Type: application/json" \-d '{"username": "admin", "password": "password123"}'# 检查认证配置
python3 -c "
from config.config import Config
print(f'用户名: {Config.AUTH_USERNAME}')
print(f'密码: {Config.AUTH_PASSWORD}')
"# 更新认证信息(如果API变更)
# 编辑.env文件
AUTH_USERNAME=new_username
AUTH_PASSWORD=new_password
报告和日志问题
Q7: 报告生成失败
问题: HTML或Allure报告无法生成
解决方案:
# 检查报告目录权限
ls -la reports/
chmod 755 reports/# 手动生成HTML报告
pytest --html=reports/manual_report.html --self-contained-html# 检查Allure安装
allure --version# 安装Allure(如果未安装)
npm install -g allure-commandline# 手动生成Allure报告
allure generate reports/allure-results -o reports/allure-report --clean
Q8: 日志文件过大
问题: 日志文件占用过多磁盘空间
解决方案:
# 检查日志文件大小
du -sh logs/# 清理旧日志
find logs/ -name "*.log" -mtime +7 -delete# 调整日志配置
# 在.env文件中设置
LOG_MAX_SIZE=5
LOG_BACKUP_COUNT=3# 手动清理日志
> logs/api_test.log
> logs/api_test_error.log
Jenkins集成问题
Q9: Jenkins构建失败
问题: Jenkins流水线执行失败
解决方案:
# 检查Jenkins节点Python环境
which python3
python3 --version# 检查工作空间权限
ls -la /var/jenkins_home/workspace/# 在Jenkins中设置环境变量
# 管理Jenkins > 系统配置 > 全局属性 > 环境变量
PATH=/usr/local/bin:/usr/bin:/bin# 检查插件安装
# 管理Jenkins > 插件管理
# 确保安装了Pipeline、HTML Publisher、Allure等插件
Q10: 邮件通知不工作
问题: Jenkins邮件通知发送失败
解决方案:
# 配置SMTP设置
# 管理Jenkins > 系统配置 > 邮件通知
SMTP服务器: smtp.qq.com
端口: 587
用户名: your-email@qq.com
密码: your-app-password# 测试邮件配置
# 在系统配置页面点击"通过发送测试邮件测试配置"# 检查防火墙设置
telnet smtp.qq.com 587
性能优化问题
Q11: 测试执行速度慢
问题: 测试执行时间过长
解决方案:
# 启用并发执行
python3 run_tests.py --parallel 4# 只运行冒烟测试
python3 run_tests.py --suite smoke# 优化网络配置
# 在.env文件中设置
REQUEST_TIMEOUT=10
MAX_RETRIES=1# 禁用数据库功能(如果不需要)
python3 run_tests.py --no-db
Q12: 内存使用过高
问题: 测试执行时内存占用过多
解决方案:
# 监控内存使用
python3 -c "
import psutil
print(f'内存使用: {psutil.virtual_memory().percent}%')
"# 减少并发数
python3 run_tests.py --parallel 2# 清理测试数据
python3 -c "
from utils.database_helper import DatabaseHelper
from config.config import Config
from utils.logger import setup_loggerlogger = setup_logger()
db = DatabaseHelper(Config, logger)
db.execute_sql('DELETE FROM api_logs WHERE created_time < DATE_SUB(NOW(), INTERVAL 1 DAY)')
print('清理完成')
"
🌟 项目亮点
技术亮点
1. 企业级架构设计
- 分层架构: 清晰的配置层、工具层、测试层分离
- 模块化设计: 高内聚、低耦合的模块组织
- 插件化扩展: 支持自定义插件和扩展
- 标准化规范: 遵循PEP8代码规范和最佳实践
2. 完善的测试框架
- 多维度测试: 支持功能测试、性能测试、并发测试
- 灵活的标记系统: 支持按标记、套件、环境执行
- 数据驱动测试: 支持JSON、数据库、Excel等数据源
- 参数化测试: 支持动态参数和测试数据生成
3. 强大的报告系统
- 多格式报告: HTML、Allure、自定义、JUnit四种报告格式
- 实时统计: 测试执行过程的实时数据统计
- 深度分析: 基于数据库的深度数据分析
- 可视化展示: 图表、趋势分析、性能指标
4. 完整的数据管理
- 数据库集成: MySQL数据库完整集成和管理
- 数据持久化: 测试结果、API日志的持久化存储
- 数据分析: 支持SQL查询和数据分析
- 数据清理: 自动化的数据清理和维护
工程亮点
1. 完善的文档体系
- 详细的中文注释: 每个函数、类都有详细的中文注释
- 完整的使用文档: README、快速开始、项目总结
- API文档: 详细的接口说明和使用示例
- 部署文档: Mac和Windows的详细部署指南
2. 丰富的工具支持
- 一键安装:
install.py
自动化环境配置 - 便捷执行:
run_tests.py
简化测试执行 - 数据管理:
init_database.py
、generate_test_data.py
- 功能验证:
test_example.py
快速验证安装
3. 完整的CI/CD支持
- Jenkins集成: 完整的Jenkinsfile配置
- 参数化构建: 支持多种构建参数和选项
- 多环境支持: 生产、测试环境的配置管理
- 自动化部署: 支持自动化的测试执行和报告发布
4. 优秀的错误处理
- 异常捕获: 完善的异常捕获和处理机制
- 错误恢复: 支持自动重试和错误恢复
- 日志记录: 详细的错误日志和调试信息
- 用户友好: 清晰的错误提示和解决建议
实用亮点
1. 开箱即用
- 零配置启动: 默认配置即可运行
- 自动环境检测: 自动检测和配置运行环境
- 智能错误处理: 自动处理常见的配置问题
- 快速验证: 提供快速验证安装的工具
2. 高度可配置
- 环境变量配置: 支持.env文件和环境变量
- 多环境支持: 支持开发、测试、生产环境
- 灵活的参数: 支持命令行参数和配置文件
- 动态配置: 支持运行时配置修改
3. 易于扩展
- 插件架构: 支持自定义插件开发
- 模板系统: 支持自定义报告模板
- 数据源扩展: 支持多种数据源集成
- 接口扩展: 易于扩展到其他API系统
4. 生产就绪
- 性能优化: 支持并发执行和性能调优
- 监控告警: 支持邮件通知和监控集成
- 数据备份: 支持数据库备份和恢复
- 安全考虑: 支持敏感信息加密和权限控制
学习价值
1. 技术栈覆盖
- Python生态: pytest、requests、loguru等主流库
- 数据库技术: MySQL设计、优化、维护
- CI/CD实践: Jenkins流水线、自动化部署
- 测试理论: 测试设计、数据驱动、报告分析
2. 最佳实践
- 代码规范: PEP8规范、注释规范、命名规范
- 项目结构: 企业级项目的标准结构
- 测试设计: 测试用例设计、数据管理、报告生成
- 工程实践: 版本控制、文档管理、部署流程
3. 实战经验
- 问题解决: 常见问题的解决方案和经验
- 性能优化: 测试执行效率和资源优化
- 团队协作: 多人协作的工具和流程
- 项目管理: 项目规划、进度管理、质量控制
🚀 扩展指南
添加新的测试用例
1. 创建测试文件
# testcases/test_new_feature.py
import pytest
from utils.logger import test_loggerclass TestNewFeature:"""新功能测试类"""@pytest.mark.smoke@pytest.mark.new_featuredef test_new_api_endpoint(self, api_client):"""测试新的API端点"""test_logger.step("发送新API请求")response = api_client.get("/new-endpoint")test_logger.step("验证响应")assert response.status_code == 200test_logger.assertion_pass("状态码验证通过")
2. 更新配置文件
# pytest.ini
markers =new_feature: 新功能测试用例
3. 添加测试数据
// data/test_data.json
{"new_feature": {"valid_data": {"param1": "value1","param2": "value2"}}
}
扩展到其他API系统
1. 修改配置
# .env
BASE_URL=https://your-api-system.com
AUTH_USERNAME=your_username
AUTH_PASSWORD=your_password
2. 更新API客户端
# utils/api_client.py
class APIClient:def __init__(self, base_url, logger=None):# 添加新的认证方式if "your-api-system" in base_url:self.auth_type = "bearer"else:self.auth_type = "cookie"
3. 创建新的测试用例
# testcases/test_your_system.py
class TestYourSystem:"""您的系统测试类"""def test_your_api(self, api_client):"""测试您的API"""# 实现具体的测试逻辑pass
添加新的报告格式
1. 创建报告生成器
# utils/custom_report_generator.py
class CustomReportGenerator:"""自定义报告生成器"""def generate_pdf_report(self, output_path):"""生成PDF报告"""# 实现PDF报告生成逻辑passdef generate_excel_report(self, output_path):"""生成Excel报告"""# 实现Excel报告生成逻辑pass
2. 集成到执行脚本
# run_tests.py
parser.add_argument('--report-format',choices=['html', 'allure', 'pdf', 'excel'],default='html',help='选择报告格式'
)
集成其他CI/CD平台
1. GitLab CI配置
# .gitlab-ci.yml
stages:- test- reportapi_test:stage: testscript:- python3 install.py- python3 run_tests.py --suite regressionartifacts:reports:junit: reports/junit.xmlpaths:- reports/
2. GitHub Actions配置
# .github/workflows/api-test.yml
name: API自动化测试on:push:branches: [ main ]pull_request:branches: [ main ]jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: 设置Python环境uses: actions/setup-python@v2with:python-version: 3.9- name: 安装依赖run: |python -m pip install --upgrade pippip install -r requirements.txt- name: 运行测试run: python3 run_tests.py --suite smoke- name: 发布报告uses: peaceiris/actions-gh-pages@v3with:github_token: ${{ secrets.GITHUB_TOKEN }}publish_dir: ./reports
性能测试扩展
1. 添加性能测试
# testcases/test_performance.py
import time
import pytest
from concurrent.futures import ThreadPoolExecutorclass TestPerformance:"""性能测试类"""@pytest.mark.performancedef test_api_response_time(self, api_client):"""测试API响应时间"""start_time = time.time()response = api_client.get("/booking")end_time = time.time()response_time = end_time - start_timeassert response_time < 2.0, f"响应时间过长: {response_time}秒"@pytest.mark.performancedef test_concurrent_requests(self, api_client):"""测试并发请求"""def make_request():return api_client.get("/booking")with ThreadPoolExecutor(max_workers=10) as executor:futures = [executor.submit(make_request) for _ in range(50)]results = [future.result() for future in futures]success_count = sum(1 for r in results if r.status_code == 200)success_rate = success_count / len(results)assert success_rate >= 0.95, f"成功率过低: {success_rate}"
2. 性能监控
# utils/performance_monitor.py
import psutil
import timeclass PerformanceMonitor:"""性能监控器"""def __init__(self):self.start_time = Noneself.metrics = []def start_monitoring(self):"""开始监控"""self.start_time = time.time()self.metrics = []def collect_metrics(self):"""收集性能指标"""cpu_percent = psutil.cpu_percent()memory_percent = psutil.virtual_memory().percentself.metrics.append({'timestamp': time.time(),'cpu_percent': cpu_percent,'memory_percent': memory_percent})def generate_report(self):"""生成性能报告"""# 实现性能报告生成pass
项目贡献
欢迎对项目进行贡献和改进:
- Bug报告: 发现问题请及时反馈
- 功能建议: 欢迎提出新功能建议
- 代码贡献: 欢迎提交Pull Request
- 文档完善: 帮助完善项目文档
📄 版权声明
本项目遵循MIT开源协议,允许自由使用、修改和分发。
Copyright © 2025 传康kk. All rights reserved.