init commit:API自动化测试
0 parents
Showing
17 changed files
with
1866 additions
and
0 deletions
.dockerignore
0 → 100644
| 1 | .git | ||
| 2 | .gitignore | ||
| 3 | __pycache__ | ||
| 4 | *.py[cod] | ||
| 5 | *.so | ||
| 6 | build/ | ||
| 7 | dist/ | ||
| 8 | eggs/ | ||
| 9 | .eggs/ | ||
| 10 | lib/ | ||
| 11 | .venv | ||
| 12 | venv/ | ||
| 13 | ENV/ | ||
| 14 | env/ | ||
| 15 | .vscode | ||
| 16 | .idea | ||
| 17 | *.swp | ||
| 18 | *.swo | ||
| 19 | *~ | ||
| 20 | .DS_Store | ||
| 21 | .pytest_cache/ | ||
| 22 | .coverage | ||
| 23 | *.md | ||
| 24 | api_test_report_*.html | ||
| 25 | api_test_report_*.xlsx | ||
| 26 | .env | ||
| 27 | *.log | ||
| 28 | *.tmp |
.gitignore
0 → 100644
| 1 | # Python | ||
| 2 | __pycache__/ | ||
| 3 | *.py[cod] | ||
| 4 | *$py.class | ||
| 5 | .venv/ | ||
| 6 | venv/ | ||
| 7 | ENV/ | ||
| 8 | env/ | ||
| 9 | *.egg-info/ | ||
| 10 | dist/ | ||
| 11 | build/ | ||
| 12 | |||
| 13 | # IDE | ||
| 14 | .vscode/ | ||
| 15 | .idea/ | ||
| 16 | *.swp | ||
| 17 | *.swo | ||
| 18 | *.iml | ||
| 19 | |||
| 20 | # Reports | ||
| 21 | api_test_report_*.html | ||
| 22 | api_test_report_*.xlsx | ||
| 23 | reports/ | ||
| 24 | *.log | ||
| 25 | |||
| 26 | # OS | ||
| 27 | .DS_Store | ||
| 28 | Thumbs.db | ||
| 29 | .directory | ||
| 30 | |||
| 31 | # Excel | ||
| 32 | ~$* | ||
| 33 | .~* | ||
| 34 | |||
| 35 | # Misc | ||
| 36 | .env | ||
| 37 | .env.local | ||
| 38 | nul |
DEPLOYMENT_GUIDE.md
0 → 100644
| 1 | # 部署指南 | ||
| 2 | |||
| 3 | 本文档涵盖Linux服务器部署、Jenkins配置和多环境设置。 | ||
| 4 | |||
| 5 | --- | ||
| 6 | |||
| 7 | ## 📝 多环境支持 | ||
| 8 | |||
| 9 | 该框架支持在**三个不同的环境**中运行: | ||
| 10 | |||
| 11 | | 环境 | DEPLOY_ENV | IP_HOST | 用途 | | ||
| 12 | |------|-----------|---------|------| | ||
| 13 | | 测试 | test | ai-test.hikoon.com | 开发测试 | | ||
| 14 | | UAT | uat | ai-uat.hikoon.com | 用户验收 | | ||
| 15 | | 生产 | prod | api.hikoon.com | 生产验证 | | ||
| 16 | |||
| 17 | ### 环境选择方法 | ||
| 18 | |||
| 19 | #### 本地运行 | ||
| 20 | |||
| 21 | ```bash | ||
| 22 | # 测试环境(默认) | ||
| 23 | export DEPLOY_ENV=test | ||
| 24 | python3 api_test.py | ||
| 25 | |||
| 26 | # UAT环境 | ||
| 27 | export DEPLOY_ENV=uat | ||
| 28 | python3 api_test.py | ||
| 29 | |||
| 30 | # 生产环境 | ||
| 31 | export DEPLOY_ENV=prod | ||
| 32 | python3 api_test.py | ||
| 33 | ``` | ||
| 34 | |||
| 35 | #### Jenkins中配置 | ||
| 36 | |||
| 37 | 已在Jenkinsfile中配置参数化支持,使用**Build with Parameters**选择环境。 | ||
| 38 | |||
| 39 | --- | ||
| 40 | |||
| 41 | ## 🐳 使用 Docker(推荐) | ||
| 42 | |||
| 43 | ### 快速开始 | ||
| 44 | |||
| 45 | **构建镜像**: | ||
| 46 | ```bash | ||
| 47 | docker-compose build | ||
| 48 | ``` | ||
| 49 | |||
| 50 | **运行测试**: | ||
| 51 | ```bash | ||
| 52 | # 测试环境 | ||
| 53 | docker-compose run --rm -e DEPLOY_ENV=test api-test-runner | ||
| 54 | |||
| 55 | # UAT环境 | ||
| 56 | docker-compose run --rm -e DEPLOY_ENV=uat api-test-runner | ||
| 57 | |||
| 58 | # 生产环境 | ||
| 59 | docker-compose run --rm -e DEPLOY_ENV=prod api-test-runner | ||
| 60 | ``` | ||
| 61 | |||
| 62 | 详见 [DOCKER_GUIDE.md](./DOCKER_GUIDE.md) | ||
| 63 | |||
| 64 | --- | ||
| 65 | |||
| 66 | ## 🖥️ Linux 服务器部署(非Docker) | ||
| 67 | |||
| 68 | ### 前提条件 | ||
| 69 | |||
| 70 | - Python 3.8+ | ||
| 71 | - pip 和 venv | ||
| 72 | - Git | ||
| 73 | |||
| 74 | ### 部署步骤 | ||
| 75 | |||
| 76 | #### 1️⃣ 克隆项目 | ||
| 77 | |||
| 78 | ```bash | ||
| 79 | git clone <repo-url> /opt/api_test | ||
| 80 | cd /opt/api_test | ||
| 81 | ``` | ||
| 82 | |||
| 83 | #### 2️⃣ 创建虚拟环境 | ||
| 84 | |||
| 85 | ```bash | ||
| 86 | python3 -m venv venv | ||
| 87 | source venv/bin/activate | ||
| 88 | pip install --upgrade pip | ||
| 89 | pip install -r requirements.txt | ||
| 90 | ``` | ||
| 91 | |||
| 92 | #### 3️⃣ 测试运行 | ||
| 93 | |||
| 94 | ```bash | ||
| 95 | export DEPLOY_ENV=test | ||
| 96 | python3 api_test.py | ||
| 97 | ``` | ||
| 98 | |||
| 99 | #### 4️⃣ 生成报告 | ||
| 100 | |||
| 101 | 报告文件位于项目目录:`api_test_report_*.html` | ||
| 102 | |||
| 103 | --- | ||
| 104 | |||
| 105 | ## 🔗 Jenkins 配置 | ||
| 106 | |||
| 107 | ### 前提条件 | ||
| 108 | |||
| 109 | - Jenkins 已安装 | ||
| 110 | - Git 插件已启用 | ||
| 111 | - Python 环境已配置 | ||
| 112 | |||
| 113 | ### Jenkins 任务配置 | ||
| 114 | |||
| 115 | #### 1️⃣ 创建新 Pipeline 任务 | ||
| 116 | |||
| 117 | 1. Jenkins → New Item | ||
| 118 | 2. 输入任务名称 | ||
| 119 | 3. 选择 Pipeline | ||
| 120 | 4. 点击 OK | ||
| 121 | |||
| 122 | #### 2️⃣ 配置 Pipeline | ||
| 123 | |||
| 124 | 1. **Build Triggers** → 选择 Poll SCM → `0 10 * * *`(每天10点) | ||
| 125 | 2. **Pipeline** → 选择 Pipeline script from SCM | ||
| 126 | 3. **SCM** → Git | ||
| 127 | 4. **Repository URL** → `<your-repo-url>` | ||
| 128 | 5. **Branch** → `*/main` | ||
| 129 | 6. **Script Path** → `Jenkinsfile` | ||
| 130 | 7. **Save** | ||
| 131 | |||
| 132 | ### 3️⃣ 参数化执行 | ||
| 133 | |||
| 134 | 已在 Jenkinsfile 中配置参数化支持: | ||
| 135 | |||
| 136 | ```groovy | ||
| 137 | parameters { | ||
| 138 | choice( | ||
| 139 | name: 'DEPLOY_ENV', | ||
| 140 | choices: ['test', 'uat', 'prod'], | ||
| 141 | description: '选择部署环境' | ||
| 142 | ) | ||
| 143 | } | ||
| 144 | ``` | ||
| 145 | |||
| 146 | 点击 **Build with Parameters** 选择环境执行 | ||
| 147 | |||
| 148 | --- | ||
| 149 | |||
| 150 | ## 🔧 环境变量配置 | ||
| 151 | |||
| 152 | ### env_config.py | ||
| 153 | |||
| 154 | 定义多个环境的IP配置: | ||
| 155 | |||
| 156 | ```python | ||
| 157 | IP_HOST_MAP = { | ||
| 158 | 'test': 'ai-test.hikoon.com', | ||
| 159 | 'uat': 'ai-uat.hikoon.com', | ||
| 160 | 'prod': 'api.hikoon.com' | ||
| 161 | } | ||
| 162 | ``` | ||
| 163 | |||
| 164 | ### 添加新环境 | ||
| 165 | |||
| 166 | **1. 编辑 env_config.py**: | ||
| 167 | ```python | ||
| 168 | IP_HOST_MAP = { | ||
| 169 | 'test': '...', | ||
| 170 | 'staging': 'ai-staging.hikoon.com', # 新增 | ||
| 171 | 'uat': '...', | ||
| 172 | 'prod': '...' | ||
| 173 | } | ||
| 174 | ``` | ||
| 175 | |||
| 176 | **2. 编辑 Jenkinsfile**: | ||
| 177 | ```groovy | ||
| 178 | parameters { | ||
| 179 | choice( | ||
| 180 | name: 'DEPLOY_ENV', | ||
| 181 | choices: ['test', 'staging', 'uat', 'prod'], # 新增 | ||
| 182 | description: '选择部署环境' | ||
| 183 | ) | ||
| 184 | } | ||
| 185 | ``` | ||
| 186 | |||
| 187 | --- | ||
| 188 | |||
| 189 | ## 📊 查看测试报告 | ||
| 190 | |||
| 191 | ### 报告位置 | ||
| 192 | |||
| 193 | - HTML报告:`api_test_report_api_cases_[env]_*.html` | ||
| 194 | - Excel报告:`api_test_report_api_cases_[env]_*.xlsx` | ||
| 195 | |||
| 196 | ### 报告内容 | ||
| 197 | |||
| 198 | - 📈 测试统计:总数、成功、失败、耗时 | ||
| 199 | - 🔍 筛选功能:按失败、响应时间筛选 | ||
| 200 | - 📋 详细结果:请求参数、响应数据、错误信息 | ||
| 201 | |||
| 202 | --- | ||
| 203 | |||
| 204 | ## 🆘 常见问题 | ||
| 205 | |||
| 206 | ### 依赖安装失败 | ||
| 207 | |||
| 208 | ```bash | ||
| 209 | # 使用国内镜像 | ||
| 210 | pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ | ||
| 211 | ``` | ||
| 212 | |||
| 213 | ### Python 版本不对 | ||
| 214 | |||
| 215 | ```bash | ||
| 216 | # 检查版本 | ||
| 217 | python3 --version | ||
| 218 | |||
| 219 | # 如需指定版本 | ||
| 220 | python3.8 -m venv venv | ||
| 221 | ``` | ||
| 222 | |||
| 223 | ### 权限不足 | ||
| 224 | |||
| 225 | ```bash | ||
| 226 | # 添加执行权限 | ||
| 227 | chmod +x api_test.py | ||
| 228 | |||
| 229 | # 修改目录权限 | ||
| 230 | sudo chown -R $USER:$USER /opt/api_test | ||
| 231 | ``` | ||
| 232 | |||
| 233 | ### 报告未生成 | ||
| 234 | |||
| 235 | ```bash | ||
| 236 | # 检查 api_cases.xlsx 是否存在 | ||
| 237 | ls -la api_cases.xlsx | ||
| 238 | |||
| 239 | # 运行测试查看错误 | ||
| 240 | python3 api_test.py | ||
| 241 | ``` | ||
| 242 | |||
| 243 | --- | ||
| 244 | |||
| 245 | ## 📞 获取帮助 | ||
| 246 | |||
| 247 | - 详细步骤 → [README.md](./README.md) | ||
| 248 | - 使用问题 → [USER_GUIDE.md](./USER_GUIDE.md) | ||
| 249 | - Docker部署 → [DOCKER_GUIDE.md](./DOCKER_GUIDE.md) | ||
| 250 | - 验证方式 → [OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md) | ||
| 251 | |||
| 252 | --- | ||
| 253 | |||
| 254 | **🎉 部署完成!** |
DOCKER_GUIDE.md
0 → 100644
| 1 | # Docker 配置指南 | ||
| 2 | |||
| 3 | 本文档说明如何使用Docker运行API自动化测试框架。 | ||
| 4 | |||
| 5 | --- | ||
| 6 | |||
| 7 | ## 📋 快速开始 | ||
| 8 | |||
| 9 | ### 1️⃣ 构建镜像 | ||
| 10 | |||
| 11 | ```bash | ||
| 12 | # 使用docker-compose构建 | ||
| 13 | docker-compose build | ||
| 14 | |||
| 15 | # 或使用docker构建 | ||
| 16 | docker build -t api-test:latest . | ||
| 17 | ``` | ||
| 18 | |||
| 19 | ### 2️⃣ 运行容器 | ||
| 20 | |||
| 21 | **测试环境**: | ||
| 22 | ```bash | ||
| 23 | docker-compose run --rm -e DEPLOY_ENV=test api-test-runner | ||
| 24 | ``` | ||
| 25 | |||
| 26 | **UAT环境**: | ||
| 27 | ```bash | ||
| 28 | docker-compose run --rm -e DEPLOY_ENV=uat api-test-runner | ||
| 29 | ``` | ||
| 30 | |||
| 31 | **生产环境**: | ||
| 32 | ```bash | ||
| 33 | docker-compose run --rm -e DEPLOY_ENV=prod api-test-runner | ||
| 34 | ``` | ||
| 35 | |||
| 36 | ### 3️⃣ 查看报告 | ||
| 37 | |||
| 38 | 报告文件保存在 `./reports` 目录: | ||
| 39 | |||
| 40 | ```bash | ||
| 41 | ls -la reports/api_test_report_*.html | ||
| 42 | ``` | ||
| 43 | |||
| 44 | --- | ||
| 45 | |||
| 46 | ## 🐳 Docker命令 | ||
| 47 | |||
| 48 | ### 使用 docker-compose | ||
| 49 | |||
| 50 | ```bash | ||
| 51 | # 运行指定环境的测试 | ||
| 52 | DEPLOY_ENV=test docker-compose run --rm api-test-runner | ||
| 53 | |||
| 54 | # 后台运行 | ||
| 55 | docker-compose up -d | ||
| 56 | |||
| 57 | # 查看日志 | ||
| 58 | docker-compose logs -f api-test-runner | ||
| 59 | |||
| 60 | # 停止服务 | ||
| 61 | docker-compose down | ||
| 62 | ``` | ||
| 63 | |||
| 64 | ### 使用 docker 直接命令 | ||
| 65 | |||
| 66 | ```bash | ||
| 67 | # 构建镜像 | ||
| 68 | docker build -t api-test:latest . | ||
| 69 | |||
| 70 | # 运行容器 | ||
| 71 | docker run --rm -e DEPLOY_ENV=test api-test:latest | ||
| 72 | |||
| 73 | # 挂载卷 | ||
| 74 | docker run --rm \ | ||
| 75 | -e DEPLOY_ENV=test \ | ||
| 76 | -v $(pwd)/reports:/app \ | ||
| 77 | api-test:latest | ||
| 78 | |||
| 79 | # 交互式运行 | ||
| 80 | docker run -it --rm \ | ||
| 81 | -e DEPLOY_ENV=test \ | ||
| 82 | -v $(pwd)/reports:/app \ | ||
| 83 | api-test:latest /bin/bash | ||
| 84 | ``` | ||
| 85 | |||
| 86 | --- | ||
| 87 | |||
| 88 | ## 📂 文件说明 | ||
| 89 | |||
| 90 | ### Dockerfile | ||
| 91 | |||
| 92 | ```dockerfile | ||
| 93 | FROM python:3.8-slim # 基础镜像 | ||
| 94 | WORKDIR /app # 工作目录 | ||
| 95 | COPY . /app/ # 复制项目 | ||
| 96 | RUN pip install -r requirements.txt # 安装依赖 | ||
| 97 | ENV DEPLOY_ENV=test # 默认环境 | ||
| 98 | CMD ["python3", "api_test.py"] # 执行命令 | ||
| 99 | ``` | ||
| 100 | |||
| 101 | ### docker-compose.yml | ||
| 102 | |||
| 103 | 关键配置: | ||
| 104 | - 自动环境变量传入 | ||
| 105 | - 卷挂载:输入Excel、输出报告 | ||
| 106 | - 资源限制:1核CPU、512MB内存 | ||
| 107 | - 日志配置:json-file驱动 | ||
| 108 | |||
| 109 | ### .dockerignore | ||
| 110 | |||
| 111 | 排除不必要文件,减小镜像体积 | ||
| 112 | |||
| 113 | --- | ||
| 114 | |||
| 115 | ## 🔧 环境变量 | ||
| 116 | |||
| 117 | ### 支持的环境变量 | ||
| 118 | |||
| 119 | | 变量 | 说明 | 默认值 | | ||
| 120 | |------|------|--------| | ||
| 121 | | `DEPLOY_ENV` | 执行环境 | test | | ||
| 122 | | `IP_HOST` | 覆盖IP地址 | 不设置 | | ||
| 123 | | `PYTHONUNBUFFERED` | 禁用缓冲 | 1 | | ||
| 124 | |||
| 125 | ### 设置方式 | ||
| 126 | |||
| 127 | **命令行**: | ||
| 128 | ```bash | ||
| 129 | docker-compose run --rm -e DEPLOY_ENV=test api-test-runner | ||
| 130 | ``` | ||
| 131 | |||
| 132 | **.env 文件**: | ||
| 133 | ``` | ||
| 134 | DEPLOY_ENV=test | ||
| 135 | IP_HOST=ai-test.hikoon.com | ||
| 136 | ``` | ||
| 137 | |||
| 138 | --- | ||
| 139 | |||
| 140 | ## 🔗 与 Jenkins 集成 | ||
| 141 | |||
| 142 | ### Jenkinsfile 中的 Docker 配置 | ||
| 143 | |||
| 144 | ```groovy | ||
| 145 | stage('构建镜像') { | ||
| 146 | steps { | ||
| 147 | sh 'docker build -t api-test:${BUILD_NUMBER} .' | ||
| 148 | } | ||
| 149 | } | ||
| 150 | |||
| 151 | stage('执行测试') { | ||
| 152 | steps { | ||
| 153 | sh ''' | ||
| 154 | docker run --rm \ | ||
| 155 | -e DEPLOY_ENV=${DEPLOY_ENV} \ | ||
| 156 | -v ${WORKSPACE}/reports:/app \ | ||
| 157 | api-test:${BUILD_NUMBER} | ||
| 158 | ''' | ||
| 159 | } | ||
| 160 | } | ||
| 161 | |||
| 162 | post { | ||
| 163 | always { | ||
| 164 | sh 'docker rmi api-test:${BUILD_NUMBER}' | ||
| 165 | } | ||
| 166 | } | ||
| 167 | ``` | ||
| 168 | |||
| 169 | --- | ||
| 170 | |||
| 171 | ## 🐛 常见问题 | ||
| 172 | |||
| 173 | ### Q1: 容器报错找不到api_cases.xlsx | ||
| 174 | |||
| 175 | ```bash | ||
| 176 | docker run -v $(pwd)/api_cases.xlsx:/app/api_cases.xlsx:ro api-test:latest | ||
| 177 | ``` | ||
| 178 | |||
| 179 | ### Q2: 报告文件生成在容器内无法访问 | ||
| 180 | |||
| 181 | ```bash | ||
| 182 | docker run -v $(pwd)/reports:/app api-test:latest | ||
| 183 | ``` | ||
| 184 | |||
| 185 | ### Q3: 环境变量未传入 | ||
| 186 | |||
| 187 | ```bash | ||
| 188 | # 正确 | ||
| 189 | docker run -e DEPLOY_ENV=test api-test:latest | ||
| 190 | |||
| 191 | # 错误 | ||
| 192 | docker run api-test:latest -e DEPLOY_ENV=test | ||
| 193 | ``` | ||
| 194 | |||
| 195 | ### Q4: 镜像体积过大 | ||
| 196 | |||
| 197 | 使用 `.dockerignore` 排除不必要文件 | ||
| 198 | |||
| 199 | --- | ||
| 200 | |||
| 201 | ## 📞 获取帮助 | ||
| 202 | |||
| 203 | - Docker官方文档:https://docs.docker.com/ | ||
| 204 | - docker-compose:https://docs.docker.com/compose/ | ||
| 205 | - Jenkins Docker:https://www.jenkins.io/doc/book/installing/docker/ | ||
| 206 | |||
| 207 | --- | ||
| 208 | |||
| 209 | **🎉 Docker配置完成!** |
Dockerfile
0 → 100644
| 1 | FROM python:3.8-slim | ||
| 2 | WORKDIR /app | ||
| 3 | RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/* | ||
| 4 | COPY . /app/ | ||
| 5 | RUN pip install --no-cache-dir -r requirements.txt | ||
| 6 | ENV DEPLOY_ENV=test | ||
| 7 | ENV PYTHONUNBUFFERED=1 | ||
| 8 | RUN mkdir -p /app/reports | ||
| 9 | HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)" || exit 1 | ||
| 10 | CMD ["python3", "api_test.py"] |
Jenkinsfile
0 → 100644
| 1 | pipeline { | ||
| 2 | agent any | ||
| 3 | |||
| 4 | parameters { | ||
| 5 | choice( | ||
| 6 | name: 'DEPLOY_ENV', | ||
| 7 | choices: ['test', 'uat', 'prod'], | ||
| 8 | description: '选择部署环境' | ||
| 9 | ) | ||
| 10 | } | ||
| 11 | |||
| 12 | triggers { | ||
| 13 | cron('0 10 * * *') | ||
| 14 | } | ||
| 15 | |||
| 16 | environment { | ||
| 17 | PYTHON_VERSION = '3.8' | ||
| 18 | PROJECT_NAME = 'api_test' | ||
| 19 | DEPLOY_ENV = "${params.DEPLOY_ENV ?: 'test'}" | ||
| 20 | IP_HOST_TEST = 'ai-test.hikoon.com' | ||
| 21 | IP_HOST_UAT = 'ai-uat.hikoon.com' | ||
| 22 | IP_HOST_PROD = 'api.hikoon.com' | ||
| 23 | } | ||
| 24 | |||
| 25 | stages { | ||
| 26 | stage('检出代码') { | ||
| 27 | steps { | ||
| 28 | echo "开始检出代码..." | ||
| 29 | checkout scm | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | stage('环境准备') { | ||
| 34 | steps { | ||
| 35 | echo "准备Python环境..." | ||
| 36 | sh ''' | ||
| 37 | python3 --version | ||
| 38 | if [ ! -d "venv" ]; then | ||
| 39 | python3 -m venv venv | ||
| 40 | fi | ||
| 41 | . venv/bin/activate | ||
| 42 | pip install --upgrade pip -q | ||
| 43 | pip install -r requirements.txt -q | ||
| 44 | echo "依赖安装完成" | ||
| 45 | ''' | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | stage('执行测试') { | ||
| 50 | steps { | ||
| 51 | echo "开始执行API自动化测试 (环境: ${DEPLOY_ENV})..." | ||
| 52 | script { | ||
| 53 | def ipHost = 'ai-test.hikoon.com' | ||
| 54 | if (env.DEPLOY_ENV == 'uat') { | ||
| 55 | ipHost = env.IP_HOST_UAT | ||
| 56 | } else if (env.DEPLOY_ENV == 'prod') { | ||
| 57 | ipHost = env.IP_HOST_PROD | ||
| 58 | } else { | ||
| 59 | ipHost = env.IP_HOST_TEST | ||
| 60 | } | ||
| 61 | env.IP_HOST = ipHost | ||
| 62 | } | ||
| 63 | sh ''' | ||
| 64 | . venv/bin/activate | ||
| 65 | export DEPLOY_ENV="${DEPLOY_ENV}" | ||
| 66 | export IP_HOST="${IP_HOST}" | ||
| 67 | echo "当前执行环境: ${DEPLOY_ENV}" | ||
| 68 | echo "IP_HOST: ${IP_HOST}" | ||
| 69 | python3 api_test.py | ||
| 70 | ''' | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | stage('生成报告') { | ||
| 75 | steps { | ||
| 76 | echo "正在生成测试报告..." | ||
| 77 | sh ''' | ||
| 78 | ls -la api_test_report_* 2>/dev/null || echo "未找到报告文件" | ||
| 79 | ''' | ||
| 80 | } | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | post { | ||
| 85 | always { | ||
| 86 | echo "清理工作目录..." | ||
| 87 | sh 'echo "测试执行完成"' | ||
| 88 | } | ||
| 89 | |||
| 90 | success { | ||
| 91 | echo "✅ [${DEPLOY_ENV}环境] 所有测试用例运行成功!" | ||
| 92 | } | ||
| 93 | |||
| 94 | failure { | ||
| 95 | echo "❌ [${DEPLOY_ENV}环境] 有测试用例执行失败!" | ||
| 96 | } | ||
| 97 | } | ||
| 98 | } |
Jenkinsfile.docker
0 → 100644
| 1 | // Docker 环境下的 Jenkins Pipeline 示例 | ||
| 2 | |||
| 3 | pipeline { | ||
| 4 | agent any | ||
| 5 | |||
| 6 | parameters { | ||
| 7 | choice( | ||
| 8 | name: 'DEPLOY_ENV', | ||
| 9 | choices: ['test', 'uat', 'prod'], | ||
| 10 | description: '选择部署环境' | ||
| 11 | ) | ||
| 12 | } | ||
| 13 | |||
| 14 | environment { | ||
| 15 | DEPLOY_ENV = "${params.DEPLOY_ENV ?: 'test'}" | ||
| 16 | IMAGE_NAME = "api-test" | ||
| 17 | IMAGE_TAG = "${BUILD_NUMBER}" | ||
| 18 | WORKSPACE_REPORTS = "${WORKSPACE}/reports" | ||
| 19 | } | ||
| 20 | |||
| 21 | stages { | ||
| 22 | stage('检出代码') { | ||
| 23 | steps { | ||
| 24 | echo "检出代码..." | ||
| 25 | checkout scm | ||
| 26 | } | ||
| 27 | } | ||
| 28 | |||
| 29 | stage('构建镜像') { | ||
| 30 | steps { | ||
| 31 | echo "构建Docker镜像..." | ||
| 32 | script { | ||
| 33 | sh ''' | ||
| 34 | docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . | ||
| 35 | docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest | ||
| 36 | ''' | ||
| 37 | } | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | stage('执行测试') { | ||
| 42 | steps { | ||
| 43 | echo "执行API自动化测试 (环境: ${DEPLOY_ENV})..." | ||
| 44 | script { | ||
| 45 | sh ''' | ||
| 46 | mkdir -p ${WORKSPACE_REPORTS} | ||
| 47 | |||
| 48 | docker run --rm \ | ||
| 49 | -e DEPLOY_ENV=${DEPLOY_ENV} \ | ||
| 50 | -v ${WORKSPACE_REPORTS}:/app \ | ||
| 51 | ${IMAGE_NAME}:${IMAGE_TAG} | ||
| 52 | ''' | ||
| 53 | } | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | stage('生成报告') { | ||
| 58 | steps { | ||
| 59 | echo "正在生成测试报告..." | ||
| 60 | script { | ||
| 61 | sh ''' | ||
| 62 | ls -la ${WORKSPACE_REPORTS}/api_test_report_* 2>/dev/null || echo "未找到报告文件" | ||
| 63 | ''' | ||
| 64 | } | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | stage('发布HTML报告') { | ||
| 69 | when { | ||
| 70 | expression { | ||
| 71 | return fileExists("${WORKSPACE_REPORTS}/api_test_report_api_cases_${DEPLOY_ENV}*.html") | ||
| 72 | } | ||
| 73 | } | ||
| 74 | steps { | ||
| 75 | echo "发布HTML测试报告..." | ||
| 76 | publishHTML([ | ||
| 77 | reportDir: 'reports', | ||
| 78 | reportFiles: "api_test_report_api_cases_${DEPLOY_ENV}*.html", | ||
| 79 | reportName: "API测试报告-${DEPLOY_ENV}环境", | ||
| 80 | keepAll: true, | ||
| 81 | alwaysLinkToLastBuild: true | ||
| 82 | ]) | ||
| 83 | } | ||
| 84 | } | ||
| 85 | } | ||
| 86 | |||
| 87 | post { | ||
| 88 | always { | ||
| 89 | echo "清理工作环境..." | ||
| 90 | script { | ||
| 91 | sh ''' | ||
| 92 | docker container prune -f | ||
| 93 | echo "========== 镜像列表 ==========" | ||
| 94 | docker images | grep ${IMAGE_NAME} | ||
| 95 | ''' | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | success { | ||
| 100 | echo "✅ [${DEPLOY_ENV}环境] 所有测试用例运行成功!" | ||
| 101 | } | ||
| 102 | |||
| 103 | failure { | ||
| 104 | echo "❌ [${DEPLOY_ENV}环境] 有测试用例执行失败!" | ||
| 105 | } | ||
| 106 | } | ||
| 107 | } |
OPERATOR_GUIDE.md
0 → 100644
| 1 | # 关系运算符使用指南 | ||
| 2 | |||
| 3 | ## 概述 | ||
| 4 | |||
| 5 | `expected_response` 字段支持多种关系运算符,可以进行更灵活的响应验证。 | ||
| 6 | |||
| 7 | --- | ||
| 8 | |||
| 9 | ## 支持的运算符 | ||
| 10 | |||
| 11 | ### 1. 比较运算符 | ||
| 12 | |||
| 13 | #### `$ne` - 不等于 | ||
| 14 | ```json | ||
| 15 | {"code": {"$ne": 500}} | ||
| 16 | ``` | ||
| 17 | 检查 `code` 字段不等于 500。 | ||
| 18 | |||
| 19 | #### `$eq` - 等于 | ||
| 20 | ```json | ||
| 21 | {"count": {"$eq": 10}} | ||
| 22 | ``` | ||
| 23 | 检查 `count` 字段等于 10。 | ||
| 24 | |||
| 25 | #### `$gt` - 大于 | ||
| 26 | ```json | ||
| 27 | {"count": {"$gt": 0}} | ||
| 28 | ``` | ||
| 29 | 检查 `count` 字段大于 0。 | ||
| 30 | |||
| 31 | #### `$gte` - 大于等于 | ||
| 32 | ```json | ||
| 33 | {"score": {"$gte": 60}} | ||
| 34 | ``` | ||
| 35 | |||
| 36 | #### `$lt` - 小于 | ||
| 37 | ```json | ||
| 38 | {"timeout": {"$lt": 1000}} | ||
| 39 | ``` | ||
| 40 | |||
| 41 | #### `$lte` - 小于等于 | ||
| 42 | ```json | ||
| 43 | {"age": {"$lte": 18}} | ||
| 44 | ``` | ||
| 45 | |||
| 46 | ### 2. 包含运算符 | ||
| 47 | |||
| 48 | #### `$in` - 值在列表中 | ||
| 49 | ```json | ||
| 50 | {"status": {"$in": ["pending", "done", "processing"]}} | ||
| 51 | ``` | ||
| 52 | |||
| 53 | #### `$nin` - 值不在列表中 | ||
| 54 | ```json | ||
| 55 | {"type": {"$nin": ["admin", "root", "system"]}} | ||
| 56 | ``` | ||
| 57 | |||
| 58 | ### 3. 字符串运算符 | ||
| 59 | |||
| 60 | #### `$contains` - 字符串包含 | ||
| 61 | ```json | ||
| 62 | {"msg": {"$contains": "success"}} | ||
| 63 | ``` | ||
| 64 | |||
| 65 | #### `$not_contains` - 字符串不包含 | ||
| 66 | ```json | ||
| 67 | {"error": {"$not_contains": "timeout"}} | ||
| 68 | ``` | ||
| 69 | |||
| 70 | #### `$regex` - 正则表达式匹配 | ||
| 71 | ```json | ||
| 72 | {"email": {"$regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"}} | ||
| 73 | ``` | ||
| 74 | |||
| 75 | ### 4. 范围运算符 | ||
| 76 | |||
| 77 | #### `$range` - 范围判断 [min, max] | ||
| 78 | ```json | ||
| 79 | {"value": {"$range": [0, 100]}} | ||
| 80 | ``` | ||
| 81 | 检查 `value` 在 0 到 100 之间(包含边界)。 | ||
| 82 | |||
| 83 | --- | ||
| 84 | |||
| 85 | ## 使用示例 | ||
| 86 | |||
| 87 | ### 示例1:验证状态码 | ||
| 88 | ```json | ||
| 89 | { | ||
| 90 | "code": {"$ne": 500}, | ||
| 91 | "msg": {"$contains": "成功"} | ||
| 92 | } | ||
| 93 | ``` | ||
| 94 | |||
| 95 | ### 示例2:验证列表数据 | ||
| 96 | ```json | ||
| 97 | { | ||
| 98 | "code": 0, | ||
| 99 | "data": { | ||
| 100 | "count": {"$gt": 0}, | ||
| 101 | "items": ["__NOT_NULL__"], | ||
| 102 | "status": {"$in": ["active", "inactive"]} | ||
| 103 | } | ||
| 104 | } | ||
| 105 | ``` | ||
| 106 | |||
| 107 | ### 示例3:验证分页数据 | ||
| 108 | ```json | ||
| 109 | { | ||
| 110 | "code": 0, | ||
| 111 | "pageIndex": {"$gte": 1}, | ||
| 112 | "pageSize": {"$range": [1, 1000]}, | ||
| 113 | "total": {"$gte": 0} | ||
| 114 | } | ||
| 115 | ``` | ||
| 116 | |||
| 117 | ### 示例4:验证邮箱和年龄 | ||
| 118 | ```json | ||
| 119 | { | ||
| 120 | "code": 0, | ||
| 121 | "email": {"$regex": "^.*@.*$"}, | ||
| 122 | "age": {"$range": [18, 100]}, | ||
| 123 | "roles": {"$in": ["user", "admin"]}, | ||
| 124 | "status": {"$not_contains": "banned"} | ||
| 125 | } | ||
| 126 | ``` | ||
| 127 | |||
| 128 | --- | ||
| 129 | |||
| 130 | ## Excel中的使用 | ||
| 131 | |||
| 132 | 在 `expected_response` 列中填入 JSON 格式的期望响应: | ||
| 133 | |||
| 134 | ``` | ||
| 135 | case_id | api_name | expected_response | ||
| 136 | 1 | 测试接口 | {"code": 0, "msg": "success"} | ||
| 137 | 2 | 列表接口 | {"code": 0, "data": {"count": {"$gt": 0}}} | ||
| 138 | 3 | 错误处理 | {"code": {"$ne": 200}} | ||
| 139 | ``` | ||
| 140 | |||
| 141 | --- | ||
| 142 | |||
| 143 | ## 特殊值 | ||
| 144 | |||
| 145 | - `"__NOT_NULL__"` - 检查字段非空 | ||
| 146 | - `["__NOT_NULL__"]` - 检查数组非空 | ||
| 147 | |||
| 148 | --- | ||
| 149 | |||
| 150 | ## 注意事项 | ||
| 151 | |||
| 152 | 1. **类型匹配**:比较运算符(`$gt`, `$lt` 等)要求数据类型兼容 | ||
| 153 | 2. **正则表达式**:使用 `$regex` 时,值会被转换为字符串后进行匹配 | ||
| 154 | 3. **列表范围**:`$range` 只支持两元素列表 `[min, max]`,两个值都是包含的 | ||
| 155 | 4. **错误处理**:运算符验证失败会记录在测试报告的 `error` 字段中 | ||
| 156 | |||
| 157 | --- | ||
| 158 | |||
| 159 | **更多示例请查看 USER_GUIDE.md** |
OPTIMIZATION_REQUIREMENTS.md
0 → 100644
| 1 | # 优化需求与增强建议 | ||
| 2 | |||
| 3 | ## 📋 概述 | ||
| 4 | |||
| 5 | 本文档列出了项目的优化建议和潜在增强功能,供未来版本参考。 | ||
| 6 | |||
| 7 | --- | ||
| 8 | |||
| 9 | ## 🚀 性能优化 | ||
| 10 | |||
| 11 | ### 1. 并发执行用例 | ||
| 12 | |||
| 13 | **当前**:单线程串行执行用例 | ||
| 14 | |||
| 15 | **优化方案**: | ||
| 16 | ```python | ||
| 17 | from concurrent.futures import ThreadPoolExecutor | ||
| 18 | |||
| 19 | # 使用线程池并发执行 | ||
| 20 | with ThreadPoolExecutor(max_workers=5) as executor: | ||
| 21 | futures = [executor.submit(test_case, case) for case in cases] | ||
| 22 | results = [f.result() for f in futures] | ||
| 23 | ``` | ||
| 24 | |||
| 25 | **效果**:可将执行时间缩短 50-70% | ||
| 26 | |||
| 27 | ### 2. 连接池复用 | ||
| 28 | |||
| 29 | **当前**:每个请求创建新连接 | ||
| 30 | |||
| 31 | **优化方案**: | ||
| 32 | ```python | ||
| 33 | from requests.adapters import HTTPAdapter | ||
| 34 | from urllib3.util.retry import Retry | ||
| 35 | |||
| 36 | session = requests.Session() | ||
| 37 | retry = Retry(connect=3, backoff_factor=0.5) | ||
| 38 | adapter = HTTPAdapter(max_retries=retry) | ||
| 39 | session.mount('http://', adapter) | ||
| 40 | session.mount('https://', adapter) | ||
| 41 | ``` | ||
| 42 | |||
| 43 | **效果**:减少网络开销,提升请求速度 | ||
| 44 | |||
| 45 | ### 3. Excel文件缓存 | ||
| 46 | |||
| 47 | **当前**:每次运行都重新加载Excel | ||
| 48 | |||
| 49 | **优化方案**: | ||
| 50 | - 使用内存缓存 | ||
| 51 | - 增量读取 | ||
| 52 | - 支持预编译 | ||
| 53 | |||
| 54 | --- | ||
| 55 | |||
| 56 | ## 💡 功能增强 | ||
| 57 | |||
| 58 | ### 1. 数据库支持 | ||
| 59 | |||
| 60 | **建议**:支持从数据库读取测试用例 | ||
| 61 | |||
| 62 | ```python | ||
| 63 | def read_cases_from_db(connection_string): | ||
| 64 | # 从MySQL、PostgreSQL等数据库读取 | ||
| 65 | pass | ||
| 66 | ``` | ||
| 67 | |||
| 68 | ### 2. 数据驱动测试(DDT) | ||
| 69 | |||
| 70 | **建议**:支持参数化测试 | ||
| 71 | |||
| 72 | ```python | ||
| 73 | # 使用 @ddt 装饰器 | ||
| 74 | @ddt | ||
| 75 | class TestAPI(unittest.TestCase): | ||
| 76 | @data([{"param": 1}, {"param": 2}]) | ||
| 77 | def test_api(self, case): | ||
| 78 | pass | ||
| 79 | ``` | ||
| 80 | |||
| 81 | ### 3. 测试报告增强 | ||
| 82 | |||
| 83 | **建议**: | ||
| 84 | - 图表展示(ECharts) | ||
| 85 | - 趋势分析 | ||
| 86 | - 性能对比 | ||
| 87 | - 邮件通知 | ||
| 88 | - 钉钉集成 | ||
| 89 | |||
| 90 | ### 4. 环境管理 | ||
| 91 | |||
| 92 | **建议**: | ||
| 93 | - 环境变量密钥管理 | ||
| 94 | - 敏感信息加密 | ||
| 95 | - 配置文件版本管理 | ||
| 96 | - 动态环境切换 | ||
| 97 | |||
| 98 | ### 5. 测试数据管理 | ||
| 99 | |||
| 100 | **建议**: | ||
| 101 | - 测试数据工厂 | ||
| 102 | - 数据清理机制 | ||
| 103 | - 数据备份恢复 | ||
| 104 | - 依赖数据预置 | ||
| 105 | |||
| 106 | --- | ||
| 107 | |||
| 108 | ## 🔒 安全增强 | ||
| 109 | |||
| 110 | ### 1. 敏感信息保护 | ||
| 111 | |||
| 112 | **建议**: | ||
| 113 | ```python | ||
| 114 | # 不存储明文密码 | ||
| 115 | # 使用环境变量或密钥管理系统 | ||
| 116 | import os | ||
| 117 | API_TOKEN = os.getenv('API_TOKEN') | ||
| 118 | |||
| 119 | # 打印前脱敏 | ||
| 120 | def mask_sensitive(data): | ||
| 121 | # 隐藏密钥、密码等 | ||
| 122 | pass | ||
| 123 | ``` | ||
| 124 | |||
| 125 | ### 2. 证书管理 | ||
| 126 | |||
| 127 | **建议**: | ||
| 128 | - SSL/TLS 证书管理 | ||
| 129 | - 证书过期预警 | ||
| 130 | - 自动续期支持 | ||
| 131 | |||
| 132 | --- | ||
| 133 | |||
| 134 | ## 📊 可观测性增强 | ||
| 135 | |||
| 136 | ### 1. 日志系统 | ||
| 137 | |||
| 138 | **建议**: | ||
| 139 | ```python | ||
| 140 | import logging | ||
| 141 | |||
| 142 | # 结构化日志 | ||
| 143 | logger = logging.getLogger(__name__) | ||
| 144 | logger.info("Test case executed", extra={ | ||
| 145 | "case_id": case_id, | ||
| 146 | "env": env, | ||
| 147 | "duration": duration | ||
| 148 | }) | ||
| 149 | ``` | ||
| 150 | |||
| 151 | ### 2. 链路追踪 | ||
| 152 | |||
| 153 | **建议**: | ||
| 154 | - 使用 OpenTelemetry | ||
| 155 | - 支持分布式追踪 | ||
| 156 | - 性能监控 | ||
| 157 | |||
| 158 | ### 3. 指标收集 | ||
| 159 | |||
| 160 | **建议**: | ||
| 161 | - Prometheus metrics | ||
| 162 | - 成功率、响应时间等指标 | ||
| 163 | - 长期趋势分析 | ||
| 164 | |||
| 165 | --- | ||
| 166 | |||
| 167 | ## 📦 架构优化 | ||
| 168 | |||
| 169 | ### 1. 模块化设计 | ||
| 170 | |||
| 171 | **建议**: | ||
| 172 | ``` | ||
| 173 | core/ | ||
| 174 | ├── request/ | ||
| 175 | ├── validation/ | ||
| 176 | ├── reporting/ | ||
| 177 | └── storage/ | ||
| 178 | |||
| 179 | plugins/ | ||
| 180 | ├── slack/ | ||
| 181 | ├── email/ | ||
| 182 | └── dingding/ | ||
| 183 | ``` | ||
| 184 | |||
| 185 | ### 2. 插件系统 | ||
| 186 | |||
| 187 | **建议**: | ||
| 188 | - 支持自定义验证器 | ||
| 189 | - 支持自定义报告生成器 | ||
| 190 | - 支持自定义通知器 | ||
| 191 | |||
| 192 | ### 3. REST API | ||
| 193 | |||
| 194 | **建议**: | ||
| 195 | - 提供 REST API | ||
| 196 | - Web UI 管理界面 | ||
| 197 | - 远程执行能力 | ||
| 198 | |||
| 199 | --- | ||
| 200 | |||
| 201 | ## 🧪 测试框架增强 | ||
| 202 | |||
| 203 | ### 1. 单元测试 | ||
| 204 | |||
| 205 | **建议**: | ||
| 206 | - 为核心模块增加单元测试 | ||
| 207 | - 达到 80% 覆盖率 | ||
| 208 | |||
| 209 | ### 2. 集成测试 | ||
| 210 | |||
| 211 | **建议**: | ||
| 212 | - Docker 容器化测试 | ||
| 213 | - 多环境集成测试 | ||
| 214 | - CI/CD 流水线 | ||
| 215 | |||
| 216 | ### 3. 性能测试 | ||
| 217 | |||
| 218 | **建议**: | ||
| 219 | - 压力测试支持 | ||
| 220 | - 基准测试 | ||
| 221 | - 性能回归检测 | ||
| 222 | |||
| 223 | --- | ||
| 224 | |||
| 225 | ## 🔄 工作流增强 | ||
| 226 | |||
| 227 | ### 1. 前置条件处理 | ||
| 228 | |||
| 229 | **建议**: | ||
| 230 | ```python | ||
| 231 | def setup_test_data(): | ||
| 232 | # 创建必要的测试数据 | ||
| 233 | pass | ||
| 234 | |||
| 235 | def cleanup_test_data(): | ||
| 236 | # 清理测试数据 | ||
| 237 | pass | ||
| 238 | ``` | ||
| 239 | |||
| 240 | ### 2. 后置处理 | ||
| 241 | |||
| 242 | **建议**: | ||
| 243 | - 自动生成测试报告 | ||
| 244 | - 自动发送通知 | ||
| 245 | - 自动更新测试矩阵 | ||
| 246 | |||
| 247 | ### 3. 失败重试 | ||
| 248 | |||
| 249 | **建议**: | ||
| 250 | ```python | ||
| 251 | @retry(max_attempts=3, backoff_factor=2) | ||
| 252 | def execute_test(case): | ||
| 253 | pass | ||
| 254 | ``` | ||
| 255 | |||
| 256 | --- | ||
| 257 | |||
| 258 | ## 📱 跨平台支持 | ||
| 259 | |||
| 260 | ### 1. 移动端API测试 | ||
| 261 | |||
| 262 | **建议**: | ||
| 263 | - 支持 Mobile API 测试 | ||
| 264 | - 支持 GraphQL | ||
| 265 | |||
| 266 | ### 2. 跨平台兼容性 | ||
| 267 | |||
| 268 | **建议**: | ||
| 269 | - Windows / Linux / macOS | ||
| 270 | - Python 3.9+ | ||
| 271 | - 更新依赖库 | ||
| 272 | |||
| 273 | --- | ||
| 274 | |||
| 275 | ## 🤖 AI/ML 集成 | ||
| 276 | |||
| 277 | ### 1. 智能测试生成 | ||
| 278 | |||
| 279 | **建议**: | ||
| 280 | - 使用 AI 自动生成测试用例 | ||
| 281 | - 使用 AI 进行断言生成 | ||
| 282 | |||
| 283 | ### 2. 异常检测 | ||
| 284 | |||
| 285 | **建议**: | ||
| 286 | - 使用 ML 检测异常行为 | ||
| 287 | - 自动关联异常根因 | ||
| 288 | |||
| 289 | --- | ||
| 290 | |||
| 291 | ## 📈 优先级 | ||
| 292 | |||
| 293 | | 优化项 | 优先级 | 难度 | 工作量 | | ||
| 294 | |-------|--------|------|--------| | ||
| 295 | | 并发执行 | 高 | 中 | 2-3天 | | ||
| 296 | | 连接池 | 高 | 低 | 1天 | | ||
| 297 | | 报告增强 | 中 | 低 | 3-5天 | | ||
| 298 | | 数据库支持 | 中 | 中 | 1周 | | ||
| 299 | | 插件系统 | 低 | 高 | 2周 | | ||
| 300 | | REST API | 低 | 高 | 2周 | | ||
| 301 | |||
| 302 | --- | ||
| 303 | |||
| 304 | ## 🎯 建议实施顺序 | ||
| 305 | |||
| 306 | 1. **第一阶段**:并发执行、连接池、报告增强 | ||
| 307 | 2. **第二阶段**:数据库支持、前置/后置处理 | ||
| 308 | 3. **第三阶段**:REST API、插件系统、Web UI | ||
| 309 | 4. **第四阶段**:AI/ML 集成、可观测性增强 | ||
| 310 | |||
| 311 | --- | ||
| 312 | |||
| 313 | ## 📞 反馈 | ||
| 314 | |||
| 315 | 如有优化建议,欢迎提交 Issue 或 Pull Request。 | ||
| 316 | |||
| 317 | --- | ||
| 318 | |||
| 319 | **🚀 不断优化,持续改进!** |
QUICK_DEPLOY.md
0 → 100644
This diff is collapsed.
Click to expand it.
README.md
0 → 100644
| 1 | # 🚀 API 自动化测试框架 | ||
| 2 | |||
| 3 | ## 📌 项目简介 | ||
| 4 | |||
| 5 | 一套完整的API自动化测试框架,支持**多环境执行**(test/uat/prod)、Excel驱动测试、灵活的用例筛选和详细的测试报告生成。 | ||
| 6 | |||
| 7 | **核心特性**: | ||
| 8 | - ✅ **多环境支持**:一套代码运行在test/uat/prod三个环境 | ||
| 9 | - ✅ **Excel驱动**:用例配置在Excel中,易于维护 | ||
| 10 | - ✅ **灵活筛选**:通过env_scope字段控制各环境的执行用例 | ||
| 11 | - ✅ **丰富的验证**:支持多种关系运算符($gt、$contains、$regex等) | ||
| 12 | - ✅ **详细报告**:HTML和Excel双格式测试报告 | ||
| 13 | - ✅ **Jenkins集成**:参数化执行,支持定时任务 | ||
| 14 | - ✅ **Docker支持**:容器化部署 | ||
| 15 | |||
| 16 | --- | ||
| 17 | |||
| 18 | ## 🎯 快速开始 | ||
| 19 | |||
| 20 | ### 需求 | ||
| 21 | |||
| 22 | - Python 3.8+ | ||
| 23 | - pip 和 venv | ||
| 24 | - 依赖库(详见requirements.txt) | ||
| 25 | |||
| 26 | ### 1️⃣ 安装依赖 | ||
| 27 | |||
| 28 | ```bash | ||
| 29 | # 创建虚拟环境 | ||
| 30 | python3 -m venv venv | ||
| 31 | |||
| 32 | # 激活虚拟环境 | ||
| 33 | source venv/bin/activate # Linux/Mac | ||
| 34 | # 或 | ||
| 35 | .\venv\Scripts\activate # Windows | ||
| 36 | |||
| 37 | # 安装依赖 | ||
| 38 | pip install -r requirements.txt | ||
| 39 | ``` | ||
| 40 | |||
| 41 | ### 2️⃣ 准备测试用例 | ||
| 42 | |||
| 43 | 编辑 `api_cases.xlsx`,在表格中添加新列 `env_scope`,标记每个用例的执行范围: | ||
| 44 | |||
| 45 | ``` | ||
| 46 | env_scope 值说明: | ||
| 47 | - all 或留空 → 所有环境执行 | ||
| 48 | - test → 仅测试环境执行 | ||
| 49 | - uat → 仅UAT环境执行 | ||
| 50 | - prod → 仅生产环境执行 | ||
| 51 | - test,uat → 测试和UAT执行,生产跳过 | ||
| 52 | ``` | ||
| 53 | |||
| 54 | ### 3️⃣ 运行测试 | ||
| 55 | |||
| 56 | ```bash | ||
| 57 | # 测试环境 | ||
| 58 | export DEPLOY_ENV=test | ||
| 59 | python3 api_test.py | ||
| 60 | |||
| 61 | # UAT环境 | ||
| 62 | export DEPLOY_ENV=uat | ||
| 63 | python3 api_test.py | ||
| 64 | |||
| 65 | # 生产环境 | ||
| 66 | export DEPLOY_ENV=prod | ||
| 67 | python3 api_test.py | ||
| 68 | ``` | ||
| 69 | |||
| 70 | ### 4️⃣ 查看报告 | ||
| 71 | |||
| 72 | 执行完成后,生成的报告文件: | ||
| 73 | - `api_test_report_*_test_*.html` - 测试环境HTML报告 | ||
| 74 | - `api_test_report_*_uat_*.html` - UAT环境HTML报告 | ||
| 75 | - `api_test_report_*_prod_*.html` - 生产环境HTML报告 | ||
| 76 | - `api_test_report_*.xlsx` - Excel格式报告 | ||
| 77 | |||
| 78 | --- | ||
| 79 | |||
| 80 | ## 🐳 Docker 快速开始 | ||
| 81 | |||
| 82 | ### 前提条件 | ||
| 83 | - Docker 已安装 | ||
| 84 | - docker-compose 已安装 | ||
| 85 | |||
| 86 | ### 运行命令 | ||
| 87 | |||
| 88 | **测试环境**: | ||
| 89 | ```bash | ||
| 90 | docker-compose run --rm -e DEPLOY_ENV=test api-test-runner | ||
| 91 | ``` | ||
| 92 | |||
| 93 | **UAT环境**: | ||
| 94 | ```bash | ||
| 95 | docker-compose run --rm -e DEPLOY_ENV=uat api-test-runner | ||
| 96 | ``` | ||
| 97 | |||
| 98 | **生产环境**: | ||
| 99 | ```bash | ||
| 100 | docker-compose run --rm -e DEPLOY_ENV=prod api-test-runner | ||
| 101 | ``` | ||
| 102 | |||
| 103 | 报告文件保存在 `./reports` 目录 | ||
| 104 | |||
| 105 | 详细说明见 [DOCKER_GUIDE.md](./DOCKER_GUIDE.md) | ||
| 106 | |||
| 107 | --- | ||
| 108 | |||
| 109 | ## 📖 文档导航 | ||
| 110 | |||
| 111 | | 文档 | 说明 | 适用场景 | | ||
| 112 | |------|------|---------| | ||
| 113 | | **[USER_GUIDE.md](./USER_GUIDE.md)** | 详细使用指南 | 如何使用框架、多环境配置、常见问题 | | ||
| 114 | | **[DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)** | 部署安装指南 | Linux服务器部署、Jenkins配置 | | ||
| 115 | | **[DOCKER_GUIDE.md](./DOCKER_GUIDE.md)** | Docker部署指南 | Docker容器化、docker-compose、Jenkins集成 | | ||
| 116 | | **[OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md)** | 运维指南 | 关系运算符使用 | | ||
| 117 | | **[OPTIMIZATION_REQUIREMENTS.md](./OPTIMIZATION_REQUIREMENTS.md)** | 优化需求 | 性能优化、增强建议 | | ||
| 118 | |||
| 119 | --- | ||
| 120 | |||
| 121 | ## 🏗️ 项目结构 | ||
| 122 | |||
| 123 | ``` | ||
| 124 | interface_test/ | ||
| 125 | ├── 📄 README.md # 项目介绍(本文件) | ||
| 126 | ├── 📖 USER_GUIDE.md # 使用指南 | ||
| 127 | ├── 🚀 DEPLOYMENT_GUIDE.md # Linux部署指南 | ||
| 128 | ├── 🐳 DOCKER_GUIDE.md # Docker部署指南 | ||
| 129 | ├── 🔧 OPERATOR_GUIDE.md # 运维指南 | ||
| 130 | ├── 📈 OPTIMIZATION_REQUIREMENTS.md # 优化需求 | ||
| 131 | │ | ||
| 132 | ├── 💻 api_test.py # 主测试脚本 | ||
| 133 | ├── ⚙️ env_config.py # 环境配置(多环境IP) | ||
| 134 | ├── 📊 api_cases.xlsx # 测试用例(Excel) | ||
| 135 | ├── requirements.txt # Python依赖 | ||
| 136 | │ | ||
| 137 | ├── 🐳 Dockerfile # Docker镜像配置 | ||
| 138 | ├── 📦 docker-compose.yml # Docker容器编排 | ||
| 139 | ├── .dockerignore # Docker忽略文件 | ||
| 140 | │ | ||
| 141 | ├── Jenkinsfile # Jenkins标准配置(直接执行) | ||
| 142 | ├── Jenkinsfile.docker # Jenkins Docker配置(容器中执行) | ||
| 143 | │ | ||
| 144 | └── .venv/ # Python虚拟环境 | ||
| 145 | ``` | ||
| 146 | |||
| 147 | --- | ||
| 148 | |||
| 149 | ## ✨ 核心功能 | ||
| 150 | |||
| 151 | ### 1️⃣ 多环境执行 | ||
| 152 | |||
| 153 | **支持三个环境**: | ||
| 154 | |||
| 155 | | 环境 | IP_HOST | 用途 | | ||
| 156 | |------|---------|------| | ||
| 157 | | test | ai-test.hikoon.com | 测试环境 | | ||
| 158 | | uat | ai-uat.hikoon.com | UAT验收环境 | | ||
| 159 | | prod | api.hikoon.com | 生产环境 | | ||
| 160 | |||
| 161 | **环境选择**: | ||
| 162 | ```bash | ||
| 163 | export DEPLOY_ENV=test # 或 uat / prod | ||
| 164 | python3 api_test.py | ||
| 165 | ``` | ||
| 166 | |||
| 167 | ### 2️⃣ 用例筛选 | ||
| 168 | |||
| 169 | 通过 `env_scope` 列灵活控制用例执行范围: | ||
| 170 | |||
| 171 | ``` | ||
| 172 | env_scope = 'all' → 三环境都执行 | ||
| 173 | env_scope = 'test,uat' → 生产环境跳过(避免危险操作) | ||
| 174 | env_scope = 'prod' → 仅生产环境执行 | ||
| 175 | ``` | ||
| 176 | |||
| 177 | ### 3️⃣ 关系运算符 | ||
| 178 | |||
| 179 | `expected_response` 支持多种验证方式: | ||
| 180 | |||
| 181 | ```json | ||
| 182 | { | ||
| 183 | "code": {"$ne": 500}, // 不等于 | ||
| 184 | "count": {"$gt": 0}, // 大于 | ||
| 185 | "status": {"$in": ["ok", "done"]}, // 在列表中 | ||
| 186 | "msg": {"$contains": "success"}, // 字符串包含 | ||
| 187 | "email": {"$regex": "^.*@.*$"} // 正则匹配 | ||
| 188 | } | ||
| 189 | ``` | ||
| 190 | |||
| 191 | 详见 [OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md) | ||
| 192 | |||
| 193 | ### 4️⃣ 详细报告 | ||
| 194 | |||
| 195 | - 📊 **统计信息**:总数、成功数、失败数、耗时 | ||
| 196 | - 🔍 **筛选功能**:按失败、响应时间筛选 | ||
| 197 | - 📋 **详细结果**:请求参数、期望值、实际值、错误信息 | ||
| 198 | - 📈 **性能分析**:响应时间分布 | ||
| 199 | - 🔖 **环境标识**:报告文件名包含运行环境 | ||
| 200 | |||
| 201 | --- | ||
| 202 | |||
| 203 | ## 🔧 环境配置 | ||
| 204 | |||
| 205 | ### env_config.py | ||
| 206 | |||
| 207 | 定义多个环境的IP和其他变量: | ||
| 208 | |||
| 209 | ```python | ||
| 210 | import os | ||
| 211 | |||
| 212 | # 多环境IP配置 | ||
| 213 | DEPLOY_ENV = os.getenv('DEPLOY_ENV', 'test') | ||
| 214 | IP_HOST_MAP = { | ||
| 215 | 'test': 'ai-test.hikoon.com', | ||
| 216 | 'uat': 'ai-uat.hikoon.com', | ||
| 217 | 'prod': 'api.hikoon.com' | ||
| 218 | } | ||
| 219 | IP_HOST = os.getenv('IP_HOST', IP_HOST_MAP.get(DEPLOY_ENV, 'ai-test.hikoon.com')) | ||
| 220 | |||
| 221 | # 当前日期(格式:YY-MM-DD) | ||
| 222 | CURRENT_DATE = datetime.now().strftime('%y-%m-%d') | ||
| 223 | |||
| 224 | # 其他环境变量 | ||
| 225 | RANDOM_EMAIL = gen_email() # 自动生成随机邮箱 | ||
| 226 | ``` | ||
| 227 | |||
| 228 | ### 自定义环境变量 | ||
| 229 | |||
| 230 | ```python | ||
| 231 | # env_config.py 中添加 | ||
| 232 | API_TOKEN = "your-token-here" | ||
| 233 | TIMEOUT = 60 | ||
| 234 | DEBUG = True | ||
| 235 | ``` | ||
| 236 | |||
| 237 | 然后在Excel用例中使用: | ||
| 238 | ``` | ||
| 239 | URL: {IP_HOST}/api/users | ||
| 240 | Headers: {"Authorization": "Bearer {API_TOKEN}"} | ||
| 241 | Params: {"timestamp": "{CURRENT_DATE}"} | ||
| 242 | ``` | ||
| 243 | |||
| 244 | --- | ||
| 245 | |||
| 246 | ## 📊 Excel测试用例格式 | ||
| 247 | |||
| 248 | | 字段 | 说明 | 示例 | | ||
| 249 | |------|------|------| | ||
| 250 | | case_id | 用例ID | 1 | | ||
| 251 | | api_name | 接口名称 | 用户注册 | | ||
| 252 | | is_run | 是否执行(1=跳过) | 0 | | ||
| 253 | | env_scope | 执行环围(新增) | all | | ||
| 254 | | method | 请求方法 | POST | | ||
| 255 | | ip_host / url | 基础URL | ai-test.hikoon.com | | ||
| 256 | | path | 路径 | /api/users/register | | ||
| 257 | | params | 请求参数(JSON) | {"email":"test@qq.com"} | | ||
| 258 | | headers | 请求头(JSON) | {"Content-Type":"application/json"} | | ||
| 259 | | expected_code | 期望状态码 | 200 | | ||
| 260 | | expected_response | 期望响应 | {"code":0} | | ||
| 261 | | extract_vars | 提取变量 | user_id=data.user_id | | ||
| 262 | |||
| 263 | --- | ||
| 264 | |||
| 265 | ## 🚀 Jenkins集成 | ||
| 266 | |||
| 267 | ### Build with Parameters | ||
| 268 | |||
| 269 | 在Jenkins中参数化执行,选择环境: | ||
| 270 | |||
| 271 | 1. 点击 **Build with Parameters** | ||
| 272 | 2. 选择 **DEPLOY_ENV**: test / uat / prod | ||
| 273 | 3. 点击 **Build** | ||
| 274 | |||
| 275 | ### 自动环境映射 | ||
| 276 | |||
| 277 | ```groovy | ||
| 278 | environment { | ||
| 279 | DEPLOY_ENV = "${params.DEPLOY_ENV ?: 'test'}" | ||
| 280 | IP_HOST_TEST = 'ai-test.hikoon.com' | ||
| 281 | IP_HOST_UAT = 'ai-uat.hikoon.com' | ||
| 282 | IP_HOST_PROD = 'api.hikoon.com' | ||
| 283 | } | ||
| 284 | ``` | ||
| 285 | |||
| 286 | ### 执行流程 | ||
| 287 | |||
| 288 | ``` | ||
| 289 | Jenkins参数选择 → DEPLOY_ENV环境变量 → IP_HOST自动映射 → 用例执行 → 报告生成 | ||
| 290 | ``` | ||
| 291 | |||
| 292 | 详见 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md) | ||
| 293 | |||
| 294 | --- | ||
| 295 | |||
| 296 | ## 📝 常见用例场景 | ||
| 297 | |||
| 298 | ### 场景1:通用接口测试(所有环境) | ||
| 299 | |||
| 300 | ``` | ||
| 301 | env_scope = 'all' | ||
| 302 | 用例:登录、查询用户信息、获取列表等 | ||
| 303 | 结果:test✅ / uat✅ / prod✅ | ||
| 304 | ``` | ||
| 305 | |||
| 306 | ### 场景2:跳过生产的危险操作 | ||
| 307 | |||
| 308 | ``` | ||
| 309 | env_scope = 'test,uat' | ||
| 310 | 用例:删除数据、清理数据库、重置密码等 | ||
| 311 | 结果:test✅ / uat✅ / prod⏭️(跳过) | ||
| 312 | ``` | ||
| 313 | |||
| 314 | ### 场景3:仅生产执行 | ||
| 315 | |||
| 316 | ``` | ||
| 317 | env_scope = 'prod' | ||
| 318 | 用例:导出报表、数据备份等(基于真实数据) | ||
| 319 | 结果:test⏭️ / uat⏭️ / prod✅ | ||
| 320 | ``` | ||
| 321 | |||
| 322 | --- | ||
| 323 | |||
| 324 | ## 🆘 常见问题 | ||
| 325 | |||
| 326 | ### Q: 如何新增环境? | ||
| 327 | |||
| 328 | 编辑 `env_config.py` 和 `Jenkinsfile` 的IP配置。详见 [USER_GUIDE.md](./USER_GUIDE.md) 的Q&A部分 | ||
| 329 | |||
| 330 | ### Q: env_scope 支持哪些值? | ||
| 331 | |||
| 332 | 支持:all / test / uat / prod 及其组合(用逗号分隔)。详见 [USER_GUIDE.md](./USER_GUIDE.md) | ||
| 333 | |||
| 334 | ### Q: 如何禁用某个用例? | ||
| 335 | |||
| 336 | 设置 `is_run = 1` 或 `env_scope` 不包含当前环境。详见 [USER_GUIDE.md](./USER_GUIDE.md) | ||
| 337 | |||
| 338 | ### Q: 生产环境执行失败怎么办? | ||
| 339 | |||
| 340 | 检查 `env_scope` 是否正确、IP_HOST是否可访问。详见 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md) | ||
| 341 | |||
| 342 | --- | ||
| 343 | |||
| 344 | ## 📞 获取帮助 | ||
| 345 | |||
| 346 | - **使用问题** → [USER_GUIDE.md](./USER_GUIDE.md) | ||
| 347 | - **部署问题** → [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md) | ||
| 348 | - **Docker问题** → [DOCKER_GUIDE.md](./DOCKER_GUIDE.md) | ||
| 349 | - **验证方式** → [OPERATOR_GUIDE.md](./OPERATOR_GUIDE.md) | ||
| 350 | - **优化建议** → [OPTIMIZATION_REQUIREMENTS.md](./OPTIMIZATION_REQUIREMENTS.md) | ||
| 351 | |||
| 352 | --- | ||
| 353 | |||
| 354 | ## 📈 最近更新 | ||
| 355 | |||
| 356 | ### v1.0.0 (2026-01-21) | ||
| 357 | |||
| 358 | ✅ 完整框架实现 | ||
| 359 | - ✅ 多环境执行支持(test/uat/prod) | ||
| 360 | - ✅ env_scope字段用于用例筛选 | ||
| 361 | - ✅ 关系运算符验证($eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $contains, $regex, $range等) | ||
| 362 | - ✅ 报告文件名包含环境标识 | ||
| 363 | - ✅ Docker容器化支持 | ||
| 364 | - ✅ 参数化Jenkins配置 | ||
| 365 | - ✅ 完整文档整合 | ||
| 366 | |||
| 367 | --- | ||
| 368 | |||
| 369 | ## 📄 许可证 | ||
| 370 | |||
| 371 | 项目所有者:百音引擎项目 | ||
| 372 | |||
| 373 | --- | ||
| 374 | |||
| 375 | **🎉 祝你使用愉快!如有问题,请查看对应的文档或联系项目维护者。** |
USER_GUIDE.md
0 → 100644
| 1 | # 📖 用户使用指南 | ||
| 2 | |||
| 3 | ## 目录 | ||
| 4 | |||
| 5 | - [多环境执行](#多环境执行) | ||
| 6 | - [用例管理](#用例管理) | ||
| 7 | - [响应验证](#响应验证) | ||
| 8 | - [本地运行](#本地运行) | ||
| 9 | - [Jenkins执行](#jenkins执行) | ||
| 10 | - [常见问题](#常见问题) | ||
| 11 | - [最佳实践](#最佳实践) | ||
| 12 | |||
| 13 | --- | ||
| 14 | |||
| 15 | ## 🌍 多环境执行 | ||
| 16 | |||
| 17 | ### 支持的环境 | ||
| 18 | |||
| 19 | | 环境 | 标识 | IP | 用途 | | ||
| 20 | |------|------|------|------| | ||
| 21 | | **测试** | test | ai-test.hikoon.com | 开发和初始测试 | | ||
| 22 | | **UAT** | uat | ai-uat.hikoon.com | 用户验收测试 | | ||
| 23 | | **生产** | prod | api.hikoon.com | 生产环境验证 | | ||
| 24 | |||
| 25 | ### 如何在不同环境运行 | ||
| 26 | |||
| 27 | **设置环境变量 DEPLOY_ENV**,然后运行测试: | ||
| 28 | |||
| 29 | ```bash | ||
| 30 | # 测试环境 | ||
| 31 | export DEPLOY_ENV=test | ||
| 32 | python3 api_test.py | ||
| 33 | |||
| 34 | # UAT环境 | ||
| 35 | export DEPLOY_ENV=uat | ||
| 36 | python3 api_test.py | ||
| 37 | |||
| 38 | # 生产环境 | ||
| 39 | export DEPLOY_ENV=prod | ||
| 40 | python3 api_test.py | ||
| 41 | ``` | ||
| 42 | |||
| 43 | **说明**: | ||
| 44 | - 默认环境为 `test`(如不设置 DEPLOY_ENV) | ||
| 45 | - IP_HOST 会根据环境从 `env_config.py` 中自动选择 | ||
| 46 | - 可通过环境变量 `IP_HOST` 覆盖配置的地址 | ||
| 47 | |||
| 48 | --- | ||
| 49 | |||
| 50 | ## 📊 用例管理 | ||
| 51 | |||
| 52 | ### env_scope 列说明 | ||
| 53 | |||
| 54 | 每个用例都有一个 `env_scope` 字段,用于控制在哪些环境中执行该用例。 | ||
| 55 | |||
| 56 | #### env_scope 取值 | ||
| 57 | |||
| 58 | | 值 | 含义 | 执行结果 | | ||
| 59 | |----|------|---------| | ||
| 60 | | 留空 或 `all` | 所有环境执行 | test✅ / uat✅ / prod✅ | | ||
| 61 | | `test` | 仅测试环境 | test✅ / uat⏭️ / prod⏭️ | | ||
| 62 | | `uat` | 仅UAT环境 | test⏭️ / uat✅ / prod⏭️ | | ||
| 63 | | `prod` | 仅生产环境 | test⏭️ / uat⏭️ / prod✅ | | ||
| 64 | | `test,uat` | 测试+UAT | test✅ / uat✅ / prod⏭️ | | ||
| 65 | | `test,prod` | 测试+生产 | test✅ / uat⏭️ / prod✅ | | ||
| 66 | |||
| 67 | #### 添加 env_scope 列 | ||
| 68 | |||
| 69 | **首次使用**,需要在 Excel 表格中手动添加 `env_scope` 列: | ||
| 70 | |||
| 71 | 1. 打开 `api_cases.xlsx` | ||
| 72 | 2. 在最后一列后添加新列 | ||
| 73 | 3. 列头命名为:`env_scope` | ||
| 74 | 4. 为所有数据行填入相应的值 | ||
| 75 | 5. 保存文件 | ||
| 76 | |||
| 77 | #### 编辑 env_scope 值 | ||
| 78 | |||
| 79 | 根据用例特性设置相应的环境范围 | ||
| 80 | |||
| 81 | ### is_run 字段 | ||
| 82 | |||
| 83 | 原有的 `is_run` 字段仍然保留: | ||
| 84 | - `is_run = 0` 或**留空** → 执行该用例(受env_scope影响) | ||
| 85 | - `is_run = 1` → 在**所有环境**都跳过该用例 | ||
| 86 | |||
| 87 | **执行优先级**:`is_run = 1` → 跳过 → 检查 env_scope → 决定是否执行 | ||
| 88 | |||
| 89 | --- | ||
| 90 | |||
| 91 | ## ✅ 响应验证 | ||
| 92 | |||
| 93 | ### expected_response 字段 | ||
| 94 | |||
| 95 | 支持多种关系运算符,提供灵活的响应验证。 | ||
| 96 | |||
| 97 | #### 支持的运算符 | ||
| 98 | |||
| 99 | - `$eq`: 等于 | ||
| 100 | - `$ne`: 不等于 | ||
| 101 | - `$gt`: 大于 | ||
| 102 | - `$gte`: 大于等于 | ||
| 103 | - `$lt`: 小于 | ||
| 104 | - `$lte`: 小于等于 | ||
| 105 | - `$in`: 值在列表中 | ||
| 106 | - `$nin`: 值不在列表中 | ||
| 107 | - `$contains`: 字符串包含 | ||
| 108 | - `$not_contains`: 字符串不包含 | ||
| 109 | - `$regex`: 正则表达式匹配 | ||
| 110 | - `$range`: 范围判断 [min, max] | ||
| 111 | |||
| 112 | #### 使用示例 | ||
| 113 | |||
| 114 | ```json | ||
| 115 | { | ||
| 116 | "code": {"$ne": 500}, | ||
| 117 | "count": {"$gt": 0}, | ||
| 118 | "status": {"$in": ["ok", "done"]}, | ||
| 119 | "msg": {"$contains": "success"}, | ||
| 120 | "email": {"$regex": "^.*@.*$"}, | ||
| 121 | "age": {"$range": [18, 100]} | ||
| 122 | } | ||
| 123 | ``` | ||
| 124 | |||
| 125 | --- | ||
| 126 | |||
| 127 | ## 🏃 本地运行 | ||
| 128 | |||
| 129 | ### 基础运行 | ||
| 130 | |||
| 131 | ```bash | ||
| 132 | # 1. 激活虚拟环境 | ||
| 133 | source venv/bin/activate # Linux/Mac | ||
| 134 | # 或 | ||
| 135 | .\venv\Scripts\activate # Windows | ||
| 136 | |||
| 137 | # 2. 设置环境(可选,默认test) | ||
| 138 | export DEPLOY_ENV=test | ||
| 139 | |||
| 140 | # 3. 运行测试 | ||
| 141 | python3 api_test.py | ||
| 142 | ``` | ||
| 143 | |||
| 144 | --- | ||
| 145 | |||
| 146 | ## 🔗 Jenkins执行 | ||
| 147 | |||
| 148 | ### 参数化Build | ||
| 149 | |||
| 150 | Jenkins中已配置参数化执行,选择不同的环境: | ||
| 151 | |||
| 152 | 1. 进入Jenkins Job页面 | ||
| 153 | 2. 点击 **Build with Parameters** | ||
| 154 | 3. 选择 **DEPLOY_ENV**: test / uat / prod | ||
| 155 | 4. 点击 **Build** 开始执行 | ||
| 156 | |||
| 157 | --- | ||
| 158 | |||
| 159 | ## 🆘 常见问题 | ||
| 160 | |||
| 161 | ### Q1: 所有用例都被跳过了 | ||
| 162 | |||
| 163 | **原因**:DEPLOY_ENV 未设置或 env_scope 不匹配 | ||
| 164 | |||
| 165 | **解决**: | ||
| 166 | ```bash | ||
| 167 | export DEPLOY_ENV=test | ||
| 168 | python3 api_test.py | ||
| 169 | ``` | ||
| 170 | |||
| 171 | ### Q2: 如何在生产环境禁用某些用例 | ||
| 172 | |||
| 173 | 设置 `env_scope = test,uat`(只在测试和UAT执行) | ||
| 174 | |||
| 175 | ### Q3: 支持哪些 env_scope 值的组合 | ||
| 176 | |||
| 177 | 支持:all / test / uat / prod 及其组合(用逗号分隔) | ||
| 178 | |||
| 179 | ### Q4: is_run 和 env_scope 的关系 | ||
| 180 | |||
| 181 | `is_run=1` 时总是跳过;`is_run=0` 时检查 `env_scope` | ||
| 182 | |||
| 183 | ### Q5: 如何提取变量供后续用例使用 | ||
| 184 | |||
| 185 | 在 `extract_vars` 列中定义:`user_id=data.user_id` | ||
| 186 | |||
| 187 | --- | ||
| 188 | |||
| 189 | ## 🎯 最佳实践 | ||
| 190 | |||
| 191 | ### ✅ 推荐做法 | ||
| 192 | |||
| 193 | 1. **明确标记env_scope**:all / test / uat / prod(避免留空) | ||
| 194 | 2. **生产环境谨慎操作**:危险操作设置为 `test,uat` | ||
| 195 | 3. **定期审查配置**:检查过期的env_scope设置 | ||
| 196 | 4. **使用关系运算符**:灵活的验证而非硬编码 | ||
| 197 | |||
| 198 | ### ❌ 避免做法 | ||
| 199 | |||
| 200 | 1. **混乱地使用 is_run 和 env_scope** | ||
| 201 | 2. **在生产执行数据修改操作** | ||
| 202 | 3. **忘记为新增用例设置 env_scope** | ||
| 203 | 4. **大小写混乱的值** | ||
| 204 | |||
| 205 | --- | ||
| 206 | |||
| 207 | **祝你使用愉快!** 🎉 |
api_cases.xlsx
0 → 100644
No preview for this file type
api_test.py
0 → 100644
This diff is collapsed.
Click to expand it.
docker-compose.yml
0 → 100644
| 1 | version: '3.8' | ||
| 2 | |||
| 3 | services: | ||
| 4 | api-test-runner: | ||
| 5 | build: | ||
| 6 | context: . | ||
| 7 | dockerfile: Dockerfile | ||
| 8 | container_name: api-test-${DEPLOY_ENV:-test} | ||
| 9 | environment: | ||
| 10 | - DEPLOY_ENV=${DEPLOY_ENV:-test} | ||
| 11 | - IP_HOST=${IP_HOST:-} | ||
| 12 | - PYTHONUNBUFFERED=1 | ||
| 13 | volumes: | ||
| 14 | - ./api_cases.xlsx:/app/api_cases.xlsx:ro | ||
| 15 | - ./env_config.py:/app/env_config.py:ro | ||
| 16 | - ./reports:/app | ||
| 17 | networks: | ||
| 18 | - api-test-network | ||
| 19 | deploy: | ||
| 20 | resources: | ||
| 21 | limits: | ||
| 22 | cpus: '1' | ||
| 23 | memory: 512M | ||
| 24 | reservations: | ||
| 25 | cpus: '0.5' | ||
| 26 | memory: 256M | ||
| 27 | restart: no | ||
| 28 | logging: | ||
| 29 | driver: "json-file" | ||
| 30 | options: | ||
| 31 | max-size: "10m" | ||
| 32 | max-file: "3" | ||
| 33 | |||
| 34 | networks: | ||
| 35 | api-test-network: | ||
| 36 | driver: bridge |
env_config.py
0 → 100644
| 1 | import os | ||
| 2 | import random | ||
| 3 | import string | ||
| 4 | from datetime import datetime | ||
| 5 | |||
| 6 | # 多环境IP配置 | ||
| 7 | DEPLOY_ENV = os.getenv('DEPLOY_ENV', 'test') | ||
| 8 | IP_HOST_MAP = { | ||
| 9 | 'test': 'ai-test.hikoon.com', | ||
| 10 | 'uat': 'ai-uat.hikoon.com', | ||
| 11 | 'prod': 'api.hikoon.com' | ||
| 12 | } | ||
| 13 | IP_HOST = os.getenv('IP_HOST', IP_HOST_MAP.get(DEPLOY_ENV, 'ai-test.hikoon.com')) | ||
| 14 | |||
| 15 | # 当前日期(格式:YY-MM-DD) | ||
| 16 | CURRENT_DATE = datetime.now().strftime('%y-%m-%d') | ||
| 17 | |||
| 18 | def gen_email(): | ||
| 19 | prefix = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8)) | ||
| 20 | domain = random.choice(['@qq.com', '@163.com', '@gmail.com', '@test.com']) | ||
| 21 | return prefix + domain | ||
| 22 | |||
| 23 | RANDOM_EMAIL = gen_email() |
requirements.txt
0 → 100644
-
Please register or sign in to post a comment