接口自动化测试
一个完整的企业级接口自动化测试解决方案
📋 目录
🚀 项目介绍
项目背景
接口自动化测试作为现代软件开发流程的核心环节,已成为保障系统质量、提升交付效率的关键手段。本项目基于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_logger
logger = 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_logger
logger = 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 selected
testcases/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.html
Allure报告: 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 seconds
Results:
✅ 20 passed
❌ 1 failed
⏭️ 0 skipped
Environment:
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 DatabaseHelper
db_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_logger
logger = setup_logger()
db = DatabaseHelper(Config, logger)
generator = ReportGenerator(db)
generator.generate_html_report()
print('自定义报告生成完成')
"
# 生成Allure静态报告
if command -v allure &> /dev/null; then
allure generate reports/allure-results -o reports/allure-report --clean
echo "Allure静态报告生成完成"
fi
echo "所有报告生成完成!"
echo "HTML报告: reports/report.html"
echo "Allure报告: reports/allure-report/index.html"
echo "自定义报告: reports/custom_report.html"
2. 报告发布
# 报告发布到Web服务器
import shutil
import os
def 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_dotenv
load_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::UserWarning
ignore::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 client
client.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 = """
SELECT
test_status,
COUNT(*) as count,
AVG(test_duration) as avg_duration,
MAX(test_duration) as max_duration,
MIN(test_duration) as min_duration
FROM test_results
WHERE 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 = """
SELECT
request_method,
response_status_code,
COUNT(*) as call_count,
AVG(response_time) as avg_response_time,
MAX(response_time) as max_response_time
FROM api_logs
WHERE created_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY request_method, response_status_code
ORDER 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_data
SET data_value = %s, updated_time = CURRENT_TIMESTAMP
WHERE 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 -delete
echo "数据库备份完成: $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 any
parameters {
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/activate
pip install --upgrade pip
pip install -r requirements.txt
"""
echo "依赖安装完成"
}
}
}
测试执行阶段:
stage('执行测试') {
steps {
script {
echo "开始执行测试..."
// 构建pytest命令
def pytestArgs = ""
switch(params.TEST_SUITE) {
case 'smoke':
pytestArgs = "-m smoke"
break
case 'regression':
pytestArgs = "-m regression"
break
case 'auth':
pytestArgs = "-m auth"
break
case 'booking':
pytestArgs = "-m booking"
break
default:
pytestArgs = ""
}
// 添加并发参数
if (params.PARALLEL_COUNT != '1') {
pytestArgs += " -n ${params.PARALLEL_COUNT}"
}
// 执行测试
sh """
source ${VENV_PATH}/bin/activate
mkdir -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 any
stages {
stage('分支检测') {
steps {
script {
def branchName = env.BRANCH_NAME
echo "当前分支: ${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 none
stages {
stage('矩阵测试') {
matrix {
axes {
axis {
name 'ENVIRONMENT'
values 'production', 'staging'
}
axis {
name 'TEST_SUITE'
values 'smoke', 'regression'
}
}
stages {
stage('执行测试') {
agent any
steps {
script {
echo "执行 ${ENVIRONMENT} 环境的 ${TEST_SUITE} 测试"
sh """
source venv/bin/activate
python3 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 venv
source venv/bin/activate
pip install -r requirements.txt
mkdir -p cache
cp -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_logger
logger = 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_logger
class TestNewFeature:
"""新功能测试类"""
@pytest.mark.smoke
@pytest.mark.new_feature
def 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 == 200
test_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报告生成逻辑
pass
def 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
- report
api_test:
stage: test
script:
- python3 install.py
- python3 run_tests.py --suite regression
artifacts:
reports:
junit: reports/junit.xml
paths:
- reports/
2. GitHub Actions配置
# .github/workflows/api-test.yml
name: API自动化测试
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: 设置Python环境
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: 运行测试
run: python3 run_tests.py --suite smoke
- name: 发布报告
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./reports
性能测试扩展
1. 添加性能测试
# testcases/test_performance.py
import time
import pytest
from concurrent.futures import ThreadPoolExecutor
class TestPerformance:
"""性能测试类"""
@pytest.mark.performance
def 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_time
assert response_time < 2.0, f"响应时间过长: {response_time}秒"
@pytest.mark.performance
def 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 time
class PerformanceMonitor:
"""性能监控器"""
def __init__(self):
self.start_time = None
self.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().percent
self.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.