https://github.com/wangwenjun587-byte/Wangwenjun587.git
API自动化测试脚本
功能特性
支持HTTP/HTTPS请求
自动生成测试用例(正常场景、异常场景、边界场景)
支持多接口测试,严格按照执行顺序执行
支持压力测试(可配置并发数和并发时间)
根据JSON schema生成测试用例
支持将接口定义存为单独文件
支持在schema中添加预设的正确数据
支持嵌套JSON结构
支持接口依赖管理(自动按依赖顺序执行)
支持参数传递(从一个接口传递到另一个接口)
支持断言机制(验证接口返回是否符合预期)
支持结果分类存储(成功/失败结果分开存储)
支持变量管理(持久化存储和全局使用)
支持LLM测试用例生成(集成英伟达meta/llama3-70b-instruct模型)
安装依赖
pip install requests
目录结构
Wangwenjun587/ # 项目根目录
├── api_auto_test.py # 核心测试脚本
├── api_test_runner.py # API测试管理器
├── variable_manager.py # 变量管理器
├── execution_order.py # 执行顺序配置
├── stress_test_config.py # 压力测试配置
├── api_definitions/ # 接口定义目录
│ ├── login.py # 登录接口定义
│ ├── create_categories.py # 创建分类接口定义
│ ├── search_categories.py # 搜索分类接口定义
│ ├── create_item.py # 创建物料接口定义
│ └── create_team.py # 创建团队接口定义
├── test_results/ # 测试结果目录
├── variables.json # 变量存储文件
└── README.md # 说明文档
用法
1. 运行所有API测试(按执行顺序)
python api_test_runner.py
系统会严格按照 execution_order.py 中定义的顺序执行API,不会执行任何不在执行顺序中的API。
2. 运行指定API的压力测试
# 使用默认配置
python api_test_runner.py --stress --api-name "Login"
# 使用指定并发数和持续时间
python api_test_runner.py --stress --api-name "Login" --concurrency 20 --duration 30
# 使用预定义测试场景
python api_test_runner.py --stress --api-name "Login" --scenario medium
执行顺序配置
在 execution_order.py 文件中定义API的执行顺序:
# 定义API执行顺序
# 注意:此顺序应遵循依赖关系,确保依赖的API先执行
# 使用文件名而不是API名称,更简单
EXECUTION_ORDER = [
"login.py", # 登录接口,无依赖
"create_team.py" # 创建团队接口,依赖登录接口
]
系统会严格按照此列表中的顺序执行API,只执行列表中指定的API文件。
压力测试配置
在 stress_test_config.py 文件中配置压力测试参数:
- 基础配置:默认并发数和测试持续时间
- 性能阈值:响应时间、成功率、错误率的阈值要求
- 预定义测试场景:轻量级、中等负载、高负载、峰值负载
预定义测试场景
| 场景 | 并发数 | 持续时间(秒) | 描述 |
|---|---|---|---|
| light | 5 | 30 | 轻量级测试,适用于初步性能评估 |
| medium | 20 | 60 | 中等负载测试,适用于常规性能评估 |
| heavy | 50 | 120 | 高负载测试,适用于极限性能评估 |
| spike | 100 | 30 | 峰值负载测试,适用于测试系统稳定性 |
API定义文件
在 api_definitions 目录中创建接口定义文件,每个文件只加载第一个以 _api 结尾的函数。
示例:登录接口
# api_definitions/login.py
import time
def get_user_api():
"""获取用户信息接口"""
# 生成时间戳变量
timestamp = int(time.time())
return {
"name": "Get User",
"method": "POST",
"url": "https://c2.xinheyun.com/api/open/v3/token",
"headers": {"Content-Type": "application/json"},
"json": {
"body": {
"appKey": "29c84b4b-dc1f-4ca8-9058-138b8d85ecbb",
"appSecret": "1!p1302[19Y9o%vU"
}
},
"outputs": {
"token": "$.data.entity.accessToken" # 提取token
},
"expected": {
"status_code": 200, # 预期状态码
"contains": ["accessToken", "accessTokenExpireIn"] # 响应内容应包含的关键字
},
"schema": {
"body.appKey": {
"type": "string", # string, integer, boolean, array, object,enum(枚举)
"required": True, # 是否必填(Python布尔值)
"minLength": None, # 字符串最小长度(仅string类型)
"maxLength": None, # 字符串最大长度(仅string类型)
"minimum": None, # 数值最小值(仅integer类型)
"maximum": None, # 数值最大值(仅integer类型)
"default": None # 默认值
},
"body.appSecret": {
"type": "string", # string, integer, boolean, array, object
"required": True, # 是否必填(Python布尔值)
"minLength": None, # 字符串最小长度(仅string类型)
"maxLength": None, # 字符串最大长度(仅string类型)
"minimum": None, # 数值最小值(仅integer类型)
"maximum": None, # 数值最大值(仅integer类型)
"default": None # 默认值
}
}
}
测试结果
成功结果
成功的测试结果会存储到 test_results/success_*.json 文件中。
失败结果
失败的测试结果会存储到 test_results/failure_*.json 文件中,包含以下信息:
case_name:测试用例名称response:接口返回值,包含status_code和contentrequestId:从请求headers中获取的requestIderrors:错误信息(如果有)
变量管理
系统使用 variable_manager.py 来管理变量,变量会被持久化存储到 variables.json 文件中,全局可用。
在API定义中提取变量
在API定义的 outputs 字段中定义需要提取的变量:
"outputs": {
"token": "$.data.entity.accessToken" # 提取token
}
在API定义中引用变量
使用 ${变量名} 的格式引用变量:
"headers": {
"Authorization": "Bearer ${token}" # 使用token变量
}
注意事项
- 确保安装了requests库:
pip install requests - 执行顺序由
execution_order.py文件定义,系统会严格按照此顺序执行API - 每个API定义文件只加载第一个以
_api结尾的函数 - 依赖关系必须是无环的,否则会导致执行顺序无法确定
- 启用LLM测试用例生成需要有效的英伟达API密钥
- 压力测试时,并发数不宜设置过高,以免对目标服务器造成过大压力
- 测试结果会自动分类为成功和失败,分别存储到不同文件
- 变量会被持久化存储到
variables.json文件中,全局可用