Commit 3d6805eb 3d6805ebda4475c4fa68e849e073070c90739446 by chenjing

init commit:API自动化测试

0 parents
.git
.gitignore
__pycache__
*.py[cod]
*.so
build/
dist/
eggs/
.eggs/
lib/
.venv
venv/
ENV/
env/
.vscode
.idea
*.swp
*.swo
*~
.DS_Store
.pytest_cache/
.coverage
*.md
api_test_report_*.html
api_test_report_*.xlsx
.env
*.log
*.tmp
# Python
__pycache__/
*.py[cod]
*$py.class
.venv/
venv/
ENV/
env/
*.egg-info/
dist/
build/
# IDE
.vscode/
.idea/
*.swp
*.swo
*.iml
# Reports
api_test_report_*.html
api_test_report_*.xlsx
reports/
*.log
# OS
.DS_Store
Thumbs.db
.directory
# Excel
~$*
.~*
# Misc
.env
.env.local
nul
# 部署指南
本文档涵盖Linux服务器部署、Jenkins配置和多环境设置。
---
## 📝 多环境支持
该框架支持在**三个不同的环境**中运行:
| 环境 | DEPLOY_ENV | IP_HOST | 用途 |
|------|-----------|---------|------|
| 测试 | test | ai-test.hikoon.com | 开发测试 |
| UAT | uat | ai-uat.hikoon.com | 用户验收 |
| 生产 | prod | api.hikoon.com | 生产验证 |
### 环境选择方法
#### 本地运行
```bash
# 测试环境(默认)
export DEPLOY_ENV=test
python3 api_test.py
# UAT环境
export DEPLOY_ENV=uat
python3 api_test.py
# 生产环境
export DEPLOY_ENV=prod
python3 api_test.py
```
#### Jenkins中配置
已在Jenkinsfile中配置参数化支持,使用**Build with Parameters**选择环境。
---
## 🐳 使用 Docker(推荐)
### 快速开始
**构建镜像**
```bash
docker-compose build
```
**运行测试**
```bash
# 测试环境
docker-compose run --rm -e DEPLOY_ENV=test api-test-runner
# UAT环境
docker-compose run --rm -e DEPLOY_ENV=uat api-test-runner
# 生产环境
docker-compose run --rm -e DEPLOY_ENV=prod api-test-runner
```
详见 [DOCKER_GUIDE.md](./DOCKER_GUIDE.md)
---
## 🖥️ Linux 服务器部署(非Docker)
### 前提条件
- Python 3.8+
- pip 和 venv
- Git
### 部署步骤
#### 1️⃣ 克隆项目
```bash
git clone <repo-url> /opt/api_test
cd /opt/api_test
```
#### 2️⃣ 创建虚拟环境
```bash
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
```
#### 3️⃣ 测试运行
```bash
export DEPLOY_ENV=test
python3 api_test.py
```
#### 4️⃣ 生成报告
报告文件位于项目目录:`api_test_report_*.html`
---
## 🔗 Jenkins 配置
### 前提条件
- Jenkins 已安装
- Git 插件已启用
- Python 环境已配置
### Jenkins 任务配置
#### 1️⃣ 创建新 Pipeline 任务
1. Jenkins → New Item
2. 输入任务名称
3. 选择 Pipeline
4. 点击 OK
#### 2️⃣ 配置 Pipeline
1. **Build Triggers** → 选择 Poll SCM → `0 10 * * *`(每天10点)
2. **Pipeline** → 选择 Pipeline script from SCM
3. **SCM** → Git
4. **Repository URL**`<your-repo-url>`
5. **Branch**`*/main`
6. **Script Path**`Jenkinsfile`
7. **Save**
### 3️⃣ 参数化执行
已在 Jenkinsfile 中配置参数化支持:
```groovy
parameters {
choice(
name: 'DEPLOY_ENV',
choices: ['test', 'uat', 'prod'],
description: '选择部署环境'
)
}
```
点击 **Build with Parameters** 选择环境执行
---
## 🔧 环境变量配置
### env_config.py
定义多个环境的IP配置:
```python
IP_HOST_MAP = {
'test': 'ai-test.hikoon.com',
'uat': 'ai-uat.hikoon.com',
'prod': 'api.hikoon.com'
}
```
### 添加新环境
**1. 编辑 env_config.py**
```python
IP_HOST_MAP = {
'test': '...',
'staging': 'ai-staging.hikoon.com', # 新增
'uat': '...',
'prod': '...'
}
```
**2. 编辑 Jenkinsfile**
```groovy
parameters {
choice(
name: 'DEPLOY_ENV',
choices: ['test', 'staging', 'uat', 'prod'], # 新增
description: '选择部署环境'
)
}
```
---
## 📊 查看测试报告
### 报告位置
- HTML报告:`api_test_report_api_cases_[env]_*.html`
- Excel报告:`api_test_report_api_cases_[env]_*.xlsx`
### 报告内容
- 📈 测试统计:总数、成功、失败、耗时
- 🔍 筛选功能:按失败、响应时间筛选
- 📋 详细结果:请求参数、响应数据、错误信息
---
## 🆘 常见问题
### 依赖安装失败
```bash
# 使用国内镜像
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
```
### Python 版本不对
```bash
# 检查版本
python3 --version
# 如需指定版本
python3.8 -m venv venv
```
### 权限不足
```bash
# 添加执行权限
chmod +x api_test.py
# 修改目录权限
sudo chown -R $USER:$USER /opt/api_test
```
### 报告未生成
```bash
# 检查 api_cases.xlsx 是否存在
ls -la api_cases.xlsx
# 运行测试查看错误
python3 api_test.py
```
---
## 📞 获取帮助
- 详细步骤 → [README.md](./README.md)
- 使用问题 → [USER_GUIDE.md](./USER_GUIDE.md)
- Docker部署 → [DOCKER_GUIDE.md](./DOCKER_GUIDE.md)
- 验证方式 → [OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md)
---
**🎉 部署完成!**
# Docker 配置指南
本文档说明如何使用Docker运行API自动化测试框架。
---
## 📋 快速开始
### 1️⃣ 构建镜像
```bash
# 使用docker-compose构建
docker-compose build
# 或使用docker构建
docker build -t api-test:latest .
```
### 2️⃣ 运行容器
**测试环境**
```bash
docker-compose run --rm -e DEPLOY_ENV=test api-test-runner
```
**UAT环境**
```bash
docker-compose run --rm -e DEPLOY_ENV=uat api-test-runner
```
**生产环境**
```bash
docker-compose run --rm -e DEPLOY_ENV=prod api-test-runner
```
### 3️⃣ 查看报告
报告文件保存在 `./reports` 目录:
```bash
ls -la reports/api_test_report_*.html
```
---
## 🐳 Docker命令
### 使用 docker-compose
```bash
# 运行指定环境的测试
DEPLOY_ENV=test docker-compose run --rm api-test-runner
# 后台运行
docker-compose up -d
# 查看日志
docker-compose logs -f api-test-runner
# 停止服务
docker-compose down
```
### 使用 docker 直接命令
```bash
# 构建镜像
docker build -t api-test:latest .
# 运行容器
docker run --rm -e DEPLOY_ENV=test api-test:latest
# 挂载卷
docker run --rm \
-e DEPLOY_ENV=test \
-v $(pwd)/reports:/app \
api-test:latest
# 交互式运行
docker run -it --rm \
-e DEPLOY_ENV=test \
-v $(pwd)/reports:/app \
api-test:latest /bin/bash
```
---
## 📂 文件说明
### Dockerfile
```dockerfile
FROM python:3.8-slim # 基础镜像
WORKDIR /app # 工作目录
COPY . /app/ # 复制项目
RUN pip install -r requirements.txt # 安装依赖
ENV DEPLOY_ENV=test # 默认环境
CMD ["python3", "api_test.py"] # 执行命令
```
### docker-compose.yml
关键配置:
- 自动环境变量传入
- 卷挂载:输入Excel、输出报告
- 资源限制:1核CPU、512MB内存
- 日志配置:json-file驱动
### .dockerignore
排除不必要文件,减小镜像体积
---
## 🔧 环境变量
### 支持的环境变量
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `DEPLOY_ENV` | 执行环境 | test |
| `IP_HOST` | 覆盖IP地址 | 不设置 |
| `PYTHONUNBUFFERED` | 禁用缓冲 | 1 |
### 设置方式
**命令行**
```bash
docker-compose run --rm -e DEPLOY_ENV=test api-test-runner
```
**.env 文件**
```
DEPLOY_ENV=test
IP_HOST=ai-test.hikoon.com
```
---
## 🔗 与 Jenkins 集成
### Jenkinsfile 中的 Docker 配置
```groovy
stage('构建镜像') {
steps {
sh 'docker build -t api-test:${BUILD_NUMBER} .'
}
}
stage('执行测试') {
steps {
sh '''
docker run --rm \
-e DEPLOY_ENV=${DEPLOY_ENV} \
-v ${WORKSPACE}/reports:/app \
api-test:${BUILD_NUMBER}
'''
}
}
post {
always {
sh 'docker rmi api-test:${BUILD_NUMBER}'
}
}
```
---
## 🐛 常见问题
### Q1: 容器报错找不到api_cases.xlsx
```bash
docker run -v $(pwd)/api_cases.xlsx:/app/api_cases.xlsx:ro api-test:latest
```
### Q2: 报告文件生成在容器内无法访问
```bash
docker run -v $(pwd)/reports:/app api-test:latest
```
### Q3: 环境变量未传入
```bash
# 正确
docker run -e DEPLOY_ENV=test api-test:latest
# 错误
docker run api-test:latest -e DEPLOY_ENV=test
```
### Q4: 镜像体积过大
使用 `.dockerignore` 排除不必要文件
---
## 📞 获取帮助
- Docker官方文档:https://docs.docker.com/
- docker-compose:https://docs.docker.com/compose/
- Jenkins Docker:https://www.jenkins.io/doc/book/installing/docker/
---
**🎉 Docker配置完成!**
FROM python:3.8-slim
WORKDIR /app
RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/*
COPY . /app/
RUN pip install --no-cache-dir -r requirements.txt
ENV DEPLOY_ENV=test
ENV PYTHONUNBUFFERED=1
RUN mkdir -p /app/reports
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)" || exit 1
CMD ["python3", "api_test.py"]
pipeline {
agent any
parameters {
choice(
name: 'DEPLOY_ENV',
choices: ['test', 'uat', 'prod'],
description: '选择部署环境'
)
}
triggers {
cron('0 10 * * *')
}
environment {
PYTHON_VERSION = '3.8'
PROJECT_NAME = 'api_test'
DEPLOY_ENV = "${params.DEPLOY_ENV ?: 'test'}"
IP_HOST_TEST = 'ai-test.hikoon.com'
IP_HOST_UAT = 'ai-uat.hikoon.com'
IP_HOST_PROD = 'api.hikoon.com'
}
stages {
stage('检出代码') {
steps {
echo "开始检出代码..."
checkout scm
}
}
stage('环境准备') {
steps {
echo "准备Python环境..."
sh '''
python3 --version
if [ ! -d "venv" ]; then
python3 -m venv venv
fi
. venv/bin/activate
pip install --upgrade pip -q
pip install -r requirements.txt -q
echo "依赖安装完成"
'''
}
}
stage('执行测试') {
steps {
echo "开始执行API自动化测试 (环境: ${DEPLOY_ENV})..."
script {
def ipHost = 'ai-test.hikoon.com'
if (env.DEPLOY_ENV == 'uat') {
ipHost = env.IP_HOST_UAT
} else if (env.DEPLOY_ENV == 'prod') {
ipHost = env.IP_HOST_PROD
} else {
ipHost = env.IP_HOST_TEST
}
env.IP_HOST = ipHost
}
sh '''
. venv/bin/activate
export DEPLOY_ENV="${DEPLOY_ENV}"
export IP_HOST="${IP_HOST}"
echo "当前执行环境: ${DEPLOY_ENV}"
echo "IP_HOST: ${IP_HOST}"
python3 api_test.py
'''
}
}
stage('生成报告') {
steps {
echo "正在生成测试报告..."
sh '''
ls -la api_test_report_* 2>/dev/null || echo "未找到报告文件"
'''
}
}
}
post {
always {
echo "清理工作目录..."
sh 'echo "测试执行完成"'
}
success {
echo "✅ [${DEPLOY_ENV}环境] 所有测试用例运行成功!"
}
failure {
echo "❌ [${DEPLOY_ENV}环境] 有测试用例执行失败!"
}
}
}
// Docker 环境下的 Jenkins Pipeline 示例
pipeline {
agent any
parameters {
choice(
name: 'DEPLOY_ENV',
choices: ['test', 'uat', 'prod'],
description: '选择部署环境'
)
}
environment {
DEPLOY_ENV = "${params.DEPLOY_ENV ?: 'test'}"
IMAGE_NAME = "api-test"
IMAGE_TAG = "${BUILD_NUMBER}"
WORKSPACE_REPORTS = "${WORKSPACE}/reports"
}
stages {
stage('检出代码') {
steps {
echo "检出代码..."
checkout scm
}
}
stage('构建镜像') {
steps {
echo "构建Docker镜像..."
script {
sh '''
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .
docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest
'''
}
}
}
stage('执行测试') {
steps {
echo "执行API自动化测试 (环境: ${DEPLOY_ENV})..."
script {
sh '''
mkdir -p ${WORKSPACE_REPORTS}
docker run --rm \
-e DEPLOY_ENV=${DEPLOY_ENV} \
-v ${WORKSPACE_REPORTS}:/app \
${IMAGE_NAME}:${IMAGE_TAG}
'''
}
}
}
stage('生成报告') {
steps {
echo "正在生成测试报告..."
script {
sh '''
ls -la ${WORKSPACE_REPORTS}/api_test_report_* 2>/dev/null || echo "未找到报告文件"
'''
}
}
}
stage('发布HTML报告') {
when {
expression {
return fileExists("${WORKSPACE_REPORTS}/api_test_report_api_cases_${DEPLOY_ENV}*.html")
}
}
steps {
echo "发布HTML测试报告..."
publishHTML([
reportDir: 'reports',
reportFiles: "api_test_report_api_cases_${DEPLOY_ENV}*.html",
reportName: "API测试报告-${DEPLOY_ENV}环境",
keepAll: true,
alwaysLinkToLastBuild: true
])
}
}
}
post {
always {
echo "清理工作环境..."
script {
sh '''
docker container prune -f
echo "========== 镜像列表 =========="
docker images | grep ${IMAGE_NAME}
'''
}
}
success {
echo "✅ [${DEPLOY_ENV}环境] 所有测试用例运行成功!"
}
failure {
echo "❌ [${DEPLOY_ENV}环境] 有测试用例执行失败!"
}
}
}
# 关系运算符使用指南
## 概述
`expected_response` 字段支持多种关系运算符,可以进行更灵活的响应验证。
---
## 支持的运算符
### 1. 比较运算符
#### `$ne` - 不等于
```json
{"code": {"$ne": 500}}
```
检查 `code` 字段不等于 500。
#### `$eq` - 等于
```json
{"count": {"$eq": 10}}
```
检查 `count` 字段等于 10。
#### `$gt` - 大于
```json
{"count": {"$gt": 0}}
```
检查 `count` 字段大于 0。
#### `$gte` - 大于等于
```json
{"score": {"$gte": 60}}
```
#### `$lt` - 小于
```json
{"timeout": {"$lt": 1000}}
```
#### `$lte` - 小于等于
```json
{"age": {"$lte": 18}}
```
### 2. 包含运算符
#### `$in` - 值在列表中
```json
{"status": {"$in": ["pending", "done", "processing"]}}
```
#### `$nin` - 值不在列表中
```json
{"type": {"$nin": ["admin", "root", "system"]}}
```
### 3. 字符串运算符
#### `$contains` - 字符串包含
```json
{"msg": {"$contains": "success"}}
```
#### `$not_contains` - 字符串不包含
```json
{"error": {"$not_contains": "timeout"}}
```
#### `$regex` - 正则表达式匹配
```json
{"email": {"$regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"}}
```
### 4. 范围运算符
#### `$range` - 范围判断 [min, max]
```json
{"value": {"$range": [0, 100]}}
```
检查 `value` 在 0 到 100 之间(包含边界)。
---
## 使用示例
### 示例1:验证状态码
```json
{
"code": {"$ne": 500},
"msg": {"$contains": "成功"}
}
```
### 示例2:验证列表数据
```json
{
"code": 0,
"data": {
"count": {"$gt": 0},
"items": ["__NOT_NULL__"],
"status": {"$in": ["active", "inactive"]}
}
}
```
### 示例3:验证分页数据
```json
{
"code": 0,
"pageIndex": {"$gte": 1},
"pageSize": {"$range": [1, 1000]},
"total": {"$gte": 0}
}
```
### 示例4:验证邮箱和年龄
```json
{
"code": 0,
"email": {"$regex": "^.*@.*$"},
"age": {"$range": [18, 100]},
"roles": {"$in": ["user", "admin"]},
"status": {"$not_contains": "banned"}
}
```
---
## Excel中的使用
`expected_response` 列中填入 JSON 格式的期望响应:
```
case_id | api_name | expected_response
1 | 测试接口 | {"code": 0, "msg": "success"}
2 | 列表接口 | {"code": 0, "data": {"count": {"$gt": 0}}}
3 | 错误处理 | {"code": {"$ne": 200}}
```
---
## 特殊值
- `"__NOT_NULL__"` - 检查字段非空
- `["__NOT_NULL__"]` - 检查数组非空
---
## 注意事项
1. **类型匹配**:比较运算符(`$gt`, `$lt` 等)要求数据类型兼容
2. **正则表达式**:使用 `$regex` 时,值会被转换为字符串后进行匹配
3. **列表范围**`$range` 只支持两元素列表 `[min, max]`,两个值都是包含的
4. **错误处理**:运算符验证失败会记录在测试报告的 `error` 字段中
---
**更多示例请查看 USER_GUIDE.md**
# 优化需求与增强建议
## 📋 概述
本文档列出了项目的优化建议和潜在增强功能,供未来版本参考。
---
## 🚀 性能优化
### 1. 并发执行用例
**当前**:单线程串行执行用例
**优化方案**
```python
from concurrent.futures import ThreadPoolExecutor
# 使用线程池并发执行
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(test_case, case) for case in cases]
results = [f.result() for f in futures]
```
**效果**:可将执行时间缩短 50-70%
### 2. 连接池复用
**当前**:每个请求创建新连接
**优化方案**
```python
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
```
**效果**:减少网络开销,提升请求速度
### 3. Excel文件缓存
**当前**:每次运行都重新加载Excel
**优化方案**
- 使用内存缓存
- 增量读取
- 支持预编译
---
## 💡 功能增强
### 1. 数据库支持
**建议**:支持从数据库读取测试用例
```python
def read_cases_from_db(connection_string):
# 从MySQL、PostgreSQL等数据库读取
pass
```
### 2. 数据驱动测试(DDT)
**建议**:支持参数化测试
```python
# 使用 @ddt 装饰器
@ddt
class TestAPI(unittest.TestCase):
@data([{"param": 1}, {"param": 2}])
def test_api(self, case):
pass
```
### 3. 测试报告增强
**建议**
- 图表展示(ECharts)
- 趋势分析
- 性能对比
- 邮件通知
- 钉钉集成
### 4. 环境管理
**建议**
- 环境变量密钥管理
- 敏感信息加密
- 配置文件版本管理
- 动态环境切换
### 5. 测试数据管理
**建议**
- 测试数据工厂
- 数据清理机制
- 数据备份恢复
- 依赖数据预置
---
## 🔒 安全增强
### 1. 敏感信息保护
**建议**
```python
# 不存储明文密码
# 使用环境变量或密钥管理系统
import os
API_TOKEN = os.getenv('API_TOKEN')
# 打印前脱敏
def mask_sensitive(data):
# 隐藏密钥、密码等
pass
```
### 2. 证书管理
**建议**
- SSL/TLS 证书管理
- 证书过期预警
- 自动续期支持
---
## 📊 可观测性增强
### 1. 日志系统
**建议**
```python
import logging
# 结构化日志
logger = logging.getLogger(__name__)
logger.info("Test case executed", extra={
"case_id": case_id,
"env": env,
"duration": duration
})
```
### 2. 链路追踪
**建议**
- 使用 OpenTelemetry
- 支持分布式追踪
- 性能监控
### 3. 指标收集
**建议**
- Prometheus metrics
- 成功率、响应时间等指标
- 长期趋势分析
---
## 📦 架构优化
### 1. 模块化设计
**建议**
```
core/
├── request/
├── validation/
├── reporting/
└── storage/
plugins/
├── slack/
├── email/
└── dingding/
```
### 2. 插件系统
**建议**
- 支持自定义验证器
- 支持自定义报告生成器
- 支持自定义通知器
### 3. REST API
**建议**
- 提供 REST API
- Web UI 管理界面
- 远程执行能力
---
## 🧪 测试框架增强
### 1. 单元测试
**建议**
- 为核心模块增加单元测试
- 达到 80% 覆盖率
### 2. 集成测试
**建议**
- Docker 容器化测试
- 多环境集成测试
- CI/CD 流水线
### 3. 性能测试
**建议**
- 压力测试支持
- 基准测试
- 性能回归检测
---
## 🔄 工作流增强
### 1. 前置条件处理
**建议**
```python
def setup_test_data():
# 创建必要的测试数据
pass
def cleanup_test_data():
# 清理测试数据
pass
```
### 2. 后置处理
**建议**
- 自动生成测试报告
- 自动发送通知
- 自动更新测试矩阵
### 3. 失败重试
**建议**
```python
@retry(max_attempts=3, backoff_factor=2)
def execute_test(case):
pass
```
---
## 📱 跨平台支持
### 1. 移动端API测试
**建议**
- 支持 Mobile API 测试
- 支持 GraphQL
### 2. 跨平台兼容性
**建议**
- Windows / Linux / macOS
- Python 3.9+
- 更新依赖库
---
## 🤖 AI/ML 集成
### 1. 智能测试生成
**建议**
- 使用 AI 自动生成测试用例
- 使用 AI 进行断言生成
### 2. 异常检测
**建议**
- 使用 ML 检测异常行为
- 自动关联异常根因
---
## 📈 优先级
| 优化项 | 优先级 | 难度 | 工作量 |
|-------|--------|------|--------|
| 并发执行 | 高 | 中 | 2-3天 |
| 连接池 | 高 | 低 | 1天 |
| 报告增强 | 中 | 低 | 3-5天 |
| 数据库支持 | 中 | 中 | 1周 |
| 插件系统 | 低 | 高 | 2周 |
| REST API | 低 | 高 | 2周 |
---
## 🎯 建议实施顺序
1. **第一阶段**:并发执行、连接池、报告增强
2. **第二阶段**:数据库支持、前置/后置处理
3. **第三阶段**:REST API、插件系统、Web UI
4. **第四阶段**:AI/ML 集成、可观测性增强
---
## 📞 反馈
如有优化建议,欢迎提交 Issue 或 Pull Request。
---
**🚀 不断优化,持续改进!**
# 🚀 API 自动化测试框架
## 📌 项目简介
一套完整的API自动化测试框架,支持**多环境执行**(test/uat/prod)、Excel驱动测试、灵活的用例筛选和详细的测试报告生成。
**核心特性**
-**多环境支持**:一套代码运行在test/uat/prod三个环境
-**Excel驱动**:用例配置在Excel中,易于维护
-**灵活筛选**:通过env_scope字段控制各环境的执行用例
-**丰富的验证**:支持多种关系运算符($gt、$contains、$regex等)
-**详细报告**:HTML和Excel双格式测试报告
-**Jenkins集成**:参数化执行,支持定时任务
-**Docker支持**:容器化部署
---
## 🎯 快速开始
### 需求
- Python 3.8+
- pip 和 venv
- 依赖库(详见requirements.txt)
### 1️⃣ 安装依赖
```bash
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate # Linux/Mac
# 或
.\venv\Scripts\activate # Windows
# 安装依赖
pip install -r requirements.txt
```
### 2️⃣ 准备测试用例
编辑 `api_cases.xlsx`,在表格中添加新列 `env_scope`,标记每个用例的执行范围:
```
env_scope 值说明:
- all 或留空 → 所有环境执行
- test → 仅测试环境执行
- uat → 仅UAT环境执行
- prod → 仅生产环境执行
- test,uat → 测试和UAT执行,生产跳过
```
### 3️⃣ 运行测试
```bash
# 测试环境
export DEPLOY_ENV=test
python3 api_test.py
# UAT环境
export DEPLOY_ENV=uat
python3 api_test.py
# 生产环境
export DEPLOY_ENV=prod
python3 api_test.py
```
### 4️⃣ 查看报告
执行完成后,生成的报告文件:
- `api_test_report_*_test_*.html` - 测试环境HTML报告
- `api_test_report_*_uat_*.html` - UAT环境HTML报告
- `api_test_report_*_prod_*.html` - 生产环境HTML报告
- `api_test_report_*.xlsx` - Excel格式报告
---
## 🐳 Docker 快速开始
### 前提条件
- Docker 已安装
- docker-compose 已安装
### 运行命令
**测试环境**
```bash
docker-compose run --rm -e DEPLOY_ENV=test api-test-runner
```
**UAT环境**
```bash
docker-compose run --rm -e DEPLOY_ENV=uat api-test-runner
```
**生产环境**
```bash
docker-compose run --rm -e DEPLOY_ENV=prod api-test-runner
```
报告文件保存在 `./reports` 目录
详细说明见 [DOCKER_GUIDE.md](./DOCKER_GUIDE.md)
---
## 📖 文档导航
| 文档 | 说明 | 适用场景 |
|------|------|---------|
| **[USER_GUIDE.md](./USER_GUIDE.md)** | 详细使用指南 | 如何使用框架、多环境配置、常见问题 |
| **[DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)** | 部署安装指南 | Linux服务器部署、Jenkins配置 |
| **[DOCKER_GUIDE.md](./DOCKER_GUIDE.md)** | Docker部署指南 | Docker容器化、docker-compose、Jenkins集成 |
| **[OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md)** | 运维指南 | 关系运算符使用 |
| **[OPTIMIZATION_REQUIREMENTS.md](./OPTIMIZATION_REQUIREMENTS.md)** | 优化需求 | 性能优化、增强建议 |
---
## 🏗️ 项目结构
```
interface_test/
├── 📄 README.md # 项目介绍(本文件)
├── 📖 USER_GUIDE.md # 使用指南
├── 🚀 DEPLOYMENT_GUIDE.md # Linux部署指南
├── 🐳 DOCKER_GUIDE.md # Docker部署指南
├── 🔧 OPERATOR_GUIDE.md # 运维指南
├── 📈 OPTIMIZATION_REQUIREMENTS.md # 优化需求
├── 💻 api_test.py # 主测试脚本
├── ⚙️ env_config.py # 环境配置(多环境IP)
├── 📊 api_cases.xlsx # 测试用例(Excel)
├── requirements.txt # Python依赖
├── 🐳 Dockerfile # Docker镜像配置
├── 📦 docker-compose.yml # Docker容器编排
├── .dockerignore # Docker忽略文件
├── Jenkinsfile # Jenkins标准配置(直接执行)
├── Jenkinsfile.docker # Jenkins Docker配置(容器中执行)
└── .venv/ # Python虚拟环境
```
---
## ✨ 核心功能
### 1️⃣ 多环境执行
**支持三个环境**
| 环境 | IP_HOST | 用途 |
|------|---------|------|
| test | ai-test.hikoon.com | 测试环境 |
| uat | ai-uat.hikoon.com | UAT验收环境 |
| prod | api.hikoon.com | 生产环境 |
**环境选择**
```bash
export DEPLOY_ENV=test # 或 uat / prod
python3 api_test.py
```
### 2️⃣ 用例筛选
通过 `env_scope` 列灵活控制用例执行范围:
```
env_scope = 'all' → 三环境都执行
env_scope = 'test,uat' → 生产环境跳过(避免危险操作)
env_scope = 'prod' → 仅生产环境执行
```
### 3️⃣ 关系运算符
`expected_response` 支持多种验证方式:
```json
{
"code": {"$ne": 500}, // 不等于
"count": {"$gt": 0}, // 大于
"status": {"$in": ["ok", "done"]}, // 在列表中
"msg": {"$contains": "success"}, // 字符串包含
"email": {"$regex": "^.*@.*$"} // 正则匹配
}
```
详见 [OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md)
### 4️⃣ 详细报告
- 📊 **统计信息**:总数、成功数、失败数、耗时
- 🔍 **筛选功能**:按失败、响应时间筛选
- 📋 **详细结果**:请求参数、期望值、实际值、错误信息
- 📈 **性能分析**:响应时间分布
- 🔖 **环境标识**:报告文件名包含运行环境
---
## 🔧 环境配置
### env_config.py
定义多个环境的IP和其他变量:
```python
import os
# 多环境IP配置
DEPLOY_ENV = os.getenv('DEPLOY_ENV', 'test')
IP_HOST_MAP = {
'test': 'ai-test.hikoon.com',
'uat': 'ai-uat.hikoon.com',
'prod': 'api.hikoon.com'
}
IP_HOST = os.getenv('IP_HOST', IP_HOST_MAP.get(DEPLOY_ENV, 'ai-test.hikoon.com'))
# 当前日期(格式:YY-MM-DD)
CURRENT_DATE = datetime.now().strftime('%y-%m-%d')
# 其他环境变量
RANDOM_EMAIL = gen_email() # 自动生成随机邮箱
```
### 自定义环境变量
```python
# env_config.py 中添加
API_TOKEN = "your-token-here"
TIMEOUT = 60
DEBUG = True
```
然后在Excel用例中使用:
```
URL: {IP_HOST}/api/users
Headers: {"Authorization": "Bearer {API_TOKEN}"}
Params: {"timestamp": "{CURRENT_DATE}"}
```
---
## 📊 Excel测试用例格式
| 字段 | 说明 | 示例 |
|------|------|------|
| case_id | 用例ID | 1 |
| api_name | 接口名称 | 用户注册 |
| is_run | 是否执行(1=跳过) | 0 |
| env_scope | 执行环围(新增) | all |
| method | 请求方法 | POST |
| ip_host / url | 基础URL | ai-test.hikoon.com |
| path | 路径 | /api/users/register |
| params | 请求参数(JSON) | {"email":"test@qq.com"} |
| headers | 请求头(JSON) | {"Content-Type":"application/json"} |
| expected_code | 期望状态码 | 200 |
| expected_response | 期望响应 | {"code":0} |
| extract_vars | 提取变量 | user_id=data.user_id |
---
## 🚀 Jenkins集成
### Build with Parameters
在Jenkins中参数化执行,选择环境:
1. 点击 **Build with Parameters**
2. 选择 **DEPLOY_ENV**: test / uat / prod
3. 点击 **Build**
### 自动环境映射
```groovy
environment {
DEPLOY_ENV = "${params.DEPLOY_ENV ?: 'test'}"
IP_HOST_TEST = 'ai-test.hikoon.com'
IP_HOST_UAT = 'ai-uat.hikoon.com'
IP_HOST_PROD = 'api.hikoon.com'
}
```
### 执行流程
```
Jenkins参数选择 → DEPLOY_ENV环境变量 → IP_HOST自动映射 → 用例执行 → 报告生成
```
详见 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)
---
## 📝 常见用例场景
### 场景1:通用接口测试(所有环境)
```
env_scope = 'all'
用例:登录、查询用户信息、获取列表等
结果:test✅ / uat✅ / prod✅
```
### 场景2:跳过生产的危险操作
```
env_scope = 'test,uat'
用例:删除数据、清理数据库、重置密码等
结果:test✅ / uat✅ / prod⏭️(跳过)
```
### 场景3:仅生产执行
```
env_scope = 'prod'
用例:导出报表、数据备份等(基于真实数据)
结果:test⏭️ / uat⏭️ / prod✅
```
---
## 🆘 常见问题
### Q: 如何新增环境?
编辑 `env_config.py``Jenkinsfile` 的IP配置。详见 [USER_GUIDE.md](./USER_GUIDE.md) 的Q&A部分
### Q: env_scope 支持哪些值?
支持:all / test / uat / prod 及其组合(用逗号分隔)。详见 [USER_GUIDE.md](./USER_GUIDE.md)
### Q: 如何禁用某个用例?
设置 `is_run = 1``env_scope` 不包含当前环境。详见 [USER_GUIDE.md](./USER_GUIDE.md)
### Q: 生产环境执行失败怎么办?
检查 `env_scope` 是否正确、IP_HOST是否可访问。详见 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)
---
## 📞 获取帮助
- **使用问题**[USER_GUIDE.md](./USER_GUIDE.md)
- **部署问题**[DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)
- **Docker问题**[DOCKER_GUIDE.md](./DOCKER_GUIDE.md)
- **验证方式**[OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md)
- **优化建议**[OPTIMIZATION_REQUIREMENTS.md](./OPTIMIZATION_REQUIREMENTS.md)
---
## 📈 最近更新
### v1.0.0 (2026-01-21)
✅ 完整框架实现
- ✅ 多环境执行支持(test/uat/prod)
- ✅ env_scope字段用于用例筛选
- ✅ 关系运算符验证($eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $contains, $regex, $range等)
- ✅ 报告文件名包含环境标识
- ✅ Docker容器化支持
- ✅ 参数化Jenkins配置
- ✅ 完整文档整合
---
## 📄 许可证
项目所有者:百音引擎项目
---
**🎉 祝你使用愉快!如有问题,请查看对应的文档或联系项目维护者。**
# 📖 用户使用指南
## 目录
- [多环境执行](#多环境执行)
- [用例管理](#用例管理)
- [响应验证](#响应验证)
- [本地运行](#本地运行)
- [Jenkins执行](#jenkins执行)
- [常见问题](#常见问题)
- [最佳实践](#最佳实践)
---
## 🌍 多环境执行
### 支持的环境
| 环境 | 标识 | IP | 用途 |
|------|------|------|------|
| **测试** | test | ai-test.hikoon.com | 开发和初始测试 |
| **UAT** | uat | ai-uat.hikoon.com | 用户验收测试 |
| **生产** | prod | api.hikoon.com | 生产环境验证 |
### 如何在不同环境运行
**设置环境变量 DEPLOY_ENV**,然后运行测试:
```bash
# 测试环境
export DEPLOY_ENV=test
python3 api_test.py
# UAT环境
export DEPLOY_ENV=uat
python3 api_test.py
# 生产环境
export DEPLOY_ENV=prod
python3 api_test.py
```
**说明**
- 默认环境为 `test`(如不设置 DEPLOY_ENV)
- IP_HOST 会根据环境从 `env_config.py` 中自动选择
- 可通过环境变量 `IP_HOST` 覆盖配置的地址
---
## 📊 用例管理
### env_scope 列说明
每个用例都有一个 `env_scope` 字段,用于控制在哪些环境中执行该用例。
#### env_scope 取值
| 值 | 含义 | 执行结果 |
|----|------|---------|
| 留空 或 `all` | 所有环境执行 | test✅ / uat✅ / prod✅ |
| `test` | 仅测试环境 | test✅ / uat⏭️ / prod⏭️ |
| `uat` | 仅UAT环境 | test⏭️ / uat✅ / prod⏭️ |
| `prod` | 仅生产环境 | test⏭️ / uat⏭️ / prod✅ |
| `test,uat` | 测试+UAT | test✅ / uat✅ / prod⏭️ |
| `test,prod` | 测试+生产 | test✅ / uat⏭️ / prod✅ |
#### 添加 env_scope 列
**首次使用**,需要在 Excel 表格中手动添加 `env_scope` 列:
1. 打开 `api_cases.xlsx`
2. 在最后一列后添加新列
3. 列头命名为:`env_scope`
4. 为所有数据行填入相应的值
5. 保存文件
#### 编辑 env_scope 值
根据用例特性设置相应的环境范围
### is_run 字段
原有的 `is_run` 字段仍然保留:
- `is_run = 0`**留空** → 执行该用例(受env_scope影响)
- `is_run = 1` → 在**所有环境**都跳过该用例
**执行优先级**`is_run = 1` → 跳过 → 检查 env_scope → 决定是否执行
---
## ✅ 响应验证
### expected_response 字段
支持多种关系运算符,提供灵活的响应验证。
#### 支持的运算符
- `$eq`: 等于
- `$ne`: 不等于
- `$gt`: 大于
- `$gte`: 大于等于
- `$lt`: 小于
- `$lte`: 小于等于
- `$in`: 值在列表中
- `$nin`: 值不在列表中
- `$contains`: 字符串包含
- `$not_contains`: 字符串不包含
- `$regex`: 正则表达式匹配
- `$range`: 范围判断 [min, max]
#### 使用示例
```json
{
"code": {"$ne": 500},
"count": {"$gt": 0},
"status": {"$in": ["ok", "done"]},
"msg": {"$contains": "success"},
"email": {"$regex": "^.*@.*$"},
"age": {"$range": [18, 100]}
}
```
---
## 🏃 本地运行
### 基础运行
```bash
# 1. 激活虚拟环境
source venv/bin/activate # Linux/Mac
# 或
.\venv\Scripts\activate # Windows
# 2. 设置环境(可选,默认test)
export DEPLOY_ENV=test
# 3. 运行测试
python3 api_test.py
```
---
## 🔗 Jenkins执行
### 参数化Build
Jenkins中已配置参数化执行,选择不同的环境:
1. 进入Jenkins Job页面
2. 点击 **Build with Parameters**
3. 选择 **DEPLOY_ENV**: test / uat / prod
4. 点击 **Build** 开始执行
---
## 🆘 常见问题
### Q1: 所有用例都被跳过了
**原因**:DEPLOY_ENV 未设置或 env_scope 不匹配
**解决**
```bash
export DEPLOY_ENV=test
python3 api_test.py
```
### Q2: 如何在生产环境禁用某些用例
设置 `env_scope = test,uat`(只在测试和UAT执行)
### Q3: 支持哪些 env_scope 值的组合
支持:all / test / uat / prod 及其组合(用逗号分隔)
### Q4: is_run 和 env_scope 的关系
`is_run=1` 时总是跳过;`is_run=0` 时检查 `env_scope`
### Q5: 如何提取变量供后续用例使用
`extract_vars` 列中定义:`user_id=data.user_id`
---
## 🎯 最佳实践
### ✅ 推荐做法
1. **明确标记env_scope**:all / test / uat / prod(避免留空)
2. **生产环境谨慎操作**:危险操作设置为 `test,uat`
3. **定期审查配置**:检查过期的env_scope设置
4. **使用关系运算符**:灵活的验证而非硬编码
### ❌ 避免做法
1. **混乱地使用 is_run 和 env_scope**
2. **在生产执行数据修改操作**
3. **忘记为新增用例设置 env_scope**
4. **大小写混乱的值**
---
**祝你使用愉快!** 🎉
No preview for this file type
This diff is collapsed. Click to expand it.
version: '3.8'
services:
api-test-runner:
build:
context: .
dockerfile: Dockerfile
container_name: api-test-${DEPLOY_ENV:-test}
environment:
- DEPLOY_ENV=${DEPLOY_ENV:-test}
- IP_HOST=${IP_HOST:-}
- PYTHONUNBUFFERED=1
volumes:
- ./api_cases.xlsx:/app/api_cases.xlsx:ro
- ./env_config.py:/app/env_config.py:ro
- ./reports:/app
networks:
- api-test-network
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
restart: no
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
api-test-network:
driver: bridge
import os
import random
import string
from datetime import datetime
# 多环境IP配置
DEPLOY_ENV = os.getenv('DEPLOY_ENV', 'test')
IP_HOST_MAP = {
'test': 'ai-test.hikoon.com',
'uat': 'ai-uat.hikoon.com',
'prod': 'api.hikoon.com'
}
IP_HOST = os.getenv('IP_HOST', IP_HOST_MAP.get(DEPLOY_ENV, 'ai-test.hikoon.com'))
# 当前日期(格式:YY-MM-DD)
CURRENT_DATE = datetime.now().strftime('%y-%m-%d')
def gen_email():
prefix = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
domain = random.choice(['@qq.com', '@163.com', '@gmail.com', '@test.com'])
return prefix + domain
RANDOM_EMAIL = gen_email()
requests==2.31.0
openpyxl==3.10.10
jsonpath-ng==1.6.0