From 9d3eeaa792a4d55e8d74dafc83173947a58f968c Mon Sep 17 00:00:00 2001 From: zy7y <7631909+zy7y@user.noreply.gitee.com> Date: Mon, 19 Apr 2021 13:03:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A4=BA=E4=BE=8B=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=EF=BC=8CAutoPEP8=20=E8=A7=84=E8=8C=83=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/__init__.py | 3 +- api/base_requests.py | 47 +++++++++++++++----- config/config.yaml | 2 +- data/{case_data.xlsx => case_data.xls} | Bin 386048 -> 392192 bytes run.py | 30 +++++++------ test/test_api.py | 2 +- tools/__init__.py | 10 ++++- tools/data_clearing.py | 57 ++++++++++++++++++------- tools/data_process.py | 9 ++-- tools/read_file.py | 3 +- tools/send_email.py | 20 +++++++-- 11 files changed, 129 insertions(+), 54 deletions(-) rename data/{case_data.xlsx => case_data.xls} (90%) diff --git a/api/__init__.py b/api/__init__.py index 9534fd8..0912097 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -6,4 +6,5 @@ @file: __init__.py.py @ide: PyCharm @time: 2020/7/31 -""" \ No newline at end of file +""" +from .base_requests import BaseRequest diff --git a/api/base_requests.py b/api/base_requests.py index 12d83bf..1fe782d 100644 --- a/api/base_requests.py +++ b/api/base_requests.py @@ -9,7 +9,7 @@ """ import requests -from tools import allure_step, allure_title, logger, extractor, rep_expr +from tools import allure_step, allure_title, logger, extractor from tools.data_process import DataProcess from tools.read_file import ReadFile @@ -31,11 +31,13 @@ class BaseRequest(object): return: 响应结果, 预期结果 """ case_number, case_title, path, token, method, parametric_key, file_obj, data, sql, expect, is_save = case - logger.debug(f"用例进行处理前数据: \n 接口路径: {path} \n 请求参数: {data} \n 后置sql: {sql} \n 预期结果: {expect} \n 保存响应: {is_save}") + logger.debug( + f"用例进行处理前数据: \n 接口路径: {path} \n 请求参数: {data} \n 后置sql: {sql} \n 预期结果: {expect} \n 保存响应: {is_save}") # allure报告 用例标题 allure_title(case_title) # 处理url、header、data、file、的前置方法 - url = ReadFile.read_config(f'$.server.{env}') + DataProcess.handle_path(path) + url = ReadFile.read_config( + f'$.server.{env}') + DataProcess.handle_path(path) allure_step('请求地址', url) header = DataProcess.handle_header(token) allure_step('请求头', header) @@ -49,16 +51,24 @@ class BaseRequest(object): allure_step('响应内容', res.json()) # 响应后操作 if token == '写': - DataProcess.have_token['Authorization'] = extractor(res.json(), ReadFile.read_config('$.expr.token')) + DataProcess.have_token['Authorization'] = extractor( + res.json(), ReadFile.read_config('$.expr.token')) allure_step('请求头中添加Token', DataProcess.have_token) # 保存用例的实际响应 if is_save == "是": DataProcess.save_response(case_number, res.json()) - allure_step('存储实际响应', DataProcess.response_dict) + allure_step('存储实际响应', DataProcess.response_dict) return res.json(), expect, sql @classmethod - def send_api(cls, url, method, parametric_key, header=None, data=None, file=None) -> object: + def send_api( + cls, + url, + method, + parametric_key, + header=None, + data=None, + file=None) -> object: """ :param method: 请求方法 :param url: 请求url @@ -72,13 +82,28 @@ class BaseRequest(object): session = cls.get_session() if parametric_key == 'params': - res = session.request(method=method, url=url, params=data, headers=header) + res = session.request( + method=method, + url=url, + params=data, + headers=header) elif parametric_key == 'data': - res = session.request(method=method, url=url, data=data, files=file, headers=header) + res = session.request( + method=method, + url=url, + data=data, + files=file, + headers=header) elif parametric_key == 'json': - res = session.request(method=method, url=url, json=data, files=file, headers=header) + res = session.request( + method=method, + url=url, + json=data, + files=file, + headers=header) else: raise ValueError( '可选关键字为params, json, data') - logger.info(f'\n最终请求地址:{res.url}\n请求方法:{method}\n请求头:{header}\n请求参数:{data}\n上传文件:{file}\n响应数据:{res.json()}') - return res \ No newline at end of file + logger.info( + f'\n最终请求地址:{res.url}\n请求方法:{method}\n请求头:{header}\n请求参数:{data}\n上传文件:{file}\n响应数据:{res.json()}') + return res diff --git a/config/config.yaml b/config/config.yaml index 9ebf4a6..d927e9a 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -17,7 +17,7 @@ expr: token: $.data.token file_path: - test_case: data/case_data.xlsx + test_case: data/case_data.xls report: report/ log: log/run{time}.log diff --git a/data/case_data.xlsx b/data/case_data.xls similarity index 90% rename from data/case_data.xlsx rename to data/case_data.xls index c58329a81722fd8d705a3f083e7ac48e1361c51a..334e488b3f33df4230aeeec12b28a199a161d5ca 100644 GIT binary patch delta 20518 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

*Dl$d$6;Qmzvm=S-P9dBzMje^q0f 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 str: """ for ctt in re.findall(expr, content): content = content.replace(f'&{ctt}&', str(extractor(data, ctt))) - + # 增加自定义函数得的调用,函数写在tools/hooks.py中 for func in re.findall('@(.*?)@', content): try: @@ -89,4 +89,10 @@ def allure_step(step: str, var: str) -> None: :param var: 附件内容 """ with allure.step(step): - allure.attach(json.dumps(var, ensure_ascii=False, indent=4), step, allure.attachment_type.TEXT) \ No newline at end of file + allure.attach( + json.dumps( + var, + ensure_ascii=False, + indent=4), + step, + allure.attachment_type.TEXT) diff --git a/tools/data_clearing.py b/tools/data_clearing.py index be29e9e..fc843f1 100644 --- a/tools/data_clearing.py +++ b/tools/data_clearing.py @@ -19,13 +19,23 @@ from tools import logger class ServerTools: - def __init__(self, host: str, port: int = 22, username: str = "root", password: str = None, - private_key_file: str = None, privat_passowrd: str = None): + def __init__( + self, + host: str, + port: int = 22, + username: str = "root", + password: str = None, + private_key_file: str = None, + privat_passowrd: str = None): # 进行SSH连接 self.trans = paramiko.Transport((host, port)) self.host = host if password is None: - self.trans.connect(username=username, pkey=paramiko.RSAKey.from_private_key_file(private_key_file, privat_passowrd)) + self.trans.connect( + username=username, + pkey=paramiko.RSAKey.from_private_key_file( + private_key_file, + privat_passowrd)) else: self.trans.connect(username=username, password=password) # 将sshclient的对象的transport指定为以上的trans @@ -46,15 +56,22 @@ class ServerTools: logger.error(f"异常信息: {error}") return error - def files_action(self, post: bool, local_path: str = os.getcwd(), remote_path: str = "/root"): + def files_action( + self, + post: bool, + local_path: str = os.getcwd(), + remote_path: str = "/root"): """ :param post: 动作 为 True 就是上传, False就是下载 :param local_path: 本地的文件路径, 默认当前脚本所在的工作目录 :param remote_path: 服务器上的文件路径,默认在/root目录下 """ if post: # 上传文件 - self.ftp_client.put(localpath=local_path, remotepath=f"{remote_path}{os.path.split(local_path)[1]}") - logger.info(f"文件上传成功: {local_path} -> {self.host}:{remote_path}{os.path.split(local_path)[1]}") + self.ftp_client.put( + localpath=local_path, + remotepath=f"{remote_path}{os.path.split(local_path)[1]}") + logger.info( + f"文件上传成功: {local_path} -> {self.host}:{remote_path}{os.path.split(local_path)[1]}") else: # 下载文件 file_path = local_path + os.path.split(remote_path)[1] self.ftp_client.get(remotepath=remote_path, localpath=file_path) @@ -76,11 +93,13 @@ class DataClearing: @classmethod def server_init(cls, settings=settings, server_settings=server_settings): - cls.server = ServerTools(host=settings.get('host'), port=server_settings.get('port'), - username=server_settings.get('username'), - password=server_settings.get('password'), - private_key_file=server_settings.get('private_key_file'), - privat_passowrd=server_settings.get('privat_passowrd')) + cls.server = ServerTools( + host=settings.get('host'), + port=server_settings.get('port'), + username=server_settings.get('username'), + password=server_settings.get('password'), + private_key_file=server_settings.get('private_key_file'), + privat_passowrd=server_settings.get('privat_passowrd')) # 新建backup_sql文件夹在服务器上,存放导出的sql文件 cls.server.execute_cmd("mkdir backup_sql") @@ -93,14 +112,19 @@ class DataClearing: if cls.server_settings.get('mysql_container') is None: cmd = f"mysqldump -h127.0.0.1 -u{cls.settings.get('username')} -p{cls.settings.get('password')} {cls.settings.get('db_name')} > {cls.file_name}" else: - # 将mysql服务的容器中的指定数据库导出, 参考文章 https://www.cnblogs.com/wangsongbai/p/12666368.html + # 将mysql服务的容器中的指定数据库导出, 参考文章 + # https://www.cnblogs.com/wangsongbai/p/12666368.html cmd = f"docker exec -i {cls.server_settings.get('mysql_container')} mysqldump -h127.0.0.1 -u{cls.settings.get('user')} -p{cls.settings.get('password')} {cls.settings.get('db_name')} > /root/backup_sql/{cls.file_name}" cls.server.execute_cmd(cmd) - cls.server.files_action(0, f"{cls.server_settings.get('sql_data_file')}", f"/root/backup_sql/{cls.file_name}") + cls.server.files_action(0, + f"{cls.server_settings.get('sql_data_file')}", + f"/root/backup_sql/{cls.file_name}") @classmethod - def recovery_mysql(cls, sql_file: str = file_name, database: str = settings.get('db_name')): - + def recovery_mysql( + cls, + sql_file: str = file_name, + database: str = settings.get('db_name')): """ 恢复数据库, 从服务器位置(/root/backup_sql/) 或者本地(../backup_sqls)上传, 传入的需要是.sql文件 :param sql_file: .sql数据库备份文件, 默认就是导出的sql文件名称, 默认文件名称是导出的sql文件 @@ -109,7 +133,8 @@ class DataClearing: result = cls.server.execute_cmd(f"ls -l /root/backup_sql/{sql_file}") if "No such file or directory" in result: # 本地上传 - cls.server.files_action(1, f"../backup_sqls/{sql_file}", "/root/backup_sql/") + cls.server.files_action( + 1, f"../backup_sqls/{sql_file}", "/root/backup_sql/") cmd = f"docker exec -i {cls.server_settings.get('mysql_container')} mysql -u{cls.settings.get('user')} -p{cls.settings.get('password')} {database} < /root/backup_sql/{sql_file}" cls.server.execute_cmd(cmd) diff --git a/tools/data_process.py b/tools/data_process.py index 878c8ce..4db8967 100644 --- a/tools/data_process.py +++ b/tools/data_process.py @@ -112,10 +112,11 @@ class DataProcess: # 获取需要断言的实际结果部分 actual = extractor(response, k) index += 1 - logger.info(f'第{index}个断言,实际结果:{actual} | 预期结果:{v} \n断言结果 {actual == v}') - allure_step(f'第{index}个断言', f'实际结果:{actual} = 预期结果:{v}') + logger.info( + f'第{index}个断言,实际结果:{actual} | 预期结果:{v} \n断言结果 {actual == v}') + allure_step(f'第{index}个断言', f'实际结果:{actual} = 预期结果:{v}') try: assert actual == v except AssertionError: - raise AssertionError(f'第{index}个断言失败 -|- 实际结果:{actual} || 预期结果: {v}') - + raise AssertionError( + f'第{index}个断言失败 -|- 实际结果:{actual} || 预期结果: {v}') diff --git a/tools/read_file.py b/tools/read_file.py index 7142c33..8e73be1 100644 --- a/tools/read_file.py +++ b/tools/read_file.py @@ -25,7 +25,8 @@ class ReadFile: if cls.config_dict is None: # 指定编码格式解决,win下跑代码抛出错误 with open(config_path, 'r', encoding='utf-8') as file: - cls.config_dict = yaml.load(file.read(), Loader=yaml.FullLoader) + cls.config_dict = yaml.load( + file.read(), Loader=yaml.FullLoader) return cls.config_dict @classmethod diff --git a/tools/send_email.py b/tools/send_email.py index e42d361..66787bf 100644 --- a/tools/send_email.py +++ b/tools/send_email.py @@ -30,7 +30,10 @@ class EmailServe: fpath = path.replace(file_path, '') for filename in filenames: - zip.write(os.path.join(path, filename), os.path.join(fpath, filename)) + zip.write( + os.path.join( + path, filename), os.path.join( + fpath, filename)) zip.close() @staticmethod @@ -47,10 +50,19 @@ class EmailServe: :param file_path: 需要压缩的文件夹 :return: """ - EmailServe.zip_report(file_path=file_path, out_path=setting['enclosures']) - yag = yagmail.SMTP(setting['user'], setting['password'], setting['host']) + EmailServe.zip_report( + file_path=file_path, + out_path=setting['enclosures']) + yag = yagmail.SMTP( + setting['user'], + setting['password'], + setting['host']) # 发送邮件 - yag.send(setting['addressees'], setting['title'], setting['contents'], setting['enclosures']) + yag.send( + setting['addressees'], + setting['title'], + setting['contents'], + setting['enclosures']) # 关闭服务 yag.close() logger.info("邮件发送成功!")