From 9ee23cbc11e3e2856477b2a8969e94d9b5e54eb2 Mon Sep 17 00:00:00 2001 From: floraachy <1622042529@qq.com> Date: Tue, 9 Jan 2024 13:48:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E4=BE=9D=E8=B5=96=EF=BC=8C=20=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E6=98=AF=E5=AD=97=E5=85=B8=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8Ckey=E4=B8=BA=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=EF=BC=8Cvalue=E4=B8=BA=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=80=BC=E3=80=82value=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E4=B8=BA=E5=B8=B8=E9=87=8F=EF=BC=8C=E4=B9=9F=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E4=B8=BAdata=5Fhandle=E5=86=85=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E4=B9=9F=E5=8F=AF=E4=BB=A5=E6=98=AF?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 +++++++++++++++---------- utils/data_utils/data_handle.py | 12 ++++- utils/requests_utils/case_dependence.py | 17 ++++++- 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 87e00fb..f47a951 100644 --- a/README.md +++ b/README.md @@ -32,13 +32,12 @@ * 支持测试数据分析,测试数据不符合规范有预警机制 * 支持通过用例数据动态配置pytest.mark, 包括自定义标记,pytest.mark.skip以及pytest,mark.usefixtures * 支持利用allure设置用例优先级,运行指定优先级的用例 -* 测试数据隔离, 实现数据驱动 +* 执行环境一键切换,解决多环境相互影响问题 * 自动生成用例代码: 测试人员在yaml/excel文件中填写好测试用例, 程序可以直接生成用例代码,纯小白也能使用 * 支持参数多类型提取:支持通过jsonpath从response.json提取数据;支持通过正则表达式从response.text提取数据;支持直接提取response本身的数据,例如response.cookies * 使用Allure生成测试报告,并对测试报告进行了定制化修改,使得测试报告更加美观 * 日志模块: 采用loguru管理日志,可以输出更为优雅,简洁的日志 * 钉钉、企业微信通知: 支持多种通知场景,执行成功之后,可选择发送钉钉、或者企业微信、邮箱通知 -* 执行环境一键切换,解决多环境相互影响问题 * 使用pipenv管理虚拟环境和依赖文件,提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作 * 支持将swagger.json接口文档转为YAML用例 @@ -138,28 +137,38 @@ pip install -r requirements.txt ### 5. 用例中相关字段的介绍 ```yaml -case_common :公共参数 - allure_epic:用作于@allure.epic()装饰器中的内容。 - allure_feature:用作于@allure.feature()装饰器中的内容。 - allure_story:用作于@allure.story()装饰器中的内容。 +case_common: # 公共参数 + allure_epic: 用作于@allure.epic()装饰器中的内容。 + allure_feature: 用作于@allure.feature()装饰器中的内容。 + allure_story: 用作于@allure.story()装饰器中的内容。 case_markers: 给测试方法添加标记,支持自定义标记,skip, usefixtures。 格式是列表嵌套字符串或者字典。例如: # ['glcc', {'skip': '跳过执行该用例'}] -case_info: 具体的用例数据,是以列表的形式进行管理 + +common_dependence: # 放置公共依赖 + setup: + interface: + sql: + env_vars: + teardown: + interface: + sql: + env_vars: +case_info: # 具体的用例数据,是以列表的形式进行管理 - - id:用例id,注意需要全局唯一,方便后续用于用例接口依赖 - title:用例标题 + id: 用例id,注意需要全局唯一,方便后续用于用例接口依赖 + title: 用例标题 severity: 用例优先级,支持如下几种:NORMAL, BLOCKER,CRITICAL,MINOR,TRIVIAL; 为空和错误都认为是NORMAL - run:是否执行用例,为空或者True都会执行,为False则不执行。 - url:请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_control.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url)+资源路径(url)。 - method:请求方式,例如:GET, POST, DELETE, PUT, PATCH等 - headers:请求头,注意如果在headers里面防止cookies,其值类型需要是字符串 - cookies:请求cookies,格式是:DICT, CookieJar对象 - request_type:请求数据类型:params, json, file, data - payload:请求参数 + run: 是否执行用例,为空或者True都会执行,为False则不执行。 + url: 请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_control.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url)+资源路径(url)。 + method: 请求方式,例如:GET, POST, DELETE, PUT, PATCH等 + headers: 请求头,注意如果在headers里面防止cookies,其值类型需要是字符串 + cookies: 请求cookies,格式是:DICT, CookieJar对象 + request_type: 请求数据类型:params, json, file, data + payload: 请求参数 files: 需要上传的文件的相对路径,会自动拼接files目录。 os.path.join(files, "这里传递的files参数值") - assert_response:响应断言 - assert_sql:数据库断言 - extract:后置提取参数 - case_dependence: 用例依赖 + assert_response: 响应断言 + assert_sql: 数据库断言 + extract: 后置提取参数 + case_dependence: 用例依赖 ``` ### 6. 参数提取说明 @@ -301,16 +310,18 @@ case_info: 具体的用例数据,是以列表的形式进行管理 assert_type: contains ``` ### 9. 用例依赖说明 -目前用例依赖仅支持接口依赖,数据库依赖后续会补充。 +目前用例依赖仅支持接口依赖和环境变量依赖。数据库依赖后续会补充。 依赖的配置说明: ``` -case_dependence: 用例依赖,为空时表示没有依赖: +case_dependence: 用例依赖,为空时表示没有依赖 setup: 前置依赖信息,为空时表示没有依赖 interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID - sql: 数据库查询语句,后续支持后将补充 + sql: 数据库查询语句,后续支持后将补充 + env_vars: 环境变量依赖信息, 字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。为空时表示没有依赖 teardown: 后置依赖信息,为空时表示没有依赖 interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID sql: 数据库查询语句,后续支持后将补充 + env_vars: 环境变量依赖信息, 字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。为空时表示没有依赖 ``` 参考示例: @@ -318,10 +329,14 @@ case_dependence: 用例依赖,为空时表示没有依赖: case_dependence: setup: interface: gitlink_login_oauth_token_01 + env_vars: + repo_owner: ${env_login} teardown: interface: - gitlink_projects_delete_project_01 sql: + env_vars: + env_page_content: ${generate_paragraph} ``` ### 10. Excel用例单独说明 @@ -436,5 +451,5 @@ excel表单2名称是:示例模块 ## 赞赏 -如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激 +如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激~
![打赏](https://www.gitlink.org.cn/api/attachments/437395) \ No newline at end of file diff --git a/utils/data_utils/data_handle.py b/utils/data_utils/data_handle.py index cafd03a..e9f36dd 100644 --- a/utils/data_utils/data_handle.py +++ b/utils/data_utils/data_handle.py @@ -4,12 +4,13 @@ # @File : data_handle.py # @Software: PyCharm # @Desc: -import os.path # 标准库导入 import random # 导包不能移除,否则random.choice这种就不能处理了 import json import re, uuid import copy +import os +import base64 # 第三方库导入 from loguru import logger from string import Template @@ -219,6 +220,15 @@ def list_to_str(target: list): return ",".join(filtered_list) +def string_to_base64(input_string: str): + """ + 将字符串转换为Base64格式 + """ + base64_bytes = base64.b64encode(input_string.encode('utf-8')) + base64_string = base64_bytes.decode('utf-8') + return base64_string + + # 声明data_handle方法,这样外部就可以直接import data_handle来使用了 data_handle = DataHandle().data_handle diff --git a/utils/requests_utils/case_dependence.py b/utils/requests_utils/case_dependence.py index 8182c2b..68d9fa6 100644 --- a/utils/requests_utils/case_dependence.py +++ b/utils/requests_utils/case_dependence.py @@ -10,16 +10,17 @@ import allure from loguru import logger # 本地应用/模块导入 from utils.requests_utils.api_workflow import get_api_data, api_work_flow +from utils.data_utils.data_handle import data_handle from config.path_config import INTERFACE_DIR from config.global_vars import GLOBAL_VARS def case_dependence_handle(case_dependence, source): """ - 处理用例依赖,支持接口依赖和SQL依赖。关键字:interface, sql + 处理用例依赖,支持接口依赖,环境变量依赖,SQL依赖。关键字:interface, sql, env_vars """ if case_dependence is None: - logger.debug(f"case_dependence为空,跳过用例依赖处理 --> case_dependence={case_dependence}") + logger.debug(f"跳过用例依赖处理 --> case_dependence={case_dependence}") return if case_dependence.get("interface"): interfaces = case_dependence["interface"] @@ -45,3 +46,15 @@ def case_dependence_handle(case_dependence, source): if case_dependence.get("sql"): logger.warning(f"暂时不支持依赖sql处理,后续更新") pass + + # 环境变量处理 + if case_dependence.get("env_vars"): + if isinstance(case_dependence["env_vars"], dict): + for key, value in case_dependence["env_vars"].items(): + new_value = data_handle(value, GLOBAL_VARS) + with allure.step(f"依赖环境变量 --> {key}={new_value}"): + GLOBAL_VARS.update({key: new_value}) + else: + logger.warning(f"依赖环境变量格式错误,跳过依赖环境变量处理~ --> env_vars仅支持dict格式") + else: + logger.warning(f"依赖环境变量为空,跳过依赖环境变量处理~")