diff --git a/common/basePage.py b/common/basePage.py index c4fa1afa2cb41e186dc356a56c9468ff251e9fe4..bd099f9ec9214b038ea24de6cc572afa1812e532 100644 --- a/common/basePage.py +++ b/common/basePage.py @@ -11,7 +11,7 @@ from requests_toolbelt import MultipartEncoder from util.tools.log import Log from util.tools.randomData import replace_random from config.confManage import host_manage -from util.tools.caches import Cache, valueHandle +from util.tools.caches import Cache, valuehandle Log() @@ -89,7 +89,7 @@ class apiSend(object): except json.decoder.JSONDecodeError: pass if not isinstance(data_random, dict): - data_random = valueHandle(str(data_random)) + data_random = valuehandle(str(data_random)) multipart = MultipartEncoder( fields=data_random, boundary='-----------------------------' + str(random.randint(int(1e28), int(1e29 - 1))) diff --git a/pytest.ini b/pytest.ini index de6a7d8554159ebff9e54b55b8c869c46105ff6a..4d3018113d69ceb76aede191b1ecb63c0a692bab 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,5 @@ [pytest] log_cli = 1 -log_cli_level = INFO +log_cli_level = DEBUG log_cli_format = "%(levelname)-8s%(asctime)s %(name)s:%(filename)s:%(lineno)d %(message)s" log_cli_date_format=%Y-%m-%d %H:%M:%S \ No newline at end of file diff --git a/test_suite/testcase/demo/__init__.py b/test_suite/testcase/demo/__init__.py index fa4d31e12f3a56ded66e89287e73fa58c9fa4086..88a790e71bb250351c533e82cadf8882c547a466 100644 --- a/test_suite/testcase/demo/__init__.py +++ b/test_suite/testcase/demo/__init__.py @@ -7,12 +7,12 @@ import pytest from common.checkResult import asserting from util.tools.log import Log -from util.tools.readYamlFile import ini_allyaml, readRedisData +from util.tools.readYamlFile import ini_allyaml, readredisdata from common.basePage import apisend from util.tools.iniRequests import relevance from util.tools.iniHeaders import iniheaders -from util.tools.requestsTearDown import caseTearDown -from util.tools.readYamlFile import readRedisData +from util.tools.requestsTearDown import caseteardown +from util.tools.readYamlFile import readredisdata from util.tools.encryption import Encryption Log() @@ -24,9 +24,9 @@ __all__ = [ 'ini_allyaml', 'allure', 'apisend', - 'readRedisData', + 'readredisdata', 'relevance', 'iniheaders', - 'caseTearDown', + 'caseteardown', 'Encryption', ] diff --git a/test_suite/testcase/demo/conftest.py b/test_suite/testcase/demo/conftest.py index eb8ab6e39fcf686113b08d68c4fff89111b68bd1..eed1994f325ac53082347ee76b7749fb158ac571 100644 --- a/test_suite/testcase/demo/conftest.py +++ b/test_suite/testcase/demo/conftest.py @@ -3,11 +3,11 @@ from test_suite.testcase.demo import * @pytest.fixture(scope="session") -def setup_Login(): +def setup_login(): logging.info("前置请求登录") - paramData = readRedisData("login")["case"] - logging.info("{}".format(paramData[0]["info"])) - apisend(host=paramData[0]["host"],http=paramData[0]["http"], address=paramData[0]["address"], - method=paramData[0]["method"], - headers=paramData[0]["headers"], - data=paramData[0]["data"], caches=paramData[0]["cache"]) + param_data = readredisdata("login")["case"] + logging.info("{}".format(param_data[0]["info"])) + apisend(host=param_data[0]["host"],http=param_data[0]["http"], address=param_data[0]["address"], + method=param_data[0]["method"], + headers=param_data[0]["headers"], + data=param_data[0]["data"], caches=param_data[0]["cache"]) diff --git a/test_suite/testcase/demo/test_biaodan.py b/test_suite/testcase/demo/test_biaodan.py index 6c9ce31caaa41f102624eae20bfae83188779077..e8f774db3e29234d0d46a815ca10c222cb33e5fc 100644 --- a/test_suite/testcase/demo/test_biaodan.py +++ b/test_suite/testcase/demo/test_biaodan.py @@ -8,17 +8,17 @@ from test_suite.testcase.demo import * -class Test_biaodan(object): +class Testbiaodan(object): @allure.story("Test_biaodan") - @pytest.mark.parametrize('casedata', readRedisData("shoucang")["case"], - ids=[i["info"] for i in readRedisData("shoucang")["case"]]) + @pytest.mark.parametrize('casedata', readredisdata("shoucang")["case"], + ids=[i["info"] for i in readredisdata("shoucang")["case"]]) @pytest.mark.flaky(reruns=1, reruns_delay=1) - def test_shoucang(self, casedata, setup_Login): + def test_shoucang(self, casedata, setup_login): casedata["headers"] = iniheaders(casedata["headers"]) casedata["headers"]["Cookies"] = "$caches(cookie)$" - casedata = relevance(casedata, setup_Login) + casedata = relevance(casedata, setup_login) res, restime, code = apisend(http=casedata["http"],host=casedata["host"], address=casedata["address"], method=casedata["method"], headers=casedata["headers"], data=casedata["data"], caches=casedata["cache"]) - caseTearDown(casedata, res, setup_Login) + caseteardown(casedata, res, setup_login) asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code) diff --git a/test_suite/testcase/demo/test_login.py b/test_suite/testcase/demo/test_login.py index bd6604dd0b467a99eeb6e2c51830dd4cc23f2543..51d6e876fa6c80824096c5f5d157cd56b89f0219 100644 --- a/test_suite/testcase/demo/test_login.py +++ b/test_suite/testcase/demo/test_login.py @@ -8,10 +8,10 @@ from test_suite.testcase.demo import * -class Test_login(object): +class Testlogin(object): @allure.story("Test_login") - @pytest.mark.parametrize('casedata', readRedisData("login")["case"], - ids=[i["info"] for i in readRedisData("login")["case"]]) + @pytest.mark.parametrize('casedata', readredisdata("login")["case"], + ids=[i["info"] for i in readredisdata("login")["case"]]) @pytest.mark.flaky(reruns=1, reruns_delay=1) # @Encryption() def test_login(self, casedata): @@ -20,5 +20,5 @@ class Test_login(object): headers=casedata["headers"], data=casedata["data"], caches=casedata["cache"]) - caseTearDown(casedata, res) + caseteardown(casedata, res) asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code) diff --git a/util/scripts/newProject.py b/util/scripts/newProject.py index b85ee15090ee1ffd9560a2862680cea66cb35bd3..9cf1beded491d465d39fdeaab153f90fd448dfe9 100644 --- a/util/scripts/newProject.py +++ b/util/scripts/newProject.py @@ -18,7 +18,7 @@ casepath = pro_path + dir_manage('${case_dir}$') + "/" + testname datapath = pro_path + dir_manage('${data_dir}$') + "/" + testname -def newProject(): +def newproject(): mk_dir(casepath) mk_dir(datapath) if "__init__.py" not in os.listdir(casepath): @@ -63,4 +63,4 @@ from test_suite.testcase.{testname} import *""") if __name__ == '__main__': - newProject() + newproject() diff --git a/util/scripts/recording.py b/util/scripts/recording.py index 46212506beb6218afd1f5c02ace9ff22def52d7e..40d1242943ae4dee390486696d359917efda7707 100644 --- a/util/scripts/recording.py +++ b/util/scripts/recording.py @@ -21,6 +21,7 @@ Host = host_manage(f"${{{hostname}}}$") class Counter: + def __init__(self, host): self.re = {} self.num = 0 @@ -28,7 +29,8 @@ class Counter: self.host = host def response(self, flow: HTTPFlow): - mk_dir(self.path + dir_manage("${test_suite}$") + dir_manage("${recording_dir}$")) + mk_dir(self.path + dir_manage("${test_suite}$") + + dir_manage("${recording_dir}$")) case = dict() case["data"] = data = {} if flow.request.host == self.host.split(":")[0]: @@ -53,11 +55,13 @@ class Counter: self.re = {} # self.num = self.num + 1 # url根据?截断 - name = url_param_list[0].replace("/", "_")[1:] + flow.request.method + name = url_param_list[0].replace("/", + "_")[1:] + flow.request.method self.re[name] = detail = {} - detail["name"] = name # 请求名称 - detail["token"] = "Authorization" # 请求鉴权 默认Authorization 可以根据需要修改 + detail["name"] = name # 请求名称 + detail[ + "token"] = "Authorization" # 请求鉴权 默认Authorization 可以根据需要修改 # detail["order"] = self.num detail["case"] = [case] detail["file"] = False @@ -66,7 +70,7 @@ class Counter: # case 数据 case["info"] = name case["host"] = "host" # 可参数化 - case["address"] = url_param_list[0] # path + case["address"] = url_param_list[0] # path case["relevance"] = None case["teardown"] = None case["cache"] = None @@ -88,15 +92,15 @@ class Counter: data["param"] = None data["urlparam"] = None - path = self.path + dir_manage("${test_suite}$") + dir_manage("${recording_dir}$") + "/" + case[ - "address"] + path = self.path + dir_manage("${test_suite}$") + dir_manage( + "${recording_dir}$") + "/" + case["address"] # 根据path创建yaml if "form-data" not in str(flow.request.content): - self.yaml_cases(path, path + detail[ - "name"] + ".yml", self.re) + self.yaml_cases(path, path + detail["name"] + ".yml", + self.re) print(self.re) - #控制台打印 + # 控制台打印 @staticmethod def yaml_cases(casepath, filename, data): @@ -114,14 +118,13 @@ class Counter: yaml.dump(data, f) # f.write() # yaml.dump(data, f, Dumper=yaml.RoundTripDumper, allow_unicode=True) + # def response(self, flow: HTTPFlow): # if flow.request.host == "dashboard.finsiot.com": # print(flow.response.json()) -addons = [ - Counter(Host) -] +addons = [Counter(Host)] if __name__ == '__main__': # os.system("mitmdump -p 4444") diff --git a/util/scripts/writeCase.py b/util/scripts/writeCase.py index 0318b2d207f0e81dbf3af3d6295bb7d9c6a4286d..7e95a88cc61a3caa0d5f639f3726edd89f1c3356 100644 --- a/util/scripts/writeCase.py +++ b/util/scripts/writeCase.py @@ -4,7 +4,7 @@ import os from config.confManage import dir_manage from util.tools.readYamlFile import ini_yaml from util.tools import root_path -from util.tools.getFileNames import getFilePathList +from util.tools.getFileNames import getfilepathlist import time @@ -12,7 +12,7 @@ def write_case(): testname = dir_manage('${test_name}$') casepath = root_path + dir_manage('${test_suite}$') + dir_manage('${case_dir}$') + "/" + testname datapath = root_path + dir_manage('${test_suite}$') + dir_manage('${data_dir}$') + "/" + testname - filepathlist = getFilePathList(datapath, ".yml") + filepathlist = getfilepathlist(datapath, ".yml") for filepath in filepathlist: file = str(filepath.split(datapath)[-1]) # 处理出文件名及路径 @@ -36,7 +36,7 @@ def write_case(): from test_suite.testcase.{testname} import * -class Test_{filename}(object):""") +class Test{filename}(object):""") for item in filedata: f.write(f""" diff --git a/util/tools/caches.py b/util/tools/caches.py index 3a61f9e8b17a3119795a9dc169900a0173cce78e..4620ceeb629334d7f16fe8d74174b0d32da98fc9 100644 --- a/util/tools/caches.py +++ b/util/tools/caches.py @@ -11,7 +11,7 @@ import shutil import jsonpath -from util.tools.datasTypeChange import valueHandle, strHandleCookies +from util.tools.datasTypeChange import valuehandle, strhandlecookies from util.tools.mkDir import mk_dir from util.tools import root_path @@ -118,7 +118,7 @@ class Cache(object): raise ValueError("path错误") self.set(key=data["name"], value=values[0]) else: - values = jsonpath.jsonpath(valueHandle(param), data['path']) + values = jsonpath.jsonpath(valuehandle(param), data['path']) if not values: raise ValueError("path错误") self.set(key=data["name"], value=values[0]) @@ -134,7 +134,7 @@ class Cache(object): # values = jsonpath.jsonpath(param, data['path']) # if not values: # raise ValueError("path错误") - cookie = strHandleCookies(cookie) + cookie = strhandlecookies(cookie) self.set(key=data["name"], value=cookie) # else: # values = jsonpath.jsonpath(valueHandle(param), data['path']) diff --git a/util/tools/cleanFile.py b/util/tools/cleanFile.py index c13240c2207ac6f23937d2db72734b4c9c66fb6f..35e2ff636a8bc4670d86cc46b76454357228e41c 100644 --- a/util/tools/cleanFile.py +++ b/util/tools/cleanFile.py @@ -3,7 +3,7 @@ import os import shutil -def setDir(filepath): +def setdir(filepath): """ 如果文件夹不存在就创建,如果文件存在就清空! :param filepath:需要创建的文件夹路径 diff --git a/util/tools/dataBase.py b/util/tools/dataBase.py index cb305e695e15b82032a21fd209faecc7abe02ad5..6f4bb612bdf2b3722909d8ba40fc3ca08806ce60 100644 --- a/util/tools/dataBase.py +++ b/util/tools/dataBase.py @@ -2,25 +2,25 @@ import warnings -warnings.simplefilter('ignore', DeprecationWarning) +import time import pymysql from util.tools.log import Log import logging from config.confManage import db_manage -import time +warnings.simplefilter('ignore', DeprecationWarning) Log() class MYSQL(object): - def __init__(self,dbname): - self.host = db_manage("${host}$",dbname) - self.user = db_manage("${user}$",dbname) - self.password = db_manage("${password}$",dbname) - self.database = db_manage("${database}$",dbname) - self.charset = db_manage("${charset}$",dbname) - self.port = int(db_manage("${port}$",dbname)) + def __init__(self, dbname): + self.host = db_manage("${host}$", dbname) + self.user = db_manage("${user}$", dbname) + self.password = db_manage("${password}$", dbname) + self.database = db_manage("${database}$", dbname) + self.charset = db_manage("${charset}$", dbname) + self.port = int(db_manage("${port}$", dbname)) try: logging.debug("正在连接数据库.") self.conn = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.database, diff --git a/util/tools/datasTypeChange.py b/util/tools/datasTypeChange.py index 403657f4eceeccbeb9db51137a52a728f4baad11..85c071fca4c28f50db66ba51b159d740062a7d45 100644 --- a/util/tools/datasTypeChange.py +++ b/util/tools/datasTypeChange.py @@ -7,7 +7,7 @@ """ -def valueHandle(data: str): +def valuehandle(data: str): """ url格式字符串转化成字典 url的param参数转化为字典 @@ -21,7 +21,7 @@ def valueHandle(data: str): return param_dict -def strHandleCookies(data: dict): +def strhandlecookies(data: dict): """ 字典转化成字符串 :param data: @@ -33,7 +33,7 @@ def strHandleCookies(data: dict): return cookies_str -def strHandleUrl(data: dict): +def strhandleurl(data: dict): """ 字典转化成字符串 :param data: @@ -44,9 +44,10 @@ def strHandleUrl(data: dict): url_str = url_str + (k + "=" + str(v) + "&") return url_str.strip("&") + if __name__ == '__main__': d = { - "a":1, - "b":2 + "a": 1, + "b": 2 } - print(strHandleUrl(d)) \ No newline at end of file + print(strhandleurl(d)) diff --git a/util/tools/encryption.py b/util/tools/encryption.py index 7f70083e2e40e43022e7e3659337f194c4fdcf98..3fd0f7632ec5700ce814b350d8b3b495a2c2419d 100644 --- a/util/tools/encryption.py +++ b/util/tools/encryption.py @@ -40,11 +40,11 @@ class Encryption(object): if "sign" in self.data["param"]: # 弹出sign self.data["param"].pop('sign') - dataList = [] + data_list = [] for key in sorted(self.data["param"]): if self.data["param"][key]: - dataList.append("%s=%s" % (key, self.data["param"][key])) - lastdata = "&".join(dataList) + data_list.append("%s=%s" % (key, self.data["param"][key])) + lastdata = "&".join(data_list) data = lastdata + "&key=" + self.api_key.strip() md = hashlib.md5() md.update(data.encode("utf-8")) @@ -60,10 +60,9 @@ if __name__ == '__main__': da = {"data": { "param": {'mch_id': "$RandomInt(1,2)$", 'nonce_str': 'eh0k52jvvvs51dbxr2pd', 'out_trade_no': 10002112123231, 'sign': '{{sign}}'}}} - - # da = {"data": {"param":"a=1&b=$RandomPosInt(1,333)$"}} + @Encryption() def mytest(casedata): print(casedata) diff --git a/util/tools/getFileNames.py b/util/tools/getFileNames.py index 7ce3ab1119b9eb4b5a369b51ca08c3277667a735..632a8f379cde6065f4c4eedb1d38ff09ebd6a235 100644 --- a/util/tools/getFileNames.py +++ b/util/tools/getFileNames.py @@ -8,7 +8,7 @@ import os -def getFilePathList(rootpath, filetype): +def getfilepathlist(rootpath, filetype): filepath = [] # 获取所有文件下的子文件名称 for root, dirs, files in os.walk(rootpath): @@ -23,5 +23,5 @@ def getFilePathList(rootpath, filetype): if __name__ == '__main__': - datalist = getFilePathList(r"D:\apitest\test_suite\datas\saasWeb", ".yml") + datalist = getfilepathlist(r"D:\apitest\test_suite\datas\saasWeb", ".yml") print(datalist) diff --git a/util/tools/iniHeaders.py b/util/tools/iniHeaders.py index aaadec2b565332668e6b4773e5dad654cad6c400..bfed415e070ece3c9e8512fe007cf61c4073716a 100644 --- a/util/tools/iniHeaders.py +++ b/util/tools/iniHeaders.py @@ -6,6 +6,7 @@ @time: 2022/5/11 10:56 """ + def iniheaders(headers): """ 处理请求头特殊情况 如果请求头为空 读取后并不是字典格式 所以需要处理 @@ -13,5 +14,5 @@ def iniheaders(headers): :return: """ if not headers: - headers={} + headers = {} return headers diff --git a/util/tools/iniRequests.py b/util/tools/iniRequests.py index 0c67ed69cfe4c5c25fb6525495f0520f9c48426e..c6347171878f2889836651f35eff643cbdd585f6 100644 --- a/util/tools/iniRequests.py +++ b/util/tools/iniRequests.py @@ -14,7 +14,7 @@ from util.tools.log import Log import jsonpath import allure -from util.tools.readYamlFile import readRedisData +from util.tools.readYamlFile import readredisdata Log() @@ -33,7 +33,7 @@ def relevance (relevancedata, headerdata=None): reldatalist = relevancedata["relevance"]["response"] for reldata in reldatalist: try: - case = readRedisData(reldata["relCaseName"]) + case = readredisdata(reldata["relCaseName"]) relcase = case["case"][reldata["relCaseNum"] - 1] # 获取被关联请求数据 # if p["relevance"]: diff --git a/util/tools/log.py b/util/tools/log.py index deb066a24260b532bebc6c0bff4f677e1c0fc55e..d95f711dc03d7b27dc31142209f4f1dd3a3d3c92 100644 --- a/util/tools/log.py +++ b/util/tools/log.py @@ -6,6 +6,9 @@ from util.tools.mkDir import mk_dir from config.confManage import dir_manage from util.tools import root_path +logging.getLogger("faker").setLevel(logging.ERROR) +logging.getLogger("urllib3").setLevel(logging.ERROR) + class Log(object): @@ -20,7 +23,7 @@ class Log(object): logfile_err = log_path + "{}-".format(now) + 'error.log' logfile_info = log_path + "{}".format(now) + "info.log" self.logger = logging.getLogger() - self.logger.setLevel(logging.INFO) + self.logger.setLevel(logging.DEBUG) self.logger.handlers = [] fh_inf = logging.FileHandler(logfile_info, mode='a+', encoding='utf-8') fh_inf.setLevel(logging.INFO) diff --git a/util/tools/randomData.py b/util/tools/randomData.py index 0df54094b6f0655a6883fe01b524bb1f5f6f140a..f573e0056f7e844b05ea3dcbccf54e7c9871a1f4 100644 --- a/util/tools/randomData.py +++ b/util/tools/randomData.py @@ -311,7 +311,7 @@ def replace_random(value, res=None, param=None): elif len(sqljson_list): for i in sqljson_list: - pattern = re.compile(r'\$json\(' + i.replace('$', "\$").replace('[', '\[') + r'\)\$') + pattern = re.compile(r'\$json\(' + i.replace('$', r"\$").replace('[', r'\[') + r'\)\$') key = str(sql_json(i, res)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) @@ -394,12 +394,19 @@ from alarm on device.region_id = region.id and region.enterprise_id = 88 ) as dr - on dr.qr_code = alarm.device_id and alarm.create_time >= '$GetTime(time_type=past,layout=%Y-%m-%d 00:00:00,unit=0,0,0,1,0)$' and alarm.create_time < '$GetTime(time_type=past,layout=%Y-%m-%d 00:00:00,unit=0,0,0,0,0)$' + on dr.qr_code = alarm.device_id + and alarm.create_time >= '$GetTime(time_type=past,layout=%Y-%m-%d 00:00:00,unit=0,0,0,1,0)$' + and alarm.create_time < '$GetTime(time_type=past,layout=%Y-%m-%d 00:00:00,unit=0,0,0,0,0)$' ) as ad """ # a = json.dumps(ini_yaml("homePageData.yml")["companyAlarm"]) # print(type(ini_yaml("家庭详情.yml")[0]["data"])) - t1 = "{'login': {'name': '登录', 'order': 1, 'token': False, 'file': False, 'case': [{'address': '/v1/oauth/login/password/', 'assert': {'jsonpath': None, 'sqlassert': None, 'time': 2, 'code': 200}, 'data': {'file': None, 'param': {'username': 'dl010', 'password': '$RandomInt(1,333)$'}, 'urlparam': None}, 'headers': {'Content-Type': 'application/json'}, 'host': 'HB', 'info': '代理账号登录', 'method': 'POST', 'cookie': True, 'cache': None, 'relevance': None}]}}" + t1 = "{'login': {'name': '登录', 'order': 1, 'token': False, 'file': False, 'case': [{'address': " \ + "'/v1/oauth/login/password/', 'assert': {'jsonpath': None, 'sqlassert': None, 'time': 2, 'code': 200}, " \ + "'data': {'file': None, 'param':" \ + "{'username': 'dl010', 'password': '$RandomInt(1,333)$'}, 'urlparam': None}, " \ + "'headers': {'Content-Type': 'application/json'}, 'host': 'HB', 'info': '代理账号登录', 'method': 'POST', " \ + "'cookie': True, 'cache': None, 'relevance': None}]}} " d1 = replace_random(t1) d2 = eval(d1) @@ -421,31 +428,24 @@ from alarm # print(replace_random(idc)) t = "$GetTime(time_type=past,layout=13timestampDAY,unit=0,0,0,1,4)$" l = ["哈哈"] - # print(re.findall(r"\$RandomPosInt\(([0-9]*,[0-9]*?)\)\$", l)) - # print(replace_random(choice_num)) - # print(replace_random(urls,param={"home_id":"$caches(haha)$"})) - # print(replace_random(ca)) - # pattern = re.compile(r'\$json\(' + '$.data.alarm[1].number'.replace('$',"\$").replace('[','\[') + r'\)\$') - # # key = str(sql_json(i)) - # key = "123" - # value = re.sub(pattern, "*", jsons, count=1) - # print(value) - # p = {'firmwareId': 187, 'firmwareId2': 187} - # d = {'info': '固件详情', 'host': 'host', 'address': '/v1/device/firmware/$url(firmwareId)$/', 'method': 'get', - # 'cache': None, - # 'relevance': [{'relCaseName': 'firmwareList', 'relCaseNum': 1, 'value': '$.data[0].id', 'name': 'firmwareId'}, - # {'relCaseName': 'firmwareList', 'relCaseNum': 1, 'value': '$.data[0].id', 'name': 'firmwareId2'}], - # 'headers': {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': None}, - # 'data': {'param': None, 'urlparam': {'firmwareId': '$caches(firmwareId)$'}}, 'assert': { - # 'jsonpath': [{'path': '$.msg', 'value': 'Success.', 'asserttype': '==', 'relevanceCheck': None}, - # {'path': '$.code', 'value': 0, 'asserttype': '==', 'relevanceCheck': None}], 'sqlassert': None, - # 'time': 2}} + # print(re.findall(r"\$RandomPosInt\(([0-9]*,[0-9]*?)\)\$", l)) print(replace_random(choice_num)) print( + # replace_random(urls,param={"home_id":"$caches(haha)$"})) print(replace_random(ca)) pattern = re.compile( + # r'\$json\(' + '$.data.alarm[1].number'.replace('$',"\$").replace('[','\[') + r'\)\$') # key = str(sql_json(i)) + # key = "123" value = re.sub(pattern, "*", jsons, count=1) print(value) p = {'firmwareId': 187, 'firmwareId2': + # 187} d = {'info': '固件详情', 'host': 'host', 'address': '/v1/device/firmware/$url(firmwareId)$/', 'method': 'get', + # 'cache': None, 'relevance': [{'relCaseName': 'firmwareList', 'relCaseNum': 1, 'value': '$.data[0].id', + # 'name': 'firmwareId'}, {'relCaseName': 'firmwareList', 'relCaseNum': 1, 'value': '$.data[0].id', + # 'name': 'firmwareId2'}], 'headers': {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': + # None}, 'data': {'param': None, 'urlparam': {'firmwareId': '$caches(firmwareId)$'}}, 'assert': { 'jsonpath': [{ + # 'path': '$.msg', 'value': 'Success.', 'asserttype': '==', 'relevanceCheck': None}, {'path': '$.code', + # 'value': 0, 'asserttype': '==', 'relevanceCheck': None}], 'sqlassert': None, 'time': 2}} # # a = replace_random(str(d),param=p) # print(a) time_num2 = '$GetTime(time_type=past,layout=%Y-%m-%d %H:%M:%S,unit=0,0,0,3,0)$' # 当前时间 2022-04-14 13:27:01 - da = {"data": {"param":{'mch_id': "$RandomInt(1,333)$", 'nonce_str': 'eh0k52jvvvs51dbxr2pd', 'out_trade_no': 10002112123231, - 'sign': '{{sign}}'}}} + da = {"data": { + "param": {'mch_id': "$RandomInt(1,333)$", 'nonce_str': 'eh0k52jvvvs51dbxr2pd', 'out_trade_no': 10002112123231, + 'sign': '{{sign}}'}}} da2 = '"$RandomInt(1,333)$"' # print(eval(replace_random(da))) - print(replace_random(time_num2)) + print(replace_random(js)) diff --git a/util/tools/readYamlFile.py b/util/tools/readYamlFile.py index 861e51349a563ad79a87cc54bf777d7df3ba0215..122ce72f1c26907f877f83170a3469eb6217fcb7 100644 --- a/util/tools/readYamlFile.py +++ b/util/tools/readYamlFile.py @@ -5,17 +5,18 @@ import yaml import threading import os import time +import logging from config.confManage import dir_manage from util.scripts import root_path -from util.tools.getFileNames import getFilePathList +from util.tools.getFileNames import getfilepathlist from util.tools.log import Log from util.tools.redisData import RedisHandler Log() -import logging + datapath = root_path + dir_manage("${test_suite}$") + dir_manage("${data_dir}$") + "/" + dir_manage("${test_name}$") -datalist = getFilePathList(datapath, ".yml") +datalist = getfilepathlist(datapath, ".yml") re = RedisHandler() @@ -42,18 +43,17 @@ def ini_allyaml(datalists): try: with open(file, 'r', encoding="utf-8") as f: file_data = yaml.safe_load(f.read()) - for k,v in file_data.items(): - file_data[k] = json.dumps(file_data[k],cls=ComplexEncoder) + for k, v in file_data.items(): + file_data[k] = json.dumps(file_data[k], cls=ComplexEncoder) re.set_many(file_data) except UnicodeDecodeError: with open(file, 'r') as f: file_data = yaml.safe_load(f.read()) - for k,v in file_data.items(): - file_data[k] = json.dumps(file_data[k],cls=ComplexEncoder) + for k, v in file_data.items(): + file_data[k] = json.dumps(file_data[k], cls=ComplexEncoder) re.set_many(file_data) - def threading_read(): """ 双线程读取参数数据 @@ -63,8 +63,8 @@ def threading_read(): n1 = int(len(datalist) / 2) # 获取文件列表数量 l1 = datalist[0:n1] - l2 = datalist[n1:n1*2] - l3 = datalist[n1*2:] + l2 = datalist[n1:n1 * 2] + l3 = datalist[n1 * 2:] thread1 = threading.Thread(target=ini_allyaml, kwargs={"datalists": l1}) thread2 = threading.Thread(target=ini_allyaml, kwargs={"datalists": l2}) thread3 = threading.Thread(target=ini_allyaml, kwargs={"datalists": l3}) @@ -74,7 +74,6 @@ def threading_read(): thread3.start() - def ini_yaml(filename, path=datapath): try: with open(path + "/" + filename, 'r', encoding="utf-8") as f: @@ -90,7 +89,7 @@ def ini_yaml(filename, path=datapath): return data -def readRedisData(name): +def readredisdata(name): rd = RedisHandler() return json.loads(rd.get_key(name)) diff --git a/util/tools/requestsTearDown.py b/util/tools/requestsTearDown.py index 449b02c1d3629c6231020e5ba767499ce6604dbd..ed2f090f62a6397f6112a08dfaa97d7780e74eee 100644 --- a/util/tools/requestsTearDown.py +++ b/util/tools/requestsTearDown.py @@ -10,24 +10,23 @@ import logging from common.basePage import apisend from common.checkResult import asserting from util.tools.iniHeaders import iniheaders -from util.tools.datasTypeChange import strHandleUrl, valueHandle +from util.tools.datasTypeChange import strhandleurl, valuehandle from util.tools.log import Log import jsonpath import allure -from util.tools.readYamlFile import readRedisData +from util.tools.readYamlFile import readredisdata Log() -def caseTearDown(casedata, caseres, headerdata=None): +def caseteardown(casedata, caseres, headerdata=None): """ 使用场景: 新增数据A之后一系列用例执行完需要后置来还原数据形成业务闭环. datatype 有3种类型 param json 和urlparam dataname为后置关联的参数中参数名称 path为当前请求返回结果的jsonpath 根据path的值更换后置处理参数值 如果不需要后置处理 teardown 置空即可 - :param keyname: redis keyname :param casedata: 测试数据 :param caseres: 当前用例返回结果 :param headerdata: 请求头数据 @@ -36,7 +35,7 @@ def caseTearDown(casedata, caseres, headerdata=None): teardowndata = casedata["teardown"] if teardowndata: for req in teardowndata: - case = readRedisData(req["tdName"]) + case = readredisdata(req["tdName"]) tdcase = case["case"][req["tdNum"] - 1] try: with allure.step("执行后置接口"): @@ -49,13 +48,13 @@ def caseTearDown(casedata, caseres, headerdata=None): value = jsonpath.jsonpath(caseres, tddata["path"])[0] if tddata["datatype"] == "param": # 后置参数为param类型时 - middata = valueHandle(tdcase["data"]["param"]) + middata = valuehandle(tdcase["data"]["param"]) # 为了方便处理 转化为字典 然后更换值之后再转化为param字符串 middata[tddata['dataname']] = value - tdcase["data"]["param"] = strHandleUrl(middata) + tdcase["data"]["param"] = strhandleurl(middata) elif tddata["datatype"] == "json": # 后置参数为json类型时 - if not isinstance(tdcase["data"]["param"],dict): + if not isinstance(tdcase["data"]["param"], dict): raise TypeError("['data']['param']格式错误") tdcase["data"]["param"][tddata['dataname']] = value elif tddata["datatype"] == "urlparam": @@ -64,10 +63,10 @@ def caseTearDown(casedata, caseres, headerdata=None): tddata['dataname']: value } # 执行后置请求 - res,code,restime = apisend(http=tdcase["http"],address=tdcase["address"], - method=tdcase["method"], headers=tdcase["headers"], - data=tdcase["data"], - caches=tdcase["cache"], host=tdcase["host"]) + res, code, restime = apisend(http=tdcase["http"], address=tdcase["address"], + method=tdcase["method"], headers=tdcase["headers"], + data=tdcase["data"], + caches=tdcase["cache"], host=tdcase["host"]) asserting(hope_res=tdcase["assert"], real_res=res, re_time=restime, re_code=code) logging.info(f"成功执行后置接口:{tdcase['info']}") diff --git a/util/tools/sendEmail.py b/util/tools/sendEmail.py index d790298edcad5074cacc5c91e5252fb6a4860c99..2585b78a5ef0111be404b8d06d3e240f9b0c4756 100644 --- a/util/tools/sendEmail.py +++ b/util/tools/sendEmail.py @@ -30,13 +30,13 @@ def send_email(title, url): message['Subject'] = Header(title, 'utf-8') try: logging.debug("初始化邮件服务..") - smtpObj = smtplib.SMTP() - smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 - smtpObj.login(mail_user, mail_pass) + smtp_obj = smtplib.SMTP() + smtp_obj.connect(mail_host, 25) # 25 为 SMTP 端口号 + smtp_obj.login(mail_user, mail_pass) logging.debug("发送邮件中..") - smtpObj.sendmail(sender, receivers, message.as_string()) + smtp_obj.sendmail(sender, receivers, message.as_string()) logging.debug("邮件发送成功") - except: + except Exception: raise