# api_automation_test **Repository Path**: zhouzy_99/api_automation_test ## Basic Information - **Project Name**: api_automation_test - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-17 - **Last Updated**: 2026-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # API Automation Test Framework 基于 Python + pytest 的 API 自动化测试框架,支持多环境配置、参数化测试、数据驱动、Mock服务等功能。 ## 功能特性 - **多环境支持**: 开发、测试、生产环境配置 - **参数化测试**: 灵活的数据驱动测试 - **响应验证**: JSON Schema 验证、状态码验证、时间验证 - **数据工厂**: 自动生成测试数据 - **Mock服务**: 模拟 HTTP 响应,离线测试 - **测试隔离**: 独立的 API 客户端,避免测试间干扰 - **日志增强**: 请求/响应自动记录到 Allure 报告 - **并发执行**: 支持多线程并行测试 ## 项目结构 ``` api_automation_test/ ├── business/ # 业务层 │ ├── api_client.py # API 客户端封装 │ └── auth_service.py # 认证服务 ├── config/ # 配置模块 │ ├── config.py # 配置管理类 │ └── config.yaml # 配置文件 ├── data/ # 数据模块 │ ├── data_manager.py # 测试数据管理 │ ├── data_factory.py # 测试数据工厂 │ └── test_data.json # 测试数据文件 ├── testcases/ # 测试用例 │ ├── test_auth.py # 认证测试 │ ├── test_project.py # 项目测试 │ └── test_enhanced.py # 增强测试示例 ├── utils/ # 工具模块 │ ├── logger.py # 日志工具 │ ├── exceptions.py # 自定义异常 │ ├── validator.py # 响应验证器 │ ├── parametrize.py # 参数化工具 │ ├── hooks.py # 日志Hook │ └── mock.py # Mock服务 ├── conftest.py # pytest配置 ├── pytest.ini # pytest设置 └── requirements.txt # 依赖列表 ``` ## 快速开始 ### 1. 安装依赖 ```bash pip install -r requirements.txt ``` ### 2. 配置环境 编辑 `config/config.yaml` 配置文件: ```yaml development: base_url: "http://localhost:8000" api_prefix: "/api" timeout: 30 retry_count: 3 headers: Content-Type: "application/json" auth: username: "admin" password: "password123" ``` ### 3. 运行测试 ```bash # 运行所有测试 pytest # 运行指定测试 pytest testcases/test_auth.py # 运行冒烟测试 pytest -m smoke # 并行执行 pytest -n auto # 生成Allure报告 allure serve ./allure-results ``` ## 模块详细说明 ### Config 模块 `config/config.py` - 配置管理类 - `get_base_url()`: 获取基础URL - `get_api_prefix()`: 获取API前缀 - `get_timeout()`: 获取超时时间 - `get_retry_count()`: 获取重试次数 - `set_env(env)`: 切换环境 ### Business 模块 `business/api_client.py` - API 客户端 ```python from business import api_client # 发送请求 response = api_client.get('/users') response = api_client.post('/login', json={'username': 'admin'}) response = api_client.put('/users/1', json={'name': 'test'}) response = api_client.delete('/users/1') # 认证 api_client.set_auth('token') api_client.clear_auth() ``` `business/auth_service.py` - 认证服务 ```python from business import auth_service # 登录 response = auth_service.login('admin', 'password123') # 获取token token = auth_service.get_token('admin', 'password123') # 获取有效token token = auth_service.get_valid_token() # 登出 auth_service.logout() ``` ### Data 模块 `data/data_manager.py` - 测试数据管理 ```python from data import data_manager # 获取测试数据 credentials = data_manager.get_test_data('auth', 'valid_credentials') project_data = data_manager.get_test_data('project', 'create', 'valid') ``` `data/data_factory.py` - 测试数据工厂 ```python from data import data_factory # 生成随机数据 user = data_factory.generate_user_data() project = data_factory.generate_project_data() interface = data_factory.generate_interface_data() # 批量生成 users = data_factory.generate_batch(10, data_factory.generate_user_data) ``` ### Utils 模块 `utils/validator.py` - 响应验证器 ```python from utils import response_validator # 验证状态码 response_validator.validate_status(response, 200) # 验证JSON键 response_validator.validate_json_key(response, 'access_token') # 验证JSON值 response_validator.validate_json_value(response, 'status', 'active') # 验证JSON Schema schema = { "type": "object", "properties": { "access_token": {"type": "string"} }, "required": ["access_token"] } response_validator.validate_json_schema(response, schema) # 验证响应时间 response_validator.validate_response_time(response, max_seconds=5) ``` `utils/mock.py` - Mock服务 ```python from utils import mock_api, api_mock # 使用装饰器Mock @mock_api('GET', 'http://api.example.com/users', json={'users': []}) def test_users(): response = api_client.get('http://api.example.com/users') assert response.status_code == 200 # 使用预设Mock @mock_api(**api_mock.mock_login_success()) def test_login(): ... # 使用MockServer from utils import MockServer with MockServer() as mock: mock.add('GET', 'http://test.com/users', json={'data': []}) response = api_client.get('http://test.com/users') ``` `utils/hooks.py` - 日志Hook ```python from utils import request_hook, validation_hook # 记录请求响应 request_hook.attach_request('POST', url, json_data=payload) request_hook.attach_response(response) # 记录验证结果 validation_hook.attach_validation_result('status', 200, response.status_code, True) ``` `utils/parametrize.py` - 参数化工具 ```python from utils.parametrize import TestDataGenerator, get_case_ids # 使用数据生成器 @pytest.mark.parametrize('case', TestDataGenerator.generate_login_cases(), ids=get_case_ids(TestDataGenerator.generate_login_cases())) def test_login(case): ... ``` ### Fixtures `conftest.py` 提供的常用 Fixture: | Fixture | 作用域 | 说明 | |---------|--------|------| | `api_client_fixture` | session | API客户端实例 | | `auth_service_fixture` | session | 认证服务实例 | | `auth_token` | session | 认证令牌 | | `reset_api_client` | function | 重置认证信息 | | `test_config` | session | 测试配置 | | `isolated_api_client` | function | 隔离的API客户端 | | `generated_user` | function | 随机生成的用户 | | `generated_project` | function | 随机生成的项目 | | `generated_interface` | function | 随机生成的接口 | | `mock_response` | function | Mock响应对象 | ### 标记(Markers) ```python @pytest.mark.smoke # 冒烟测试 @pytest.mark.regression # 回归测试 @pytest.mark.slow # 慢速测试 @pytest.mark.parallel # 支持并行执行 ``` ## 测试示例 ### 基础测试 ```python import pytest import allure @allure.feature('认证功能') @allure.story('登录') class TestAuth: @allure.title('测试有效凭证登录') def test_login_success(self, api_client_fixture): response = api_client_fixture.post( 'auth/login', json={'username': 'admin', 'password': 'password123'} ) assert response.status_code == 200 assert 'access_token' in response.json() ``` ### 参数化测试 ```python @pytest.mark.parametrize('username,password,expected', [ ('admin', 'password123', 200), ('invalid', 'wrong', 401), ('', 'password123', 400), ], ids=['valid', 'invalid', 'empty_user']) def test_login(username, password, expected, api_client_fixture): response = api_client_fixture.post( 'auth/login', json={'username': username, 'password': password} ) assert response.status_code == expected ``` ### 带验证的测试 ```python from utils import response_validator def test_validate_response(api_client_fixture): response = api_client_fixture.get('users/1') response_validator.validate_status(response, 200) response_validator.validate_json_key(response, 'id') response_validator.validate_response_time(response, max_seconds=3) ``` ### Mock测试 ```python from utils import mock_api @mock_api('GET', 'http://api.example.com/users', json={'users': []}) def test_mock_users(api_client_fixture): response = api_client_fixture.get('http://api.example.com/users') assert response.status_code == 200 ``` ## 配置说明 ### pytest.ini ```ini [pytest] testpaths = testcases addopts = -v --alluredir=./allure-results --tb=short markers = smoke: 冒烟测试 regression: 回归测试 log_cli = true timeout = 300 ``` ### 环境变量 ```bash # 切换环境 export TEST_ENV=production # 或 set TEST_ENV=production ``` ## 依赖清单 | 依赖 | 版本 | 说明 | |------|------|------| | pytest | 7.4.3 | 测试框架 | | requests | 2.31.0 | HTTP客户端 | | PyYAML | 6.0.1 | YAML解析 | | allure-pytest | 2.13.2 | 报告生成 | | jsonschema | 4.20.0 | Schema验证 | | Faker | 20.1.0 | 数据生成 | | pytest-xdist | 3.5.0 | 并行执行 | | responses | 0.24.1 | Mock支持 | ## 常见问题 ### Q: 如何添加新的测试数据? A: 在 `data/test_data.json` 中添加,或使用 `data_factory` 生成随机数据。 ### Q: 如何处理需要认证的接口? A: 使用 `api_client_with_auth` fixture 或手动调用 `api_client.set_auth(token)`。 ### Q: 如何跳过某些测试? A: 使用 `@pytest.mark.skip` 或 `@pytest.mark.skipif`。 ### Q: 如何调试失败的测试? A: 使用 `-v -s` 参数查看详细输出,或查看 `logs/test.log`。 ## 贡献指南 1. Fork 本项目 2. 创建特性分支 (`git checkout -b feature/xxx`) 3. 提交更改 (`git commit -m 'Add xxx'`) 4. 推送分支 (`git push origin feature/xxx`) 5. 创建 Pull Request