# API_automation_py **Repository Path**: FuKaiZHANG/API_automation_py ## Basic Information - **Project Name**: API_automation_py - **Description**: 基于python+pytest+requests+allure+log+Redis+MySQL+邮件\钉钉\通知的API自动化测试框架,使用Redis作为用例池,将用例的加载,校验和执行解耦。支持变量提取,多接口依赖处理 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-11-20 - **Last Updated**: 2025-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 框架介绍 > 基于python+pytest+requests+allure+log+Redis+MySQL+邮件通知+Jenkins实现的API自动化测试框架 ##### 框架目录 ``` #框架目录展示 ├─config #配置层 │ │ config.yaml #系统配置文件 │ │ setting.py │ │ global_config.py │ │ ├─files #文件 │ ├─logs #日志 │ ├─report #测试报告 │ ├─html #HTML格式报告 │ ├─tmp #临时JSON数据文件 │ ├─test_case #测试用例层 │ │ test_login_case.py │ │ test_check_info.py │ │ ├─test_case_data #测试用例数据 │ └─User │ │ login.yaml │ │ getinfo.yaml │ ├─utils # 工具层 │ │ __init__.py #加载所有用到到缓存 │ │ │ ├─cache_tools #缓存控制层 │ │ │ cache_control.py #缓存控制(全局变量存储) │ │ │ case_cache_control.py #用例缓存 │ │ │ redis_control.py #Redis连接控制 │ │ │ __init__.py │ ├─file_operation #文件操作 │ │ │ excel_control.py #Excel文件读写 │ │ │ get_all_file_path.py #获取指定路径下所有文件 │ │ │ get_case_yaml_analysis.py #读取yaml用例文件并校验 │ │ │ yaml_control.py #yaml文件读写 │ │ │ __init__.py │ ├─logging_tools #日志控制层 │ │ │ log_control.py # │ │ │ log_decorator.py #日志装饰器(请求发送) │ │ │ __init__.py │ ├─mysql_tools #数据库 │ │ │ mysql_control.py #MySQL连接控制 │ │ │ __init__.py │ ├─notification_tools #消息通知 │ │ │ send_email.py #邮件发送 │ │ │ send_dingtalk.py #钉钉消息发送 │ │ │ message_template.py #消息通知的字符串模板 │ │ │ __init__.py │ ├─other_tools │ │ │ allure_report_data.py #获取allure中case的执行状态 │ │ │ allure_server.py #启动allure服务 │ │ │ error_case_excel.py #统计错误用例到excel │ │ │ file_zip.py #文件压缩 │ │ │ __init__.py │ │ │ 自动化异常测试用例模板.xlsx │ ├─request_tools #requests 封装 │ │ │ case_run_time_decorator.py#请求时长控制 │ │ │ request_control.py #请求发送(二次封装) │ │ │ __init__.py │ ├─testcase_loader #测试用例加载 │ │ │ loader_case.py │ │ │ __init__.py │ ├─variable_handling #变量处理 │ │ │ json_extract.py │ │ │ relpace_variable.py │ │ │ __init__.py │ ├─models #数据模型 │ │ │ models.py │ │ │ __init__.py │ ├─pytest.ini #pytest配置文件 ├─start_run_all_case.py #用例执行总入口 ├─requirements.txt #项目依赖 ``` ##### 核心特性 > 1. 数据驱动测试:测试数据与用例分离,通过YAML文件配置测试用例,实现数据驱动测试 > 2. 接口响应时间统计:使用装饰器扩展功能,可定制开关控制是否启用接口响应时间统计 > 3. 日志记录:全面的日志记录功能,记录每个接口的详细请求和响应信息,支持开关控制 > 4. 预加载测试用例:使用Redis作为用例池,在执行前自动加载所有测试用例到缓存中,提高运行效率 > 5. 多接口依赖处理:支持接口间依赖关系处理,可提取并传递接口响应中的变量 > 6. 高效执行:支持pytest多进程执行,多线程用例加载 > 7. 测试报告生成:集成Allure生成美观的测试报告 > 8. 错误用例统计:自动收集执行失败的测试用例,并生成Excel统计表 > 9. 多种通知方式:支持邮件和钉钉机器人消息通知测试结果 #### 框架使用 1. 安装Redis,在config.yaml中配置Redis连接信息 2. 安装项目依赖:pip install -r requirements.txt 3. 按照示例编写测试用例,维护test_case和test_case_data两个文件夹下的文件 ##### 测试用例编写 测试用例分为两部分:测试脚本(test_case目录下)和测试数据(test_case_data目录下)。 ###### 测试脚本编写(test_case目录) 测试脚本使用pytest框架编写,通过`@pytest.mark.parametrize`装饰器实现数据驱动。以下是一个典型的测试脚本示例: ```python import pytest import allure from utils.cache_tools.case_cache_control import GetCaseCacheData from utils.request_tools.request_control import RequestControl # 从缓存中获取测试数据 #正常登录场景 _normal_login_case_data = GetCaseCacheData.get_case_data_cache(['login_01']) #异常登录场景 #_abnormal_login_case_data = GetCaseCacheData.get_case_data_cache(['login_02']) class TestLoginCase: @allure.feature("登录模块") @allure.story("正常登录") @pytest.mark.parametrize('case_login_data', _normal_login_case_data) @pytest.mark.order(1) def test_login(self, case_login_data): # 设置用例标题 allure.dynamic.title(case_login_data.get('detail')) # 发送HTTP请求 case = RequestControl(case_login_data).send_http_request() # 断言 assert case.status_code == 200 #登录异常的测试方法 #def ..... ``` 测试脚本编写要点: 1. 使用`GetCaseCacheData.get_case_data_cache()`方法从缓存中获取测试数据 2. 使用`RequestControl().send_http_request()`发送HTTP请求 3. 使用allure装饰器添加测试报告描述信息 4. 使用`@pytest.mark.order()`指定执行顺序(可选) ###### 测试数据编写(test_case_data目录) 测试数据使用YAML格式编写,每个YAML文件包含一个或多个测试用例。以下是一个典型的测试数据示例: ```yaml login_01: # 用例ID,必须唯一 url: /api/auth/login # API路径(相对于host),必须以 / 开头 method: post # HTTP请求方法,支持 GET|POST|PATCH|DELETE|HEAD|OPTIONS detail: 正常登录,账号密码正确 # 测试用例描述 headers: # 请求头信息,键值对形式 Content-Type: application/json requestType: json # 请求参数类型,支持 params|form|json|file|null data: # 请求参数,键值对形式,可以为空 name: admin password: admin123 expected: # 预期响应结果,可以为空 extract: # 变量提取规则,键值对形式,可以为空 token: $.token user_id: $.uuid ``` ##### 请求类型说明 框架支持多种请求参数类型: - `params`: URL参数,适用于GET请求参数 - `form`: 表单数据,适用于POST表单提交 - `json`: JSON数据,适用于RESTful API的JSON请求体 - `file`: 文件上传,支持文件上传接口 - `null`: 无参数请求,适用于导出等不需要参数的接口 ##### 变量提取与使用 框架支持从接口响应中提取变量并在后续接口中使用: 1. 使用JsonPath表达式在[extract](file:///D:/WorkSpace/Project_Space/python/API_automation_py/utils/models/models.py#L111-L111)字段中定义需要提取的变量 2. 在后续接口中通过`${variable_name}`的方式使用已提取的变量