# shadow_api_auto_test
**Repository Path**: yingzi_shadow/shadow_api_auto_test
## Basic Information
- **Project Name**: shadow_api_auto_test
- **Description**: 基于 Python 技术栈的通用接口自动化测试框架,支持多种测试用例格式、消息推送、测试报告生成等功能。
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-04-10
- **Last Updated**: 2026-07-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# API 自动化测试框架
基于 Python 技术栈的通用接口自动化测试框架,支持多种测试用例格式、消息推送、测试报告生成等功能。
## 功能特性
- ✅ 封装公共通用方法
- ✅ 支持接口用例之间的关联复用
- ✅ 测试用例支持 JSON/Excel/YAML/Py 格式
- ✅ **智能消息推送**(邮件/钉钉/飞书/企微,Markdown 模板,变量自动替换)
- ✅ 参数化可配置
- ✅ **支持 unittest、pytest 和混合模式三种执行方式**
- ✅ **强大的 Mock 服务**(HTTP 级别 + 对象级别)
- ✅ **Mock 端口配置化**(支持自定义端口)
- ✅ **内置 Allure 工具**(无需系统安装)
- ✅ 支持假数据生成
- ✅ 支持错误重试机制
- ✅ 支持多线程执行
- ✅ **灵活的 Mock 启用/禁用控制**
## 项目结构
```
api_auto_test/
├── __init__.py
├── common/ # 公共通用方法
│ ├── __init__.py
│ ├── request.py # 请求封装
│ ├── log.py # 日志管理
│ ├── data_manager.py # 数据管理
│ ├── case_relation.py # 用例关联管理
│ ├── mock.py # Mock 服务(HTTP + 对象级别)
│ ├── mock_helper.py # Mock 辅助工具(新增)
│ └── utils.py # 工具类(假数据生成等)
├── config/ # 配置文件
│ ├── __init__.py
│ ├── config.py # 配置类
│ └── config.yaml # 配置文件(含 Mock 端口配置)
├── data/ # 测试数据
│ └── __init__.py
├── push/ # 消息推送
│ ├── __init__.py
│ ├── templates/ # Markdown 消息模板(新增)
│ │ ├── dingtalk.md
│ │ ├── feishu.md
│ │ └── wecom.md
│ ├── template_manager.py # 模板管理器(新增)
│ ├── email.py # 邮件推送
│ ├── dingtalk.py # 钉钉推送
│ ├── feishu.py # 飞书推送
│ ├── wecom.py # 企微推送
│ └── push_manager.py # 推送管理
├── reports/ # 测试报告
│ └── __init__.py
├── runner/ # 测试运行器
│ ├── __init__.py
│ ├── runner.py # 运行器
│ └── allure/ # 内置 Allure 工具
│ ├── bin/
│ ├── config/
│ ├── lib/
│ └── plugins/
├── test_cases/ # 测试用例
│ ├── __init__.py
│ ├── base_test.py # 测试基类(支持 Mock 启用/禁用)
│ ├── test_pytest_mock_example.py # Pytest Mock 示例
│ ├── test_unittest_mock_example.py # Unittest Mock 示例
│ ├── test_disable_mock_example.py # 禁用 Mock 示例
│ └── test_without_mock.py # 不使用 Mock 示例
├── main.py # 主入口
└── requirements.txt # 依赖文件
```
## 安装依赖
```bash
pip install -r requirements.txt
```
## 配置说明
修改 `config/config.yaml` 文件,配置以下内容:
### 基础配置
- `base_url`: API 基础 URL
- `timeout`: 请求超时时间
- `verify_ssl`: 是否验证 SSL
- `test_runner`: 测试运行器(**pytest** / **unittest** / **mixed**)
- `pytest`: 只运行 pytest 测试
- `unittest`: 只运行 unittest 测试
- `mixed`: 混合模式,先运行 unittest 再运行 pytest,合并结果
- `retry_count`: 错误重试次数
- `retry_interval`: 重试间隔(秒)
- `thread_count`: 线程数
### 项目信息配置
```yaml
project:
name: "API自动化测试项目" # 项目名称
environment: "test" # 运行环境:test(测试)/uat(预发布)/prod(生产)
executor: "" # 执行人(留空则显示"🤖 自动触发")
title: "API自动化测试报告" # 测试报告标题(用于HTML报告和消息推送)
```
**注意**:`title` 字段统一控制 HTML 报告标题和消息推送中的报告标题。
### Mock 服务配置(新增)
```yaml
mock_server:
host: "localhost"
port: 8899 # Mock 服务器端口,可自定义
```
### 测试报告配置
```yaml
reports:
allure: false # 是否生成 Allure 报告
html: true # 是否生成 HTML 报告
report_url: "https://example.com/reports/html/report.html" # 报告访问地址(可选)
pytest_xhtml:
css: [] # 自定义 CSS 文件列表
xtestrunner:
description: "API自动化测试报告" # 报告描述
language: "zh-CN" # 语言:zh-CN(中文) / en(英文)
retry: 0 # 重试次数
```
**report_url 说明**:
- 用于消息推送中的报告链接
- 如果不配置,将自动使用 `base_url + /reports/html/report.html`
- 建议配置为实际的报告服务器地址,如 CI/CD 平台的报告 URL
**title 配置说明**:
- 报告标题已从 `reports.xtestrunner.title` 移动到 `project.title`
- 统一控制 XTestRunner HTML 报告标题和所有消息推送中的报告标题
- 修改一处即可同时影响所有地方
## 运行测试
```bash
python main.py
```
## 测试用例编写
### Python 格式测试用例
```python
import pytest
import allure
from test_cases.base_test import PytestBaseTest
from common.utils import utils
class TestExample(PytestBaseTest):
@allure.feature("Example API")
@allure.story("GET request")
def test_get_request(self):
response = self.send_request('get', '/get', params={'key': 'value'})
assert response.status_code == 200
assert response.json().get('args') == {'key': 'value'}
```
### YAML 格式测试用例
创建 `data/test_cases.yaml` 文件:
```yaml
test_cases:
- name: "GET request"
feature: "Example API"
story: "GET request"
method: "get"
url: "/get"
params: {"key": "value"}
assert:
status_code: 200
json.args.key: "value"
```
### JSON 格式测试用例
创建 `data/test_cases.json` 文件:
```json
{
"test_cases": [
{
"name": "GET request",
"feature": "Example API",
"story": "GET request",
"method": "get",
"url": "/get",
"params": {"key": "value"},
"assert": {
"status_code": 200,
"json.args.key": "value"
}
}
]
}
```
### Excel 格式测试用例
创建 `data/test_cases.xlsx` 文件,包含以下列:
- name: 测试用例名称
- feature: 功能模块
- story: 测试场景
- method: 请求方法
- url: 请求路径
- params: 请求参数(JSON 格式)
- json: 请求体(JSON 格式)
- headers: 请求头(JSON 格式)
- assert: 断言(JSON 格式)
## 高级功能
### 错误重试机制
在 `common/request.py` 中已实现错误重试机制,可在配置文件中设置重试次数和间隔时间。
### 多线程执行
在 `runner/runner.py` 中已实现多线程执行测试用例的功能,可在配置文件中设置线程数。
### Mock 服务(增强版)
#### 1. HTTP Mock 服务器
**方式一:使用辅助函数(推荐)**
```python
from common.mock_helper import mock_get, mock_post, mock_put, mock_delete
from common.mock import mock_server
# 设置 Mock 响应
mock_server.set_mock_response('/api/users', {
'status_code': 200,
'body': {'users': [{'id': 1, 'name': 'Alice'}]}
})
# 发送请求(自动使用配置的端口)
response = mock_get('/api/users')
assert response.status_code == 200
```
**方式二:动态回调**
```python
from common.mock import mock_server, MockResponse
def user_handler(method, headers, body, query_params):
if method == 'POST' and body.get('name'):
return MockResponse(
status_code=201,
body={'id': 123, 'name': body['name'], 'created': True}
)
return {'error': 'Invalid request'}
mock_server.set_mock_callback('/api/users', user_handler)
```
**方式三:获取 Mock URL**
```python
from common.mock_helper import get_mock_url
import httpx
url = get_mock_url('/api/users') # http://localhost:8899/api/users
response = httpx.get(url)
```
#### 2. 对象级别 Mock(UnitTestMock)
```python
from common.mock import mock_helper
# 创建 Mock 对象
api_mock = mock_helper.create_mock(name='api_client')
api_mock.get_user.return_value = {'id': 1, 'name': 'test'}
# 使用 Mock
result = api_mock.get_user(123)
assert result == {'id': 1, 'name': 'test'}
# 验证调用
assert mock_helper.verify_call(api_mock, call_count=1)
```
#### 3. 禁用 Mock 服务
如果某些测试类不需要 Mock,可以禁用:
```python
from test_cases.base_test import PytestBaseTest
class TestRealAPI(PytestBaseTest):
_enable_mock = False # 禁用 Mock
def test_real_api(self):
# 这个测试会调用真实 API
response = self.send_request('get', 'https://httpbin.org/get')
assert response.status_code == 200
```
#### 4. Mock 配置说明
- **端口配置**:在 `config.yaml` 中修改 `mock_server.port`
- **自动管理**:继承基类后,Mock 服务器自动启动/停止
- **用例隔离**:每个测试用例后自动清理 Mock 数据
- **灵活控制**:通过 `_enable_mock` 标志位选择性启用
### 假数据生成
```python
from common.utils import utils
# 生成随机字符串
random_str = utils.generate_random_string(10)
# 生成随机邮箱
random_email = utils.generate_random_email()
# 生成随机手机号
random_phone = utils.generate_random_phone()
# 生成随机数字
random_number = utils.generate_random_number(1, 100)
# 生成随机日期
random_date = utils.generate_random_date()
# 生成随机布尔值
random_bool = utils.generate_random_boolean()
```
### 用例关联
```python
# 在第一个测试用例中提取变量
user_id = response.json().get('id')
self.extract_variable('user_id', user_id)
# 在第二个测试用例中使用变量
user_id = self.get_variable('user_id')
assert user_id is not None
```
## 测试报告
### Allure 报告(无需安装)
项目已内置 Allure 工具(`runner/allure/`),**无需系统安装**即可生成报告:
```bash
python main.py
```
Allure 会自动从项目目录执行,生成的报告位于:
- `reports/allure-results/`: Allure 原始数据
- `reports/allure-report/`: Allure HTML 报告
**自动打开报告**:测试完成后,Allure 报告会**自动在浏览器中打开**,无需手动操作。
如需手动打开报告:
```bash
# 使用内置 Allure 打开报告
runner/allure/bin/allure.bat open reports/allure-report # Windows
runner/allure/bin/allure open reports/allure-report # Linux/Mac
# 或者直接使用 allure open 命令
allure open reports/allure-report
```
### HTML 报告
- `reports/html/report.html`: XTestRunner 生成的 HTML 报告
### 报告配置
在 `config.yaml` 中配置:
```yaml
reports:
allure: true # 启用 Allure 报告
html: true # 启用 HTML 报告
```
## 消息推送
测试完成后会自动发送格式化的测试报告,支持以下推送方式:
- **邮件推送** - HTML 格式,包含项目信息和测试结果表格
- **钉钉推送** - Markdown 格式,支持富文本展示
- **飞书推送** - Post 富文本格式
- **企微推送** - Markdown 格式
### 消息特性
✅ **Markdown 模板**:各平台有独立的 Markdown 模板文件(`push/templates/`)
✅ **变量自动替换**:从 `config.yaml` 自动读取项目信息,测试开始时自动记录时间
✅ **智能显示**:邮件 HTML 会隐藏值为 0 的字段,保持消息简洁
✅ **Allure 兼容**:完整支持 Allure 的所有状态(passed/failed/broken/skipped/unknown)
✅ **通过率计算**:基于执行的用例数(排除跳过和未知),更准确反映测试质量
### 配置示例
```yaml
# config.yaml
# 项目信息(会在消息中显示)
project:
name: "API自动化测试项目"
environment: "测试环境"
executor: "" # 留空则显示“🤖 自动触发”
# 启用推送
push:
email: false
dingtalk: true
feishu: false
wecom: true
# 钉钉配置
dingtalk:
webhook: "https://oapi.dingtalk.com/robot/send?access_token=xxx"
secret: "your_secret"
# 企业微信配置
wecom:
webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"
```
### 消息内容示例
**钉钉/企微收到的消息**:
```
## 📊 API自动化测试报告
### 📋 项目信息
| 项目 | 值 |
|------|------|
| 项目名称 | API自动化测试项目 |
| 运行环境 | 测试环境 |
| 执行人 | 🤖 自动触发 |
| 开始时间 | 2026-04-14 12:00:00 |
### ✅ 测试结果概览
| 指标 | 数量 |
|------|------|
| 📊 用例总数 | 35 |
| ✅ 通过 | 24 |
| ❌ 失败 | 6 |
| 💥 中断 | 3 |
| ⏭️ 跳过 | 2 |
| ⏱️ 耗时 | 180s |
### 📈 成功率
**通过率**: 72.73%
```
详细使用说明请参考:[push/TEMPLATES_GUIDE.md](push/TEMPLATES_GUIDE.md)
## 配置示例
项目提供了完整的配置示例文件 `config/config.example.yaml`,包含:
- ✅ 所有配置项的详细说明
- ✅ 合理的默认值
- ✅ 安全建议(敏感信息使用占位符)
- ✅ 最佳实践指南
**快速开始**:
```bash
# 复制示例文件
cp config/config.example.yaml config/config.yaml
# 编辑配置文件,根据实际情况修改
# 然后运行测试
python main.py
```
详细配置说明请参考:[config/config.example.yaml](config/config.example.yaml)
## 注意事项
1. **Allure 工具**:项目已内置 Allure,无需系统安装。如需使用系统版本,确保其在 PATH 中
2. **Mock 端口**:默认端口为 8899,可在 `config.yaml` 中修改。如端口冲突,请更换端口
3. **消息推送**:需要在配置文件中启用并配置相应的服务参数。支持自定义 Markdown 模板(见 `push/templates/`)
4. **多线程执行**:可能会影响测试稳定性,建议根据实际情况调整线程数
5. **Mock 启用控制**:通过 `_enable_mock = False` 可以禁用特定测试类的 Mock 服务
6. **URL 管理**:推荐使用 `mock_helper` 辅助函数,避免硬编码 URL
7. **执行人配置**:在 `config.yaml` 中配置 `project.executor`,留空则显示"🤖 自动触发"
8. **报告标题**:统一使用 `project.title` 配置,同时影响 HTML 报告和消息推送
9. **邮件端口**:QQ 邮箱使用端口 587(STARTTLS),如需使用 SSL 请改为端口 465
10. **配置示例**:首次使用建议参考 `config/config.example.yaml` 文件
## 联系方式
如有问题或建议,欢迎通过 Issue 反馈。
作者:影子
邮箱:yingzilkq@163.com
Gitee仓库地址:https://gitee.com/yingzi_shadow/shadow_api_auto_test
GitHub仓库地址:https://github.com/likangcai/shadow_api_auto_test
微信公众号:前行的影子