From bb265e65dc3185d0087921cefb7b68ce056ad7ae Mon Sep 17 00:00:00 2001 From: floraachy <1622042529@qq.com> Date: Tue, 20 Jun 2023 16:23:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=84=E7=90=86=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=E6=95=B0=E6=8D=AE=E6=96=B9=E6=B3=95=EF=BC=88=E4=BB=8E?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=E6=9B=BF=E6=8D=A2=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E5=85=B3=E9=94=AE=E5=AD=97=E4=BB=A5=E5=8F=8A=E8=AF=86?= =?UTF-8?q?=E5=88=ABPython=E8=A1=A8=E8=BE=BE=E5=BC=8F=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=92=E5=BD=92=E6=96=B9=E5=BC=8F=E5=A4=84?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E9=81=BF=E5=85=8D=E5=B1=82=E5=B1=82=E5=A5=97?= =?UTF-8?q?=E5=A8=83=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- case_utils/assert_handle.py | 34 ++-- {common_utils => case_utils}/data_handle.py | 174 ++++++++---------- case_utils/request_data_handle.py | 120 ++++++------ case_utils/send_result_handle.py | 6 +- config/allure_config/gitlinklogo.jpg | Bin 0 -> 7798 bytes .../allure_config/微信图片_20230615174806.jpg | Bin 0 -> 2319 bytes .../allure_config/微信图片_20230615174812.png | Bin 0 -> 7206 bytes .../allure_config/微信图片_20230615174817.jpg | Bin 0 -> 7462 bytes data/{ => gitlink}/login_demo.yaml | 2 +- data/{ => gitlink}/test_gitlink_demo.xlsx | Bin 11778 -> 11772 bytes data/{ => gitlink}/test_new_project_demo.yaml | 2 +- data/{ => gitlink}/test_upload_files.yaml | 2 +- files/TOC出库订单导入模板(2).xlsx | Bin 0 -> 18985 bytes files/toc.xls | Bin 0 -> 6656 bytes files/导入TOC订单.xls | Bin 0 -> 18969 bytes pytest.ini | 2 +- test_case/test_manual_case/test_login_demo.py | 2 +- 17 files changed, 161 insertions(+), 183 deletions(-) rename {common_utils => case_utils}/data_handle.py (52%) create mode 100644 config/allure_config/gitlinklogo.jpg create mode 100644 config/allure_config/微信图片_20230615174806.jpg create mode 100644 config/allure_config/微信图片_20230615174812.png create mode 100644 config/allure_config/微信图片_20230615174817.jpg rename data/{ => gitlink}/login_demo.yaml (99%) rename data/{ => gitlink}/test_gitlink_demo.xlsx (63%) rename data/{ => gitlink}/test_new_project_demo.yaml (99%) rename data/{ => gitlink}/test_upload_files.yaml (94%) create mode 100644 files/TOC出库订单导入模板(2).xlsx create mode 100644 files/toc.xls create mode 100644 files/导入TOC订单.xls diff --git a/case_utils/assert_handle.py b/case_utils/assert_handle.py index d39a6d5..ad98487 100644 --- a/case_utils/assert_handle.py +++ b/case_utils/assert_handle.py @@ -8,7 +8,7 @@ from case_utils.allure_handle import allure_step from requests import Response -from common_utils.data_handle import json_extractor, re_extract +from case_utils.data_handle import json_extractor, re_extract from loguru import logger from case_utils.request_data_handle import response_type from common_utils.mysql_handle import MysqlServer @@ -30,8 +30,7 @@ def assert_response(response: Response, expected: dict) -> None: f"-------------Start:响应断言--------------------\n") if expected is None: logger.info("当前用例无响应断言!") - allure_step(step_title='判断是否存在响应断言', - content='当前用例无响应断言!') + allure_step(step_title='判断是否存在响应断言---->当前用例无响应断言!') return logger.debug(f"响应断言预期结果:{expected}, {type(expected)}") index = 0 @@ -49,8 +48,7 @@ def assert_response(response: Response, expected: dict) -> None: actual = re_extract(response.text, _k) index += 1 logger.info(f'第{index}个响应断言 -|- 预期结果: {_k}: {_v}, {type(_v)} {k} 实际结果: {actual}, {type(actual)}') - allure_step(step_title=f'第{index}个响应断言数据', - content=f'预期结果: {_k}: {_v}, {type(_v)} {k} 实际结果: {actual}, {type(actual)}') + allure_step(step_title=f'第{index}个响应断言数据---->预期结果: {_k}: {_v}, {type(_v)} {k} 实际结果: {actual}, {type(actual)}') try: if k == "eq": # 预期结果 = 实际结果 assert _v == actual @@ -73,8 +71,7 @@ def assert_response(response: Response, expected: dict) -> None: content='目前仅支持如下关键字:eq, in, gt, lt, not') except AssertionError: logger.error(f"第{index}个响应断言失败 -|- 预期结果: {_k}: {_v}, {type(_v)} {k} 实际结果: {actual}, {type(actual)}") - allure_step(step_title=f'第{index}个响应断言失败', - content=f'预期结果: {_k}: {_v}, {type(_v)} {k} 实际结果: {actual}, {type(actual)}') + allure_step(step_title=f'第{index}个响应断言失败---->预期结果: {_k}: {_v}, {type(_v)} {k} 实际结果: {actual}, {type(actual)}') logger.info('\n-------------End:响应断言--------------------\n' \ "=====================================================") raise AssertionError( @@ -100,14 +97,12 @@ def assert_sql(db_info, expected: dict): f"-------------Start:数据库断言--------------------") if expected is None: logger.info("当前用例无数据库断言!") - allure_step(step_title='判断是否存在数据库断言', - content='当前用例无数据库断言') + allure_step(step_title='判断是否存在数据库断言---->当前用例无数据库断言') return if not db_info: logger.error("当前环境无数据库配置,跳过数据库断言!") - allure_step(step_title='判断是否存在数据库配置', - content='当前环境无数据库配置,跳过数据库断言!}') - logger.info('\n-------------End:数据库断言--------------------\n' \ + allure_step(step_title='判断是否存在数据库配置---->当前环境无数据库配置,跳过数据库断言!') + logger.info('\n-------------End:数据库断言--------------------\n' "=====================================================") return for k, v in expected.items(): @@ -118,13 +113,13 @@ def assert_sql(db_info, expected: dict): # 查询数据库,获取查询结果 sql_result = MysqlServer(**db_info).query_one(_v) logger.info(f'数据库响应断言 -|- SQL:{_v} || 查询结果:{sql_result}') - allure_step(step_title=f'数据库断言', - content=f'SQL:{_v} || 查询结果:{sql_result}') + allure_step(step_title=f'数据库断言---->SQL:{_v} ', + content=f'查询结果:{sql_result}') except Exception as e: logger.error(f'数据库服务报错:{e}') allure_step(step_title=f'数据库服务报错', content=f'{e} ') - logger.info('\n-------------End:数据库断言--------------------\n' \ + logger.info('\n-------------End:数据库断言--------------------\n' "=====================================================") raise AssertionError(f"数据库服务报错:{e}") @@ -133,19 +128,16 @@ def assert_sql(db_info, expected: dict): if _k == "len": assert _v == len(sql_result) logger.info(f"预期结果: {_v} == 实际结果: {len(sql_result)}, 断言成功!") - allure_step(step_title=f'---->数据库断言结果', - content=f'预期结果: {_v} == 实际结果: {len(sql_result)}, 断言成功!') + allure_step(step_title=f'数据库断言结果---->预期结果: {_v} == 实际结果: {len(sql_result)}, 断言成功!') # 如果时$.开头,则从数据库查询结果中提取相应的值作为实际结果 elif _k.startswith("$."): actual = json_extractor(sql_result, _k) assert _v == actual logger.info(f"预期结果: {_v} == 实际结果: {actual}, 断言成功!") - allure_step(step_title=f'---->数据库断言结果', - content=f'预期结果: {_v} == 实际结果: {actual}, 断言成功!') + allure_step(step_title=f'数据库断言结果---->预期结果: {_v} == 实际结果: {actual}, 断言成功!') except AssertionError: logger.error(f"数据库断言失败 -|- 预期结果:{_v} {k} 实际结果: {sql_result})") - allure_step(step_title=f'数据库断言失败', - content=f'预期结果:{_v} {k} 实际结果: {sql_result}') + allure_step(step_title=f'数据库断言失败---->预期结果:{_v} {k} 实际结果: {sql_result}') logger.info('\n-------------End:数据库断言--------------------\n' \ "=====================================================") raise AssertionError(f"数据库断言失败 -|-预期结果: {_v} {k} 实际结果: {sql_result}") diff --git a/common_utils/data_handle.py b/case_utils/data_handle.py similarity index 52% rename from common_utils/data_handle.py rename to case_utils/data_handle.py index 8df11b4..4f724e3 100644 --- a/common_utils/data_handle.py +++ b/case_utils/data_handle.py @@ -5,114 +5,42 @@ # @File : data_handle.py # @Software: PyCharm # @Desc: 数据处理 -from jsonpath import jsonpath + import re -from faker import Faker from string import Template +from jsonpath import jsonpath from loguru import logger +from faker import Faker faker = Faker() -def data_replace(content, source): +def data_handle(obj, source): """ - 用例数据替换的方法 - :param content: 原始的字符串内容 - :param source: 需要替换字符串的来源 - return content: 替换表达式后的字符串 + 递归处理字典、列表中的字符串,将${}占位符替换成source中的值 """ - try: - if content is None: - return None - logger.debug("\n======================================================\n" \ - "-------------Start:数据替换--------------------\n" - f"替换源: {source}\n" \ - f"初始字符串: {content}\n" \ - "=====================================================") - print(f"-----Start-----数据替换: 初始字符串为:{content}") - if len(content) != 0: - # safe_substitute() 方法会保留没有被替换的占位符,不会抛出 KeyError 异常。 - # 所以,如果 content 中不存在占位符,使用 safe_substitute() 方法进行替换后,得到的结果和原始字符串是一样的。 - content = Template(str(content)).safe_substitute(source) - for func in re.findall('\\${(.*?)}', content): - content = content.replace('${%s}' % func, exec_func(func)) - try: - content = content.replace('${%s}' % func, exec_func(func)) - except Exception as e: - logger.error(f"\n======================================================\n" \ - "-------------End:数据替换--------------------\n" - f"替换数据时出现了异常:{e}" \ - "=====================================================") - print(f"-----END-----替换数据时出现了异常:{e}") - return e - logger.debug("\n======================================================\n" \ - "-------------End:数据替换--------------------\n" - f"新字符串:{content}\n" \ - "=====================================================") - print(f"-----End-----数据替换完成: 新字符串为:{type(content)} || {content}\n") - return content - except Exception as e: - logger.error(f"进行数据替换时报错:{e}") - print(f"进行数据替换时报错:{e}") + obj = eval_data_process(obj) + if isinstance(obj, str): + # 寻找${}, 在source中找到对应的关键字进行替换,如obj=${user_id}, 去寻找source中对应键user_id的值(假设user_id=1),使得obj=1 + obj = Template(obj).safe_substitute(source) + # 寻找${python表达式}, 将Python表达式eval得出其具体值 + for func in re.findall('\\${(.*?)}', obj): + obj = obj.replace('${%s}' % func, eval_data_process(func)) + obj = eval_data_process(obj) + return obj + return eval_data_process(obj) + elif isinstance(obj, list): + for index, item in enumerate(obj): + obj[index] = data_handle(item, source) + return obj + elif isinstance(obj, dict): + for key, value in obj.items(): + obj[key] = data_handle(value, source) + return obj -def json_extractor(obj: dict, expr: str = '.'): - """ - :param obj :json/dict类型数据 - :param expr: 表达式, . 提取字典所有内容, $.test_api_case 提取一级字典case, $.test_api_case.data 提取case字典下的data - :return result: 提取的结果,未提取到返回 None - """ - try: - result = jsonpath(obj, expr)[0] - logger.debug("\n======================================================\n" \ - "-------------Start:json_extractor--------------------\n" - f"提取表达式为: {expr} 提取值为 {result}\n" \ - "=====================================================") - print("提取响应内容成功,提取表达式为: {} 提取值为 {}".format(expr, result)) - except Exception as e: - logger.debug("\n======================================================\n" \ - "-------------End:json_extractor--------------------\n" - f"提取表达式为: {expr} 提取数据为 {obj}\n, 错误信息为:{e}\n" \ - "=====================================================") - print(f'未提取到内容,请检查表达式是否错误!提取表达式为:{expr} 提取数据为 {obj}, 错误信息为:{e}') - result = None - return result - - -def re_extract(obj: str, expr: str = '.'): - """ - :param obj : 字符串数据 - :param expr: 正则表达式 - :return result: 提取的结果,未提取到返回 None - """ - try: - result = re.findall(expr, obj)[0] - logger.debug("\n======================================================\n" \ - "-------------Start:re_extract--------------------\n" - f"提取表达式为: {expr} 提取值为: {result}\n" \ - "=====================================================") - print("提取响应内容成功,提取表达式为: {} 提取值为: {}".format(expr, result)) - except Exception as e: - logger.debug(f"\n======================================================\n" \ - "-------------End:re_extract--------------------\n" - f"提取表达式为: {expr} 提取数据为:{obj}\n, 错误信息为:{e}\n" \ - "=====================================================") - print(f'未提取到内容,请检查表达式是否错误!提取表达式为:{expr} 提取数据为 {obj}, 错误信息为:{e}') - result = None - return result - - -def exec_func(func) -> str: - """ - :params func 字符的形式调用函数 - : return 返回的转换成函数执行的结果,已字符串格式返回 - """ - result = eval(func) - logger.debug("\n======================================================\n" \ - "-------------exec_func--------------------\n" - f"函数: {func} 执行结果: {result}\n" \ - "=====================================================") - return str(result) + else: + return obj # 将"[1,2,3]" 或者"{'k':'v'}" -> [1,2,3], {'k':'v'} @@ -145,3 +73,55 @@ def eval_data_process(data): for key, value in data.items(): data[key] = eval_data_process(eval_data(value)) return data + + +def json_extractor(obj: dict, expr: str = '.'): + """ + :param obj :json/dict类型数据 + :param expr: 表达式, . 提取字典所有内容, $.test_api_case 提取一级字典case, $.test_api_case.data 提取case字典下的data + :return result: 提取的结果,未提取到返回 None + """ + try: + result = jsonpath(obj, expr)[0] + logger.debug("\n======================================================\n" \ + "-------------Start:json_extractor--------------------\n" + f"提取表达式为: {expr} \n" + f"提取值为: {result}\n" + "=====================================================") + print("提取响应内容成功,提取表达式为: {} 提取值为 {}".format(expr, result)) + except Exception as e: + logger.debug("\n======================================================\n" \ + "-------------End:json_extractor--------------------\n" + f"提取表达式为: {expr}\n" + f"提取数据为: {obj}\n" + f"错误信息为:{e}\n" + "=====================================================") + print(f'未提取到内容,请检查表达式是否错误!提取表达式为:{expr} 提取数据为 {obj}, 错误信息为:{e}') + result = None + return result + + +def re_extract(obj: str, expr: str = '.'): + """ + :param obj : 字符串数据 + :param expr: 正则表达式 + :return result: 提取的结果,未提取到返回 None + """ + try: + result = re.findall(expr, obj)[0] + logger.debug("\n======================================================\n" \ + "-------------Start:re_extract--------------------\n" + f"提取表达式为: {expr}\n" \ + f"提取值为: {result}\n" \ + "=====================================================") + print("提取响应内容成功,提取表达式为: {} 提取值为: {}".format(expr, result)) + except Exception as e: + logger.debug(f"\n======================================================\n" \ + "-------------End:re_extract--------------------\n" + f"提取表达式为: {expr}\n" \ + f"提取数据为: {obj}\n" \ + f"错误信息为:{e}\n" \ + "=====================================================") + print(f'未提取到内容,请检查表达式是否错误!提取表达式为:{expr} 提取数据为 {obj}, 错误信息为:{e}') + result = None + return result diff --git a/case_utils/request_data_handle.py b/case_utils/request_data_handle.py index 0abcfb8..1223aa7 100644 --- a/case_utils/request_data_handle.py +++ b/case_utils/request_data_handle.py @@ -8,11 +8,11 @@ import json import os.path from common_utils.files_handle import get_file_field -from common_utils.data_handle import eval_data_process, data_replace +from case_utils.data_handle import eval_data_process, data_handle from config.global_vars import GLOBAL_VARS from requests import Response from loguru import logger -from common_utils.data_handle import json_extractor, re_extract +from case_utils.data_handle import json_extractor, re_extract from case_utils.allure_handle import allure_step from common_utils.base_request import BaseRequest from config.path_config import FILES_DIR @@ -28,17 +28,17 @@ class RequestPreDataHandle: def __init__(self, request_data): logger.debug(f"\n======================================================\n" \ "-------------Start:处理用例数据前--------------------\n" - f"用例标题: {type(request_data.get('title', None))} || {request_data.get('title', None)}\n" \ - f"请求路径: {type(request_data.get('url', None))} || {request_data.get('url', None)}\n" \ - f"请求方式: {type(request_data.get('method', None))} || {request_data.get('method', None)}\n" \ - f"请求头: {type(request_data.get('headers', None))} || {request_data.get('headers', None)}\n" \ + f"用例标题(title): {type(request_data.get('title', None))} || {request_data.get('title', None)}\n" \ + f"请求路径(url): {type(request_data.get('url', None))} || {request_data.get('url', None)}\n" \ + f"请求方式(method): {type(request_data.get('method', None))} || {request_data.get('method', None)}\n" \ + f"请求头(headers): {type(request_data.get('headers', None))} || {request_data.get('headers', None)}\n" \ f"请求cookies: {type(request_data.get('cookies', None))} || {request_data.get('cookies', None)}\n" \ - f"请求类型: {type(request_data.get('request_type', None))} || {request_data.get('request_type', None)}\n" \ - f"请求内容: {type(request_data.get('payload', None))} || {request_data.get('payload', None)}\n" \ - f"请求文件: {type(request_data.get('files', None))} || {request_data.get('files', None)}\n" \ - f"后置提取参数: {type(request_data.get('extract', None))} || {request_data.get('extract', None)}\n" \ - f"响应断言: {type(request_data.get('assert_response', None))} || {request_data.get('assert_response', None)}\n" \ - f"数据库断言: {type(request_data.get('assert_sql', None))} || {request_data.get('assert_sql', None)}\n" \ + f"请求类型(request_type): {type(request_data.get('request_type', None))} || {request_data.get('request_type', None)}\n" \ + f"请求参数(payload): {type(request_data.get('payload', None))} || {request_data.get('payload', None)}\n" \ + f"请求文件(files): {type(request_data.get('files', None))} || {request_data.get('files', None)}\n" \ + f"后置提取参数(extract): {type(request_data.get('extract', None))} || {request_data.get('extract', None)}\n" \ + f"响应断言(assert_response): {type(request_data.get('assert_response', None))} || {request_data.get('assert_response', None)}\n" \ + f"数据库断言(assert_sql): {type(request_data.get('assert_sql', None))} || {request_data.get('assert_sql', None)}\n" \ "=====================================================") self.request_data = request_data @@ -56,17 +56,17 @@ class RequestPreDataHandle: self.assert_handle() logger.debug(f"\n======================================================\n" \ "-------------End:处理用例数据后--------------------\n" - f"用例标题: {type(self.request_data.get('title', None))} || {self.request_data.get('title', None)}\n" \ - f"请求路径: {type(self.request_data.get('url', None))} || {self.request_data.get('url', None)}\n" \ - f"请求方式: {type(self.request_data.get('method', None))} || {self.request_data.get('method', None)}\n" \ - f"请求头: {type(self.request_data.get('headers', None))} || {self.request_data.get('headers', None)}\n" \ + f"用例标题(title): {type(self.request_data.get('title', None))} || {self.request_data.get('title', None)}\n" \ + f"请求路径(url): {type(self.request_data.get('url', None))} || {self.request_data.get('url', None)}\n" \ + f"请求方式(method): {type(self.request_data.get('method', None))} || {self.request_data.get('method', None)}\n" \ + f"请求头(headers): {type(self.request_data.get('headers', None))} || {self.request_data.get('headers', None)}\n" \ f"请求cookies: {type(self.request_data.get('cookies', None))} || {self.request_data.get('cookies', None)}\n" \ - f"请求类型: {type(self.request_data.get('request_type', None))} || {self.request_data.get('request_type', None)}\n" \ - f"请求内容: {type(self.request_data.get('payload', None))} || {self.request_data.get('payload', None)}\n" \ - f"请求文件: {type(self.request_data.get('files', None))} || {self.request_data.get('files', None)}\n" \ - f"后置提取参数: {type(self.request_data.get('extract', None))} || {self.request_data.get('extract', None)}\n" \ - f"响应断言: {type(self.request_data.get('assert_response', None))} || {self.request_data.get('assert_response', None)}\n" \ - f"数据库断言: {type(self.request_data.get('assert_sql', None))} || {self.request_data.get('assert_sql', None)}\n" \ + f"请求类型(request_type): {type(self.request_data.get('request_type', None))} || {self.request_data.get('request_type', None)}\n" \ + f"请求参数(payload): {type(self.request_data.get('payload', None))} || {self.request_data.get('payload', None)}\n" \ + f"请求文件(files): {type(self.request_data.get('files', None))} || {self.request_data.get('files', None)}\n" \ + f"后置提取参数(extract): {type(self.request_data.get('extract', None))} || {self.request_data.get('extract', None)}\n" \ + f"响应断言(assert_response): {type(self.request_data.get('assert_response', None))} || {self.request_data.get('assert_response', None)}\n" \ + f"数据库断言(assert_sql): {type(self.request_data.get('assert_sql', None))} || {self.request_data.get('assert_sql', None)}\n" \ "=====================================================") return self.request_data @@ -76,7 +76,7 @@ class RequestPreDataHandle: 用例数据中获取到的url(一般是不带host的,个别特殊的带有host,则不进行处理) """ # 检测url中是否存在需要替换的参数,如果存在则进行替换 - data_replace(content=self.request_data.get("url", None), source=GLOBAL_VARS) + data_handle(obj=self.request_data.get("url", None), source=GLOBAL_VARS) # 进行url处理,最终得到full_url host = GLOBAL_VARS.get("host", "") url = self.request_data.get("url", "") @@ -115,7 +115,7 @@ class RequestPreDataHandle: # 从用例数据中获取cookies, 处理cookies if cookies: # 通过全局变量替换cookies,得到的是一个str类型 - cookies = data_replace(content=cookies, source=GLOBAL_VARS) + cookies = data_handle(obj=cookies, source=GLOBAL_VARS) if isinstance(cookies, str): # 如果是字符串类型,就转成字典 self.request_data["cookies"] = json.loads(cookies) @@ -133,8 +133,7 @@ class RequestPreDataHandle: try: # 从用例数据中获取header, 处理header if headers: - self.request_data["headers"] = eval_data_process( - data_replace(content=headers, source=GLOBAL_VARS)) + self.request_data["headers"] = data_handle(obj=headers, source=GLOBAL_VARS) # 如果请求头中有cookies,需要进行单独处理 if self.request_data["headers"].get("cookies", None): cookies = self.request_data["headers"]["cookies"] @@ -152,8 +151,7 @@ class RequestPreDataHandle: payload = self.request_data.get("payload", None) try: if payload: - self.request_data["payload"] = eval_data_process( - data_replace(content=payload, source=GLOBAL_VARS)) + self.request_data["payload"] = data_handle(obj=payload, source=GLOBAL_VARS) except Exception as e: logger.error(f"处理{payload}报错了:{e}") print(f"处理{payload}报错了:{e}") @@ -207,8 +205,7 @@ class RequestPreDataHandle: assert_response = self.request_data.get("assert_response", None) try: if assert_response: - self.request_data["assert_response"] = eval_data_process( - data_replace(content=assert_response, source=GLOBAL_VARS)) + self.request_data["assert_response"] = data_handle(obj=assert_response, source=GLOBAL_VARS) # 由于数据库断言里面的变量需要请求响应后进行提取,因此目前不进行处理 except Exception as e: logger.error(f"处理{assert_response}报错了:{e}") @@ -231,30 +228,43 @@ class RequestHandle: response = BaseRequest.send_request(self.case_data) # 处理数据库断言 - 从全局变量中获取最新值,替换数据库断言中的参数 if self.case_data.get('assert_sql', None): - self.case_data["assert_sql"] = eval_data_process( - data_replace(content=self.case_data["assert_sql"], source=GLOBAL_VARS)) - logger.info(f"\n======================================================\n" \ - "-------------请求数据--------------------\n" - f"用例标题: {type(self.case_data.get('title', None))} || {self.case_data.get('title', None)}\n" \ - f"请求路径: {type(self.case_data.get('url', None))} || {self.case_data.get('url', None)}\n" \ - f"请求方式: {type(self.case_data.get('method', None))} || {self.case_data.get('method', None)}\n" \ - f"请求头: {type(self.case_data.get('headers', None))} || {self.case_data.get('headers', None)}\n" \ - f"请求cookies: {type(self.case_data.get('cookies', None))} || {self.case_data.get('cookies', None)}\n" \ - f"请求类型: {type(self.case_data.get('request_type', None))} || {self.case_data.get('request_type', None)}\n" \ - f"请求内容: {type(self.case_data.get('payload', None))} || {self.case_data.get('payload', None)}\n" \ - f"请求文件: {type(self.case_data.get('files', None))} || {self.case_data.get('files', None)}\n" \ - f"请求响应数据: {response.text}\n" \ - f"请求响应码: {response.status_code}\n" \ - f"响应耗时: {round(response.elapsed.total_seconds(), 2)} s || {round(response.elapsed.total_seconds() * 1000, 2)} ms\n" \ - "=====================================================") - allure_step(step_title=f"请求地址:{self.case_data['url']}") - allure_step(step_title=f"请求方式:{self.case_data['method']}") - allure_step(step_title="请求头", content=self.case_data['headers']) + self.case_data["assert_sql"] = data_handle(obj=self.case_data["assert_sql"], source=GLOBAL_VARS) + logger.info(f"\n======================================================\n" + "-------------执行请求获取响应数据--------------------\n" + f"用例标题(title): {type(self.case_data.get('title', None))} || {self.case_data.get('title', None)}\n" + f"请求路径(url): {type(self.case_data.get('url', None))} || {self.case_data.get('url', None)}\n" + f"请求方式(method): {type(self.case_data.get('method', None))} || {self.case_data.get('method', None)}\n" + f"请求头(headers): {type(self.case_data.get('headers', None))} || {self.case_data.get('headers', None)}\n" + f"请求cookies: {type(self.case_data.get('cookies', None))} || {self.case_data.get('cookies', None)}\n" + f"请求类型(request_type): {type(self.case_data.get('request_type', None))} || {self.case_data.get('request_type', None)}\n" + f"请求参数(payload): {type(self.case_data.get('payload', None))} || {self.case_data.get('payload', None)}\n") + allure_step(step_title=f"请求地址(url):{self.case_data['url']}") + allure_step(step_title=f"请求方式(method):{self.case_data['method']}") + allure_step(step_title="请求头(headers)", content=self.case_data['headers']) allure_step(step_title="请求Cookies", content=str(self.case_data['cookies'])) - allure_step(step_title="请求参数", content=self.case_data['payload']) - allure_step(step_title="请求文件", content=self.case_data['files']) - allure_step(step_title="请求响应数据", content=response.text) - allure_step(step_title=f"请求响应码:{response.status_code}") + allure_step(step_title="请求参数(payload)", content=self.case_data['payload']) + # 处理请求里面的files,使得日志以及allure中写入的是文件,而不是文件二进制内容 + if self.case_data.get('files', None): + files = self.case_data["files"] + if isinstance(files, list): + for file in files: + _file = os.path.join(FILES_DIR, file[1][0]) + logger.info( + f"\n请求文件(files): {type(_file)} || {_file}\n") + allure_step(step_title="请求文件(files)", source=_file) + elif isinstance(files, dict): + dict_values = list(files.values())[0] + _file = os.path.join(FILES_DIR, dict_values[0]) + logger.info( + f"\n请求文件(files): {type(_file)} || {_file}\n") + allure_step(step_title="请求文件(files)", source=_file) + logger.info( + f"\n请求响应数据(response): {response.text}\n" + f"请求响应码(code): {response.status_code}\n" + f"响应耗时: {round(response.elapsed.total_seconds(), 2)} s || {round(response.elapsed.total_seconds() * 1000, 2)} ms\n" + "=====================================================") + allure_step(step_title="请求响应数据(response)", content=response.text) + allure_step(step_title=f"请求响应码(code):{response.status_code}") allure_step( step_title=f"响应耗时:{round(response.elapsed.total_seconds(), 2)} s || {round(response.elapsed.total_seconds() * 1000, 2)} ms") return response @@ -308,7 +318,3 @@ def response_type(response: Response) -> str: return "json" except: return "str" - -if __name__ == '__main__': - test = RequestPreDataHandle(request_data={"files": {"file": ["导入TOC订单.xls", "toc.xls"]}}) - test.files_handle() \ No newline at end of file diff --git a/case_utils/send_result_handle.py b/case_utils/send_result_handle.py index a8191a8..1e7fa56 100644 --- a/case_utils/send_result_handle.py +++ b/case_utils/send_result_handle.py @@ -12,7 +12,7 @@ from config.settings import SEND_RESULT_TYPE, email, ding_talk, wechat, email_su ding_talk_content, wechat_content from common_utils.dingding_handle import DingTalkBot from common_utils.wechat_handle import WechatBot -from common_utils.data_handle import data_replace +from case_utils.data_handle import data_handle from case_utils.get_results_handle import get_test_results_from_pytest_html_report, \ get_test_results_from_from_allure_report @@ -125,7 +125,7 @@ def send_result(report_path, report_type="allure", attachment_path=None): if SEND_RESULT_TYPE in notification_mappings: notification = notification_mappings[SEND_RESULT_TYPE] # 获取消息内容并替换 - notification['sender_args']['content'] = data_replace(notification['sender_args']['content'], + notification['sender_args']['content'] = data_handle(notification['sender_args']['content'], source=results) # 获取消息发送函数 sender = notification['sender'] @@ -138,7 +138,7 @@ def send_result(report_path, report_type="allure", attachment_path=None): # 遍历所有消息发送方式 for notification in notification_mappings.values(): # 获取消息内容并替换 - notification['sender_args']['content'] = data_replace(notification['sender_args']['content'], + notification['sender_args']['content'] = data_handle(notification['sender_args']['content'], source=results) # 获取消息发送函数 sender = notification['sender'] diff --git a/config/allure_config/gitlinklogo.jpg b/config/allure_config/gitlinklogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..824a4a93e8be15508fcc443c2833267a5313bab4 GIT binary patch literal 7798 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 J8=GzKzX4jIE1LiS literal 0 HcmV?d00001 diff --git a/config/allure_config/微信图片_20230615174806.jpg b/config/allure_config/微信图片_20230615174806.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9fbb9d72e9c6cfaf3f63fc48dc9c6e9591429be GIT binary patch literal 2319 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 C8J%|k literal 0 HcmV?d00001 diff --git a/config/allure_config/微信图片_20230615174817.jpg b/config/allure_config/微信图片_20230615174817.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c27e2a4f2405f8b7709166f731aaab24d034e888 GIT binary patch literal 7462 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 literal 0 HcmV?d00001 diff --git a/data/login_demo.yaml b/data/gitlink/login_demo.yaml similarity index 99% rename from data/login_demo.yaml rename to data/gitlink/login_demo.yaml index 66c7a08..31de927 100644 --- a/data/login_demo.yaml +++ b/data/gitlink/login_demo.yaml @@ -7,7 +7,7 @@ case_common: case_login_demo_01: feature: 登录 title: 用户名密码正确,登录成功(不校验数据库) - run: True + run: False url: /api/accounts/login.json method: POST headers: {"Content-Type": "application/json; charset=utf-8;"} diff --git a/data/test_gitlink_demo.xlsx b/data/gitlink/test_gitlink_demo.xlsx similarity index 63% rename from data/test_gitlink_demo.xlsx rename to data/gitlink/test_gitlink_demo.xlsx index 2c98df4eb97848efd3e72863655b689178023457..f4e6ffe166c375b1cec031789e1aad45ace2f664 100644 GIT binary patch delta 3206 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 sEf5U3Eh`3@DF6Tf0E^kuC;$Ke delta 3237 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 X0002w36l;A8k6QN5C)$q00000NAKP$ diff --git a/data/test_new_project_demo.yaml b/data/gitlink/test_new_project_demo.yaml similarity index 99% rename from data/test_new_project_demo.yaml rename to data/gitlink/test_new_project_demo.yaml index 8266515..2922ab8 100644 --- a/data/test_new_project_demo.yaml +++ b/data/gitlink/test_new_project_demo.yaml @@ -34,7 +34,7 @@ case_new_project_demo_01: case_new_project_demo_02: feature: 新建项目 title: 正确输入各项必填参数,新建项目成功(不校验数据库,单独传cookies) - run: True + run: False url: /api/projects.json method: POST headers: diff --git a/data/test_upload_files.yaml b/data/gitlink/test_upload_files.yaml similarity index 94% rename from data/test_upload_files.yaml rename to data/gitlink/test_upload_files.yaml index da38a3d..12d3727 100644 --- a/data/test_upload_files.yaml +++ b/data/gitlink/test_upload_files.yaml @@ -1,6 +1,6 @@ # 公共参数 case_common: - allure_epic: GitLink接口(手动编写用例) + allure_epic: GitLink接口(自动生成用例) allure_feature: 上传文件模块 allure_story: 上传文件 diff --git a/files/TOC出库订单导入模板(2).xlsx b/files/TOC出库订单导入模板(2).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..08afc6ef3b9daf414a688c2aa0f1042e88eb5e9b GIT binary patch literal 18985 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

590c6U^ZzC4YyitF(7zK^5Z@I3uYYrd|NkN7 z$iJ5|J!KqG?XdMfD^tsX>Te-`oJfd3*a0f^OT~eY zXP771W+CPrs|4pnjDVp9gX57;5pe&QB>l_B{v+d}uFSzt$p5g(|LN-g#v<7f{R zDWhcG-btcP;kr01>s#TB5W(zdLT=oubP4y*V;DdEVRz@MV?V|rzZ}u$>LTHc`DoS@ zQ1NNXad+Jo*n+53{BMP3I*k9r+3~-f-OxLaJ@f{fIr9b;-h}(dNmOdVY80G)J~KYt zOc-oA?{YAfbBogOdKA*|UC3!vswbhg%`8apX&7ml>V@JgE{aRCxD@ZW`y4oZ&Um9T zYV;7-Zl_$ig}YSNxGK$GF4TU8%@%tj0280;zUp4Jt`KDgw+$jUOu`r(7xRbRzGPol2;8PpZ!Q7Nd(;5>XOOmoGuSS7f|aju(wb4}%$Gh8Hi zgF(Z}0Q9lDmLpXqczTh#sa9a4ykE>K5)!IICAc(FgoN_7HAv*)y9ggWZdi7xgt>#N z#1&c-DH9gOgPRfiE^@oNtnJi|?^n+PU6V(TnHbkq2n%D)-iVY53v;6)y7lzk9F^}A z<7eeWMYiZ_ml7iWYEui3@TFvY{Z)4S2KuO3P>>rDie@RrR=!$yXW7in(qhy z62B}hD7ZpfvHGh^!rQZUE>Ge|fIUs$(L=!WJ@&&0+lSmuHs@QR)`&WW!;NuR5*Qvx zWf7G7Sfoy_F(7ZToB!2&qt^i7<9S7-Af8Z{#-X%r?slZ-K;H@R;eE)!tcJr1mv74A zK^AVzRQU*53#rz}{QRa&Z)+_hZtO6D!F7CZ``N-gXy=pj0peTvewD#=*KOgEZ8RyL zMpY73$9#)!x8GIQo8PC>`zPC#wBGAb;gc`Z$2Bb%pWj#V2^AgR`z4C+W;qKodhK0{ z-`n-N-QH2IFFZD=C>_m&CM`{9$9te_!yae0GoYPeyzOSs(`#Xe8?NuYA@>T;hHG{E zRLohWY1a4ctD5+woSu)*`;OS1l@qrfKj$O8T{zy4`_C@5>92>16SXfEpS{T9&>C;X zkE^dvzpJLVtxmt29Pce-O0q1`ehZQ;+5WyK0m$di(7ohD&`#5XsW^SQLndH4rn55jg~(izb%o4ak`0B> zT;sJwX=Znt@-$hNa!CTq+DDr0_LGRzxdIOGM7}rj+!8TtI;9t!lg|0+4r?bsy7I&x ziX()NZOtPj+6o zaz{$-eD7OnxVf-l-WY!5cHumc5_zv(kak0JpTuT{cI{<59JFb5?L4*W-miidairD8 zw#o86f7~Cq;e8x#gy#Ci$YC`gf^R+V?@WJ@k!Scm-+a`3z4V#Y?D{?Rd3`y5uJ+{i zJRH1e>1{&}@ySBH20ZAO9)eZYa%WEnF`OVf$ueAR&#GF}HiNK=Gqma-U~7SCmDLHP z{c$JE@%|I$GcDy#PE6Os{4t=`nkK{NW#;+h#z+a*^YL(ByhRA2gm;~4=Q~92=I8dc zNjL5Ha$3k$!~42j5!&ZUTz(qB!Fs@L4lG}{1S>9AM zxw~*}TIx%Oqn+I}8G1M2(y8t0Qgv@cFKfk~)k=H?kC}cwAMVRf-w_;g%JGijeV&l~ zwguV}ckA~Mzs)00|F-YM6Ei!$=X;`))+S@Xt)H`s8C^fzXR|)fPE7(H>ocgWiL)n- z4X93(or0sY8q%q(53($~YvbKm?}Dp31KB_z-AQ^^2YsQuxcQ@;(2i)Qbh60ob9z01 zjv%rI$QiAX-e}HmoPnm4*yVP(gYTH9=Go=;xTEi&riLHJxW75e-Wrzj>cj-7KCt@5j?UCcA&;M z&=>qp#~ta}x__3K8atIJ&2c*Q_)!z5KcIvD8fG?KTU=XQXHpw{``lOYvI9@TJ!KQGOyS3ygjX#)AP8q#k0q=hnl0|clb+35KE#o-U-vA^d~IKOgV|J9UOp`9) z)YWFX@6GW26r116VOMf73YwZS>Ff0#f6~(z&B5xNApN`rX}0T}#bK7~l*M7T>!wA& zkbB|}FII+;-`F|*PCYBY5mgYeI}`-x^DCuwBb_)}NCQ}J#R7XgRzEK}c)^IPM_otf zKv1#!TLk!i+r(e?>CfF1nUYi$%}a1rWzCOqRCUgeanZOV(D56@zIj=@=V5yN3Fwb> zk3f7wex&&OXQ%aZ`*5G~4dlRp!7u&jZ74>lXjrX&8PGO_o=D;}q__L|?Kh35jaM4d zHaxUCrCo8H-&U^4aCUH*v0ZJO(EYjn<|nz_g*7is z2+co`+I0r24&nV+j1ldyV`RbDY)3MAsBdI)5<-31Z9Pc-#3k2)DfPcX=^h$=)oH1; z;(paJvg3Uj1cSmM)P7O_dML8f|Dp?VaxlY`zGo=wnBwEKzE1*Xe={#k(VgA9_?^Fm z?p3$z74Wc1V>}N~(IxcWhxTreN>b?+8_3tVi?=7&_pC_Wu7@XcJz_ezO7M9ohsU<@ z4A6CUs5*D6_q&Y&bEjlWHOPft)vS=O&1E<1zE*Yy{T;gH?)cQ4yI1e?CN+m{L{@Zf ztd*_z^p;>>-8ua}!)yrrda${(8FB9O6?Y8nguMC$s{Y|7`;DXi z5O1q~!NbHP`PzF2kzcl#m;_PwYw+p4f9k7hY6zZj$Y8zgv-zP)Q^=%s` z6Df9FoEp>n^Vo)Fzs?I6 zPTR}RMd#f*f9*^kr z$fy1wL~1=>G!0p-9rcVk?0zZtJ+M%0ag-Y4hUrA1{kP*w)WJPhV<6>ce#Kh6frdTv z*1RpM)+#JM6xqOBbE(Re9>gih`Adi{d0O4Tt_C5x`ah1TBF<4nqD-B+@*Lm`gwe3Yz*h5{YYV zfb;xCgnesqqT4$FfY53n>RL2E*}4(^ErbG^NP?FG!0v=70-6q@YTA)liPg2{j>}z& zCMdX>8_y(2Y*Y_~1~BESsjQr&oE^nLB&*1deRaIb>rJ3&k4Sph>2rFg%JUrE6S(4l z4=CLD`dE=|L9c2i#;h-U1gQpLS{eH+!upyZrhuSr;l=6QV|x+6TEMZ5u9<+y(7pM$ zVZhu-+1rM;H$lu$(FyF=7<|I4(6q(P^z03^ek@09jf0q}?k|HkrePsLSB-8F%|yJT z{#4!P`>O&BR5f}fZEvX2fd^Em=TF`$fA7;5d_miqpL~e|R28*JByXn7G6?%qRr3+N z5j$Es4uq3#6vG4jp^?Da%8a^-3W@k<@;r`cljgycFMPB#^TH>7q`~id4e0gkA$xu| zpZtYtVu?xYJw8>53uy>f;PcSlQ4pDpQCoJK*YlM1IYtlZ35ZrpHfgtWpwKV$7I5*K&-8lIYH|-!cJkm-`bkcG94^wxP2zD-bPnDJyD;LSp=W%G)(6EhklX4HmF>wr zP@K`X0KLC_6z??K-OHZLh?nk8krjYi=`HQsy8*Kno(iFzyIAG1gW8EqA`_I=(^OlP z0951aHmUas^3QQvOH|VL-tRcA<#&kiKa5>We~(>>ec!8w&>>gAkFWukO8S{^u(3S4ed>u~06jyK z_v$!4JXSNkBJm=hVj55KeJEm&hWBTKS%W{NVE!OT-jv2d$koY`Ccv_#(7^6f3+UOT zy2II$1Oe3{gl3B#Iex0LSaf3jF5Ym!XKP8d!}TuP7D2+b8R~wP(&9)LZJuZ~5$$`r zWISSs%SMO2nLeDeN75J!1~MAqve9$09a$AGd_L{BAosZj95_!l>_+z6ht0#7o)~M{ zAb?#C?bQ?QarJXOG=8%jx@*1Rv&k zQet(-S6-2=S4b@?1b4U~sN=r3f_Fy{s`@qrc62MkCr|w6Mxy1wckDUOnSDfV3d-_l zOLLGHbV>?JqaLol6r~qsR|s#oLuw7=fV@b|ipmfyG&>ouey-sMz`|cm;`stOQP5+$Zt1rRf<+-WoB-6eHJ6qby@{-tA?is06UPr=oWGFHd`v%q3j>gT2> z`5KtGzwVsg9;-+u&pckX)WGldL%IA48cv9&X%9Mou z2E?>=(52Vb{q6z8-UkXK`^O;fq>c3|RjgDHgukwe$pKqhNRbfr{oHn%<@($xgE7I$ z@hD5(aj;~qAPEi&q}tq~%tt~o1YH^X;fk*mh>5w6pH)7N)Ld(nXJie855TkrZ1cV# zJNognY)?2mm}$wXma!fVbx-tw%d|%xv_4FGG+yTckU?tavLa6!>b5qoSRg9_$N4zD zpESEJGJ@IO?P?r0t;+nMY6RN8UNL>?j|GuwI>8Q}hcUZ#?QC4mP;~5g*0?5BOs&>N;IWrfQNqo$n!@K zOYm?^UxR?k_vi?Zr6FC#3D+sl=ix*}9lgloFNG{b<$$w~8ISbj5Ue0b)zs*{Kfew! zT|GpWmd57f^1dG2-|Wqc@f~$j4*(~Lmh4nq^*q0=%XRhS_&lACso8eY-}HRluiEwa zo`Ci9YBGAhJk0au@cFz<9{GJ<4+3uOnOpaZ5%=|Xgv)huQU7c@>0SAKlh%_yL@qj5 z&(HAe+Il&$0<@V$blQJm#O40PE*=KuZu8i?%Ng||jX3g~ZFdj|mqGLi!wqaZBx54% z+B`+{a_r^z;Kp}$5{nyJv8v@;19W3ztG26=^=zk%0;NKb5;f05lnjGwN)aVLjQSmIG1U{V;nt*r{N@k(gCU0T2%F}gSbP&wXvcPw6C90_9 z8R>$-1IHjlOR#tNu@wLJMxAz>;hwZ@7J`?bE0M9eG)# z#U?+?$e1oi4_JOzzT!-sfEZLU;-9DJk`ePLb>3lYPPmS2?G3hhz^V>m2TE29==<(29bFmk-FOL-jX z0|buC>Tx=F;7k}km$@=Z>+cZ8G)9l4zXy%FqZdNUUa{zLgbVL*BI*u<{K0&vop0%% z*Ki!{e_zt5_=ROkiwiV%;NGMVGY~Cscx-Crkx02=)g0e_Lkmv6&PHG$ZJM~^8fQ)e zrV@Amff;a!pRe|)s@{l0O-uC@sa#bDU}>Vd9kk!qR=&q}st+V;ZzG5tN-5`2j<&iu z=AD_oi7Z_KRDP{kSmtk1vL10ZeDG`Wpx8A=T8lW!u|eW^^ca`a5P7$NbMe^2ywjq3 zeIiNoUYR^X9i3S-^(%Tv#0kc=VvS!(iNgFe+xh*_6+n`9YG!((|= zVD5r=Zw%zeoOB060b#ZuXz+AX|BG^_9(E=5D)byr)Buv5wAnjs0HRf+C8a+B!gWMx ziWn2|wQ40`i^aRGwK4{-K5|plf0GBSF;4L}vbsE?# zIIhjuJZeo=&$pbltv}Mc*_@r}tz);hbUZ!~t-G@5&wc~Ns=d5Pa`AAnSGx|c>z%Bh zb|lv^?lWk;aj*|VM}Rw4F$ooFGU-qtlf7$JPmY>d-wJaUokG`sGM#ojXmhX^&r)sK zEINrYlq%T5l!D6JT5iqJ`n=5*_sd*R;(oaYemzd+Mqxjlf_(^GK2OQeq&|t2G6(gr^nkp=%#qmx-(gm8!lC{=mn6s!GkudJI3 zDqW|EFpKPevAFE3-=aH0bg#G>8CEsfJa6_hUk#t}`uEb|HOz%-0~CYS;2T_4HPZ}O z=-We<3Cbwn?z!o7NlUbx-`no0kmH$x6Max^@j|=6ph6D8)P6$mD&ZIEk+d_kgXj#} zU|Ubznu0xJAZy0P)Mp-3rbuC>l&FW9o7e)E$P!afA8(Kfys^SI^KaqpJIC0N>+?Sn zn-2k9%O_mGK`E)j4CK!f0om2Fix&++!MkoLTZ?ebrF+{Gjm8pKoc zLDI}MaY>ZHlD`xYs=9fOnLGBU20fCTj--bP%BPM%Y7mc8Yz687y9|B0Tj?7B1v1*{ zrvpGPMJQ0_pDpv$E(Ad@sWdxEvvNj_L^M0lAmcD@t@{BGlq>QH8zqVhHN_0X={_q^ zeGxUBa397kD#*|ig+(%kk&7H8BBe+@J%^(p8=EUSAl`!R+~o-AJ)T(e`RlGBhfF-y zXxfhX5y*8b*GtrAt(C_qAc$yDwMow^V{>zJc;24hr=ONj2AH0mZr)R z)Bw2aDBPNX$A)IxvY|`NR6O^Bn>Dk>W>#Cly`p;0cJ5)d#O9YSg~r1O=afDT{qbQp z-=s|uKa>)scW%!{Env64hWpj7`{3F5wiztjW0Jc96!N0!KB6u^ns?YAX^A;^|IX_I%VDFM5#UY>=^)Eztj&S3f zkeq``I2>{8<|ty%K`-l&{d<4Fd(jPHz#(lrK@Qi;01H;iPbtkTDsvkr45+u+HqTdJfmA8fE|3pbs1>%X(dv`YuA2(#$^XN(#S5o{lF#zT2L1rZkKD$#gVfqxWHgE$NICAH zRg9}RSD)k5Dj9Vf*OjYPAN3Y9xIa^Xv>#mlHLN;E&U3JJETiSJ<1Jy4R0mN_hc^yS z&7c5b?yoSmCR?uJd@(*-k3VabYGARKdF{s#*MN@Ms8pvwM6@wZ1cHS&!H`d%#JYUE z^y5{Up!*U8`WtfL5MeRI`K77Jf20Q-K-X8g@N`Nq)7AV?6%pZ!!)!i6(i1n zC`QaZZUSB;fa+S4yWAJiEfBeV0T@#zx4#jcvB~gmC}>1K(UUXUCAHgi02^*= zs)%Na{OPf+#s-yOi%~@AkY={+-i%5%>+fZazR`y{dL+|@b?p)8+`#(q1iP&jgK2Wf zY9Av!oi#5Wuakueh&o{px_786%1xL8LT%h;TawSjfVgC?@+>9%>OjnT|UFaSu@Ygj0tGN2t)y{GF<9oSZPMEc{fO!v^Jcn@2{#X`QA-h(Oc?L=(`_ zke&QB&2Q$hZ_PawN%1$qH!bT{C-X9#Bc6wAw2>FIa})!zez7?DnAB37&6uGvu!#}i zhtSR6nzhFqnUeQ+?OWs>^E+5ObjGdhd*%jgAbNS`gGC~V`>v}0bWe6>r+YQ4E^+UZ zU;;V?svpXNcc8RtUk^y{t37xIRc81&Xgw`})G@a#cv240q;_t@&4h1f@I}OOTj37B zjqkU*!N5h8Yl!hSe7`+{nk_rAKtTg#KOv1CN`4_gW!PVO5UjMc2#*xD?5Y%&`;Cxx z8)jMW?nMM!{)lr^o)&*te>8NTgWz2d zPZ{EnAGTM{fNqrwUA^s(#qB0d736eyK6=J<;}UvD+BuAk{)2n8cevF_wl@5Aw1EPE zKhZ-iN=yOJBs*4JZ7szk&`~aRN8l237#6N%uSoG`CeNg$)mz z@9X{fSf)0}RV=5@ib+TeaiB^+h}oA1qwj0vGGxsg^9(gRW_^WdT8Z*=NOOL4&-3|t zt{a(OE8pkw?8}dcgsk^)!9zXW(rxmnFg-LS#u`t96xu4S^ zQ32MbNMM}4_D@3%Klb##PTx1&*imM8q7u&K5KEX1RR$$~3=5Zbu!kyR`+1%g4yBv9 zdP!KS;a1CqI`u`xTn=F-D25L~4ka5Ijz+(2c^$#!%K4(X2X*@O3rqPt-^xw*wI{}I z-RvZ!f}ta<5>Q&N-<0NNW&3)39^W5y*yV^6MdTB)ob7M<@%4PE;wwVq_|rh(6i4%8 z+gzm?auD?uMF&mpf4m*xy(+|8@ zq|jd&8b^JFgdpA9-Rw4XWba20-c|>f$5*7kY7{O2b-s$J1%3%^2=!ngt&~;_@g$R3 zq(QNi!%QXOqCgaFZJu!GSkI;0rT66?NhC*_(Xnmq&JwHdJ9VpGrO9=SzwqEowqCdU zs{%h^2t4&rd>lCq6m4+|sMK`|OHl$z3d}Cvqxum>@9VLKJw2;o+)qFf>!hZbI)pu# zlnU_`@+!n2sB_5QR3cCDaBp(qA$1TU*~|!%QCRyBa`yki@;QN^{offSc*(lO7wktZ?q_cjbM)5Ci+Vq2A8;^wK*}>f`)~`=0EO#Mj zS01h0JdJ`;ZM$7nt8ukpr`DEzw@|gtCaX0&z*)x~*tp6x4~Ep#uK(aD;@c5^0x0be z53Px#Ii-oJJVx<5y1qtvzd+|;E6VGkLMkzMQx~f#Gr#W4!ukvffdte|JPAa;H)HDu zx3t%l4LmwvcGvYSR_Kj|22>oiuvas0E2-6Ll=WjGjl#4Ma^r;6vtU+stx(oy^HFT< zXKtm6z{XN6+s`9TFR|1z+8?!mZ}zsDcr=^6BW(S)s)pEsv$W7SF6f@LZBgbU}@ z$E@NQCpZQ3#E@Dj`r^oeuH=ZRW7o@r}G?AN|pElYXL=m9=kGTQZ;nnJF38ScSYh=F{Xe%BV2(25Mgr)8l) zY0lf~rtIRMjRr}qrhZwQfticj5QrXw76n#Ju8xir4RRDrzR*v$Ps+pO!~%pDli#{W z`rFXi&0a46k6zAe7gIlRK5V3!>|T3fAf&6IJM5Qxsit)6x~8TUo&KO{+Rn;&_{)5e zN$!XC)wtSz{Jl@*zc#E)%v~2=wxo-Xkx77>}X+Y_V@SYq{fC4 zrW&%}mGsw-kSXW2baLvnv?6gZKqMq0Xmi8Y{>t`n+2`8xQ)UlAt-vx6rGjDbUnQ!O zscWPN0pwp&9d2$O<2^GC)EX%rRvUdGzu=&=oGy9vp58Ax)YgmfgaigaP>RKfc3_ES zEm<+kuH}v0nY~K~R<@QG9XHMMFc`U|!H5jX2i#)|qEpZHd<_aMh5@VwoI@Rg42Eel zr0-|IQ3y|#M$u8grY^*pg&D7zJV%6MMJOE8aP!GYk(o7qA3Bx5b6~P!h7j%Shnssp=S9mLB#}RjzqW;1Iq$Q3#~hAXvr(Y)o_T^nGKSwZV$C>j z&KIXgWD&lCc17>lo`&`#M_EN+lvGk-G_XOkC>hU*%GTT1$^DE{ zg`1t~Hclz45lEJ0WamW3;gKjkS%|oQ31Rdy@5ZN6BDJK7MolPZmhKV##ZCWQ)#a&M z2smqJ#!9-rTE>_?OJ*!G?$2LV&mh&c9M#p?IZ1ZNGS!H^ytYFpcVQnZm&q)O2I%8a0tk-MQ;>U9N>S0TU zv`9GOe4~`^^@T8SO6t^kP#CZ$V>BA;eliyE&H2riVFM_vKZ*Cp^wk)tGc$pTN`mKP z`pOd>u3*M78W`XZFcONB|k^I^p+npDM08yNNBkiGFM|L-uT##=&v4s(GvCqO(P0?2rdL;_;;8 z!35Vcte!k0YE?{~;qQOXyw52+2QaQtJ*sD-K!E$pYX-|9*SHu)gMBU7 z=5k(h&gary(?OzWi&J*^X>{$r9wIu?aTwPNKPnIsvn z17Uj-oRbIkv!#GN)|Rtjetq>$WtQB=e_Jn;^nqykLYc_YOy<3cvC0tsfhCN*!E2g% zP`FFXGEifBAnRe4%bE1mQ5lZH)<8%A@@Kd{ka2<8lXrGD#=cccH=7oZo713vx!XSJ zSy_O6wK+s)?x8UsNxTo7LzF(3ytk2oowkNLFWsjxH2^F$_thU!qQ4)Plz@-^?K+Z* zWvYLGRbPCzOrROlFt1}@ugCNb!a=&?H{D3HyW=vc4!J#it28uofjUCFP{FI0k<_aX z;OFV0-}op#H-b;ekJ5f8f*Z0HR5aJ}Sn7f)O4pn`Rqq4K>ujjAnX|;HV$|p8{t?2) ziuIWm1e%MP7QxOUHC|hq9|LvjdJ(03qyDv-LQW*i4XV1UWwC}I4H*(IuqqP`;*-P5 zAME2iOk;_@GVM>Nz5eYIJzh_=)i10vu!+nDb>*(z`V6^NBSSvM?&idX*NFxp%+3nz z>j;EbV*TukCtuyAcczi^ev{!1!@>sNR8?62IECXN<6Q~-QMfN*C1cq7tw30x!eeHH!PhTCmBkBt2;=pR$%Nu~H9i?v}>uypLd@V&lX5k_2 z1PK|#l3G$uHoX`3_ny^8UVi0H7@A?@(FNWUydu$54^kmic?Wl8(99BYI?T!2i&0?_ zp~VuutW-GU#5fF-yU(5JW!($mlGhx2d{qRqZa@43vg}0c zh{3?L-8$Oe{=!5sq$ zV!W!vnFoB~uYCdj^YW|4*E5yX_g>nY?{FO4e{aAvw6nANJ3N~-VLQ){9{eQU8HnK_ zkFM{5c>L0xxW`_z5m<6KxeD8OEj!{WGdWVce!x8voN@Vp ze=ie=h@p0_gvRSf2s=IsYJ+NG(0h|&ajt|T8 z0iBdow?0iv<_ToxR-({kwC?iHu}fIzgj9!ZAYXGPN}ZI;6nViI{F23z`AO;wBPlD$ zDv1S@$VrTWd5#hk8-@19gc7Dq$`X+z86CIK2@9%Ss>zuwnw!ZO>NHIP3~I!O5!NY| zm+#N)?5p9r?|A?fAnGQduTY|NaQzL1H|EGWKA&9=S^YYse-1QS_sDVs5)H1;`~|fM z22oU7eTKa1vFuxROf4&Dg}~{;1Ga?FP?Xs1(9lsSF&c&6N;U3zg z4D;#$b6^kde6h1DKbzX-NiP(dW}@0xj?Z?njzftG^e$ZKfqxJI1LK%>bm5)2a+3_L ztTLs65z!7#Q;PU=pxxs@oj#&1ix)wXH~GRpKY!HU7eA}jI3dm%L{f0}Ma(!dxS!&| z%c3XlcuP~^_Mdh6zoYX1PM!GAml$u~YFzkE*}(iRzbDN9fc>?5`~M6Ge`~iZal&$d z9$w@r_%krghi2VE2qM0LBG`KU9yo}{7ha1o<7B{Zt1q%OWZPDnH6UH!DQ8yXZ9s0h zoDO=y-3&k6Q2y9akGY!h+QHMu9ZbYp$3W|9rq>@N^!(HIE2PS#P1t2V5fMcU%<|B; zl;wcMHHC1iFj3+}$V_8g{$%seOesvbm(NQ z&esYxZ=TtvlKW~cf_qO0A7AP^X_}9jx53Na#7n9(o*XlnKI6+9{j~k4rDuL6t5Pv= zm5VGeiGofeh<47;D@n~Oi4UnPNG*;9m7rUJCFmhgSWW%KKXJRLVZh2&T1?$`({zJg zvhVoT;&Oz)k_WiF?1+P^0PCd-zADG(Rlkd|XIs2<-6YluowX+;^xtk`>DjW%XOYUc@%W0*Yd|Z`y_SB4mby`a~o=nm2 zxwW{&tYwPUV<{c4cJq|xkIgMr&&m%hd)K?@iv45WzFos*t;_!6GAIDaJI+|+3}OKG6AeIx5d?rvX)$v|6iuj>q8CmeJrGNy z;CjHB37=)4+zJ68%Rm6>^cYn8(9e$nDTdgmj;sxOnhbgnp`U7k(0v}5yy2F@&NxBW zj(#c!Lc1TZFhOXCpV5KO(?A_i0P^$&-~w1+NrX=WYA7{1Ar)Qd4n;5HKo&tlX(h5Y zj1mvs9Q45jggF)F*oPX>O+cUbMwlS42{8da3r@V>-zb5#!q!}&rV#X1R|p%0m65a| z)?lGK8NIEDFkqe?*Z|~U!{=zwsUQ#lis6rt7)CiG1l8r}r-Xp?LSju8*lY!+4kW#Z zGegjwkG`B5VTu)ShzN@*;KkMGrl2ouM40kT0jnwCWsU*ftl)w}7+6hA2Ku+b6{HUU D4$ryi literal 0 HcmV?d00001 diff --git a/files/toc.xls b/files/toc.xls new file mode 100644 index 0000000000000000000000000000000000000000..5ecca499a3d19a7d8ff563a09816fdfe63e52245 GIT binary patch literal 6656 zcmeHL>u*#=6hC)+x7`Iw-#}Ztu8Z_dX$zG{1G_v*VtkZPwI zJu_#{nR936?3M3|rbfT0xGovALvmy$?w8yYzJWHOR4C#>gU>VZc-&%&pt(eg$OC_4 zuFLE-G*Np2u6Z8d1N^{pfNM-F(f#Ft{c-|-!xEGZ8ALrKBUtVE(<($v!Xw-dveAco zci*})ddaV4OSGjq`W={<%NUT`PcmfJ;{Z;0TZ+pcp6tN`W$96|fpu1C#?5Kqc@1Pz3~l z2Z12)5D)^^0uKZ0fNG!ys0HePdY}Pl1l9vh0QaJ1)Ga`({k#cvo88`wdJC`>*k<$S zpCwB7fZvBz%=OAQ`Iqx1B4{EYt|KBYm=hWoKf-rCa#EIwu~&|3VD@1FcFPeNKwt*{ zE83-V=rb6bl?j$#0w&5UN<0O7S_QUy6dCsNdW}M#Tb2~Ocmzy^0UBKLlLqFi&HM{1-AV=}V zwu*63g7yUK(MnoIe!HZ*jsjF0nRqDYeoX+oo zw*%%@L}rC^mt>5%b#6y=R%UiiOxjti_14ne0nNc|-LuUgInb1zS0aDJd5$G$JV?HQ zN9F%MKR)*&CwVtMM|G0FpZSK~7ib~L@-xqO^~0YQH_7+A@atXp4KDn~Is7vo+;d_Q zXI&V})w(F=)w(#Ar*%mzN9)p<8Sgc?il-12Uo$Df3E8EG-vDlBEy~Yfl9a}8RsNH_ zIHmD7%4yuPp26RQ;RA5@`PPsz!^F8}m}5BOtc-d!wqXN*GswAaYaYgta5mwj^5HB- zUZ&@E;q1AMvqF}8QX?66DaAj}XuWMO7EB$l0CZ%0F+rAO5OKFc{-}Pfw)4$MC&IuM= z?8X07I8ht&G~OT&_1NixO0n4CDVB?LmqdUl8=xxK$eS#PpD^hxhxYgTN~NFqtW7jv zC$Qv7+m-5<2+Ac_-fL7Yj4O4Ne=oQXVB07-=b6;qi7|ewU`z@=`eeF{86m!daXTyi zziXX+;ycV*PZuz^^vn17Cf`JQ$7dts*^~0D8>Q(?smrk?n@W&!2H&PbD6g?7w(pQ$lQa{ ziERBavh+i^k&_}Usy{wI^7vIFA?uVlQEU)!n?Ln>CNEEZ&{SD?=6%e+@#feb@Vptk zVen`N4FOb^VVHUG~#tE0A$Fe3CMa_6&?32$nWB)P4MJHl@2+ZaD>_UAMl2P1e w2JnWI8EgCocq?f|l(wNP#arg8W400aQY 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 VZ&pw%23Sc5GfW2hx4;#|0{~)Xx7h#y literal 0 HcmV?d00001 diff --git a/pytest.ini b/pytest.ini index b2b6fd0..526825f 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,6 +1,6 @@ [pytest] # cmd params -addopts = -s --cache-clear --capture=sys --self-contained-html --reruns=0 --reruns-delay=5 +addopts = -s --cache-clear --capture=sys --self-contained-html --reruns=0 --reruns-delay=0 disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True markers = test_login_demo: login diff --git a/test_case/test_manual_case/test_login_demo.py b/test_case/test_manual_case/test_login_demo.py index 0a0235c..14fd199 100644 --- a/test_case/test_manual_case/test_login_demo.py +++ b/test_case/test_manual_case/test_login_demo.py @@ -21,7 +21,7 @@ from config.settings import db_info from config.global_vars import GLOBAL_VARS # 读取用例数据 -yaml_data = YamlHandle(filename=os.path.join(DATA_DIR, "login_demo.yaml")).read_yaml +yaml_data = YamlHandle(filename=os.path.join(DATA_DIR, "gitlink", "login_demo.yaml")).read_yaml case_common = yaml_data["case_common"] cases = [] for k, v in yaml_data.items():