# Interface **Repository Path**: make_a_summer/interface ## Basic Information - **Project Name**: Interface - **Description**: 接口自动化框架:Python+Pytest+Yaml+Allure+Log+Mysql 兼容Yaml+CSV,实现单接口CSV用例参数化 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 1 - **Created**: 2024-12-15 - **Last Updated**: 2025-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python, pytest, Yaml ## README # Interface ## 前言 简单讲述框架的使用 本框架主要基于:Python+Pytest+Yaml(Yaml+CSV)+Allure+Log+Mysql,实现接口自动化框架 Git地址:https://gitee.com/make_a_summer/interface.git 项目作者:唐松(挽一夏) 个人邮箱:tasng@foxmail.com (欢迎探讨学习进步) ## 实现功能 - 测试数据隔离,实现数据驱动。使用yaml文件,或者yaml-csv文件实现单接口多组数据 - 支持多接口数据依赖:如A接口需要同时依赖B、C接口的响应数据作为参数。提取接口单个值,提取接口返回列表 - 数据库断言:直接在测试用例中写入查询的sql即可断言,无需编写代码 - 动态多断言: 如接口需要同时校验响应数据和sql校验,支持多场景断言 - 日志模块: 打印每个接口的日志信息 - 统计接口的运行时长 - 自定义拓展字段: 如用例中需要生成的随机数据,可直接调用 ## 目录架构 ``` |-common // 辅助类,用于整个测试框架 | |-debugtalk.py // 自定义函数供测试脚本调用。生成随机数、日期时间戳等常用的功能 |-config // 配置 | |-config.py // 读取项目配置文件-config.yaml | |-config.yaml // 项目配置文件 | |-extract.yaml // 存储接口数据关联 | |-setting.py // 项目基础路径 |-data // CSV测试文件 |-files // 上传文件 |-logs // 日志 |-reports // 测试报告 |-testcase // 测试用例 |-util_tools // 工具库文件 | └──db_connector // 数据库模块 | └──connectMysql.py // MySQL工具类 | └── headle_data // 测试文件操作模块 | └── csv_anlaysis_params.py // Yaml文件使用CSV格式,进行数据处理 | └── csv_handler.py // 读取CSV文件 | └── yaml_handler.py // 读取Yaml文件 | └── other_util // 其他工具类 | └── allure_type.py // Allure报告步骤中,数据格式处理 | └── genrate_id.py // 测试用例ID | └── yaml_process // Yaml文件处理 | └── yaml_analysis.py // Yaml数据规范、替换、发送请求、数据提取、执行断言 | └── yaml_extract.py // 处理数据提取 | └── yaml_replace.py // 处理数据替换 | └── assertion_util.py // 封装断言 | └── logger_util.py // 封装日志 | └── requests_util.py // 封装发送请求 |-conftest.py // 运行前之前操作,清空extract.yaml文件 |-pytest.ini |-environment.xml // allure报告中环境配置 |-run.py // 运行入口 ``` ## 接口文档 > 微信公众号-标签管理: > https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html 1. 登录 2. 查询标签 3. 创建标签 4. 修改标签 5. 删除标签 6. 文件上传 > B站博主学习资料,且配套测试接口(强烈推荐) > > [https://b23.tv/0Qlxedq](https://gitee.com/link?target=https%3A%2F%2Fb23.tv%2F0Qlxedq) ## 创建测试用例 需要创建**两个**文件 1、创建YAML测试文件,编写接口数据 2、创建执行YAML的Py文件,进行读取YAML文件,发送接口请求 ![](Documentation/说明文档.assets/image-20241226213003300.png) ### 如何创建测试用例 1、testcase目录下,创建YAML测试文件,编写接口数据,其中有严格的`关键字层级`,编写时需遵守(开发者根据实际要求自定义) ```yaml - name: # 用例名称 base_url: # 用例基础URL request: headers: # 请求头 (可选) cookies: # cookies (可选) method: # 请求方式 path: # 接口请求路径 data: # 请求参数 (可选) extract: # 提取参数 (可选) #extract_list: # 提取参数列表 validation: # 断言 ``` > YAML测试文件中,需要包含 `4` 个一级关键字:name、base_url、request、validation > > `2` 个二级关键字:method、path > > 提取参数:extract或者extract_list,根据接口返回值实例使用,提取单个还是提取列表。 2、testcase目录下,创建Py文件,进行读取并执行发送接口 ```python @allure.feature(next(m_id) + "XXX模块") class TestXXX: """XXX模块""" @allure.story(next(c_id) + "XXX接口") @allure.description("描述信息: XXX接口测试") @pytest.mark.parametrize('caseinfo', read_testcase_file('testcase/XXX/XXX.yaml')) def casetest_login(self, caseinfo): allure.dynamic.title(caseinfo['name']) YamlAnalysis().yaml_analysis_execution(caseinfo) ``` ### 使用YAML管理用例 一个YAML文件管理,能管理一组或者多组数据 ~~~YAML - name: 登录成功 base_url: http://127.0.0.1:8787 request: headers: Content-Type: application/x-www-form-urlencoded;charset=UTF-8 method: post path: /dar/user/login data: user_name: test01 passwd: admin123 extract: token: $.token userid: $.userId validation: - contain: {'msg': '登录成功'} - code: 200 - name: 登录失败 base_url: http://127.0.0.1:8787 request: headers: Content-Type: application/x-www-form-urlencoded;charset=UTF-8 method: post path: /dar/user/login data: user_name: test01111 passwd: admin123 extract: msg: $.msg validation: - contain: {'msg': '登录失败'} ~~~ 严格控制YAML文件的层级格式即可 ![](Documentation/说明文档.assets/image-20241226212338293.png) ### 使用YAML+CSV关管理用例 看上方发现,在YAML文件中管理多组测试数据,一组两组还好,多了之后YAML中数据就过多,不好查看与管理。 所有就引入了CSV管理,对可变的参数进行处理 > 1、CSV文件存储在data目录下 > > 2、使用CSV方式,在YAML文件中新增关键字`parameters`,与对应的读取数据格式$csv{XXX} 下面使用同一个接口,展示CSV管理用例 1、data目录下,新建CSV文件,有四个字段需要被替换使用 ~~~CSV name,user_name,passwd,validation 正常登录01,test01,admin123,登录成功 账号错误02,test111,admin123,登录失败 账号错误03,test222,admin123,登录失败 账号错误04,test333,admin123,登录失败 密码错误05,test01,admin111,登录失败 密码错误06,test01,admin222,登录失败 密码错误07,test01,admin333,登录失败 ~~~ 2、testcase,YAML测试文件,要被替换的字段用$csv{XXX},且parameters中要一一对应 ```yaml - name: $csv{name} base_url: http://127.0.0.1:8787 parameters: name-user_name-passwd-validation: data/user_login.csv # parameters关键字下,需要替换的字段-CSV文件路径 request: headers: Content-Type: application/x-www-form-urlencoded;charset=UTF-8 method: post path: /dar/user/login data: user_name: $csv{user_name} passwd: $csv{passwd} extract: token: $.token userid: $.userId validation: - contain: $csv{validation} ``` Py文件依旧不变,运行成功后效果 ![](Documentation/说明文档.assets/image-20241226212115753.png) ## 用例中提取参数 提取参数有两个方式,根据接口实际结果使用,支持使用jsonpath、正则表达式。提取的接口关联参数存储到:`extract.yaml`文件中 **extract_list : 提取的数据是列表** **extract :提取单个数据** 示例: ```yaml # 正则提取列表 extract_list: goodIds: '"goodsId":\s*"(\d+)"' # jsonpath提取列表 extract_list: materIds: $.material[*] # jsonpath提取单个数据 extract: token: $.token userid: $.userId ``` ![](Documentation/说明文档.assets/image-20241226212508612.png) ## 用例中依赖token如何设计 1、通过上个接口发送请求,得到token请求值,存储到extract.yaml文件中 2、YAML文件中,通过debugtalk.py文件中,使用get_extract_data方法,获取extract.yaml文件数据 读取extract.yaml值,因为提取的有单个数据、列表数据,所以提取的方式略有不同 >单个参数,如上述`token`值,在YAML文件中,使用${get_extract_data(token)} > >列表参数,如上述`goodIds`第1个值,在YAML文件中,使用${get_extract_data(goodIds,0)} ```yaml params: token: ${get_extract_data(token)} json: pro_id: ${get_extract_data(goodIds,0)} ``` ## 用例中需要cookie 有的接口发送时需要携带cookie信息。 首先是获取cookie存储到extract.yaml文件中,在使用get_extract_data进行数据获取 ~~~yaml - name: 获取物料信息 base_url: ${get_base_url(base_url)} request: headers: ${get_headers(data)} cookies: ${get_extract_data(Cookie)} method: get path: /api/order/customer/orderPlan/getMaterial validation: - eq: { 'message': '操作成功' } - code: 200 extract_list: materIds: $.material[*] ~~~ ## 用例中使用其他参数 在使用的过程中,发现yaml文件中,有 `${get_base_url()}、${get_headers()}、 ${get_extract_data(Cookie)}` 这些方法均在debugtalk.py文件中 ```python class DebugTalk: @classmethod def get_base_url(cls, node_name): """ :param node_name: base_url :return: """ return read_config_file('base', node_name) @classmethod def get_mysql_config(cls, node_name): """ :param node_name: mysql :param node_name: :return: """ return read_config_file('mysql', node_name) @classmethod def get_headers(cls, params_type): headers_mapping = { 'data': {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}, 'json': {'Content-Type': 'application/json;charset=UTF-8 '} } header = headers_mapping.get(params_type) if header is None: raise ValueError('不支持其他类型的请求头设置') return header @classmethod def get_random_number(cls, min, max): return random.randint(int(min), int(max)) XXXXXX ``` ## 断言类型 本框架只实现了五种类型断言 `状态码断言、包含模式断言、相等断言、不相等断言、数据库断言` ```yaml validation: - contain: {'msg': '登录成功'} # 包含模式 - code: 200 # 接口的响应状态码断言 - eq: {'msg': '登录成功'} # 相等断言 - ne: {'msg': '登录失败'} # 不相等断言 - db: SELECT name, fee FROM testcase.`user` WHERE id=4; # 数据库断言 ``` ## allure报告 执行run.py文件,在reports文件allures文件下,打开index.html文件,即可查看 ![](Documentation/说明文档.assets/image-20241226212602695.png) ## 运行流程详解 1. 运行run.py文件,读取pytest.ini配置,到指定文件下,读取指定类下的指定测试方法 2. 调用read_testcase_file方法,读取yaml文件,检查yaml文件是否存在字段:parameters,如果就是yaml+csv参数化。没有就是yaml测试文件。 读取的yaml有多少组数据,就传多少组,一组就是一条case。 **csv参数化**,在调用read_testcase_file方法,读取yaml文件,检查存在字段:parameters,读取时候就调用csv_analysis_params方法,对yaml文件中$csv{XX}做替换 - 1、yaml文件中parameters关键字下是要替换csv文件下对应的字段,要被替换的字段书写格式:$csv{xxx} - 2、csv_analysis_params方法组合读取csv文件 read_csv_file方法,对csv文件做处理。将yaml文件中$csv{xxx},替换为csv文件中对应值 - 3、csv文件中有几行数据,就对几行数据做处理,最终处理后就是几组数据就被替换,相当于yaml文件的几组数据 3. 通过conftest.py文件,先调用clear_extract方法,清除extract.yaml文件-存在数据关联文件 4. 测试文件开始执行YamlAnalysis类中,yaml_analysis_execution方法,对整体yaml文件做处理 - 对yaml文件格式做校验,4个一级关键字,2个二级关键字 - 关键字存在引用格式,如${get_base_url(base_url)},调用替换的方法parse_replace,调用DebugTalk类中的相应方法,并获取返回值替换。 关键字引用是配置参数(url/mysql/等),就通过read_config_file方法读取。 关键字引用是extract.yaml文件中参数(接口关联,上个接口返回值,本接口使用),就通过get_extract_data方法来读取。支持直接读取键,也支持键+位置值 - 执行发送接口请求,execute_request方法,然后输出台打印日志、allure报告body内容。 - yaml文件中存在关键字:extract或extract_list字段,就调用extract_data/extract_data_list方法,进行参数提取,支持jsonpath、正则表达式,将提取的参数通过write_extract_yaml方法写入extract.yaml文件 - 处理断言,调用assert_result方法进行断言处理。5种断言方式,yaml文件中断言字段使用那种断言,就调用对应的断言方法