From e5a7628bafe52bf36a269b1dc2c811bda5740b07 Mon Sep 17 00:00:00 2001 From: jing song <529548204@qq.com> Date: Mon, 30 May 2022 09:49:43 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20YAML=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8Fdatetime=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8E=20json=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- util/tools/encryption.py | 18 ++++++++++-- util/tools/randomData.py | 51 ++++++++++++++++++++++++++++------ util/tools/readYamlFile.py | 21 ++++++++++++-- util/tools/requestsTearDown.py | 4 ++- 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index a9068f5..8e7d9e5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ QQ 529548204 如果有问题请联系我 大家共同学习共同进步~ # 更新日志 - +2022年5月30日 更新 YAML读取时间格式datetime数据后 json处理方式 2022年5月20日 更新增加jenkins持续集成说明配置方法等 2022年5月17日 更新增加xml参数处理,增加自定义加密方式(加密规则需要自己写 需要一定编码能力) diff --git a/util/tools/encryption.py b/util/tools/encryption.py index 3ba568a..7f70083 100644 --- a/util/tools/encryption.py +++ b/util/tools/encryption.py @@ -10,6 +10,7 @@ import hashlib from functools import wraps from config.confManage import encryption_manage +from util.tools.randomData import replace_random class Encryption(object): @@ -22,8 +23,10 @@ class Encryption(object): @wraps(func) def wrapped_function(*args, **kwargs): # 处理pytest数据驱动的加密数据 - self.data = kwargs["casedata"]["data"] + + self.data = eval(replace_random(kwargs["casedata"]["data"])) kwargs["casedata"]["data"]["param"] = self.custom_encryption() + # kwargs["casedata"]["data"]["param"] = self.data["param"] return func(*args, **kwargs) return wrapped_function @@ -54,8 +57,19 @@ class Encryption(object): if __name__ == '__main__': api_keys = "8ViypSUsKSbK26g7HDsKtZSCTUsTtEvB" - da = {'mch_id': 160467, 'nonce_str': 'eh0k52jvvvs51dbxr2pd', 'out_trade_no': 10002112123231, 'sign': '{{sign}}'} + 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) + + mytest(casedata=da) # s = logit(api_keys,da) # s.send_post() diff --git a/util/tools/randomData.py b/util/tools/randomData.py index aad369d..e4cc0d9 100644 --- a/util/tools/randomData.py +++ b/util/tools/randomData.py @@ -231,9 +231,11 @@ def replace_random(value, res=None, param=None): if not isinstance(value, str): value = str(value) posint_list = re.findall(r"\$RandomPosInt\(([0-9]*,[0-9]*?)\)\$", value) - int_list = re.findall(r'\"\$RandomInt\(([0-9]*,[0-9]*?)\)\$\"', value) + int_list_json = re.findall(r'\"\$RandomInt\(([0-9]*,[0-9]*?)\)\$\"', value) + int_list_dict = re.findall(r'\'\$RandomInt\(([0-9]*,[0-9]*?)\)\$\'', value) string_list = re.findall(r'\$RandomString\(([0-9]*?)\)\$', value) - float_list = re.findall(r'\"\$RandomFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$\"', value) + float_list_json = re.findall(r'\"\$RandomFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$\"', value) + float_list_dict = re.findall(r'\'\$RandomFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$\'', value) posfloat_list = re.findall(r'\$RandomPosFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$', value) time_list = re.findall(r"\$GetTime\(time_type=(.*?),layout=(.*?),unit=([0-9],[0-9],[0-9],[0-9],[0-9])\)\$", value) choice_list = re.findall(r"\$Choice\((.*?)\)\$", value) @@ -243,14 +245,22 @@ def replace_random(value, res=None, param=None): faker_list = re.findall(r"\$faker\((.*?)\)\$", value) relevance_list = re.findall(r"\$relevance\((.*?)\)\$", value) - if len(int_list): + if len(int_list_json): # 获取整型数据替换 结果是int - for i in int_list: + for i in int_list_json: pattern = re.compile(r'\"\$RandomInt\(' + i + r'\)\$\"') key = str(random_int(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) + elif len(int_list_dict): + # 获取整型数据替换 结果是int + for i in int_list_dict: + pattern = re.compile(r'\'\$RandomInt\(' + i + r'\)\$\'') + key = str(random_int(i)) + value = re.sub(pattern, key, value, count=1) + value = replace_random(value, res, param) + elif len(posint_list): # 获取整型数据替换 结果是字符串 for i in posint_list: @@ -258,6 +268,7 @@ def replace_random(value, res=None, param=None): key = str(random_int(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) + elif len(string_list): # 获取字符串数据替换 for i in string_list: @@ -266,14 +277,30 @@ def replace_random(value, res=None, param=None): value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(float_list): + elif len(float_list_json): # 获取浮点数数据替换 返回浮点 - for i in float_list: + for i in float_list_json: pattern = re.compile(r'\"\$RandomFloat\(' + i + r'\)\$\"') key = str(random_float(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) + elif len(float_list_json): + # 获取浮点数数据替换 返回浮点 + for i in float_list_json: + pattern = re.compile(r'\"\$RandomFloat\(' + i + r'\)\$\"') + key = str(random_float(i)) + value = re.sub(pattern, key, value, count=1) + value = replace_random(value, res, param) + + elif len(float_list_dict): + # 获取浮点数数据替换 返回浮点 + for i in float_list_dict: + pattern = re.compile(r'\'\$RandomFloat\(' + i + r'\)\$\'') + key = str(random_float(i)) + value = re.sub(pattern, key, value, count=1) + value = replace_random(value, res, param) + elif len(posfloat_list): # 获取浮点数数据替换 返回str for i in posfloat_list: @@ -281,6 +308,7 @@ def replace_random(value, res=None, param=None): key = str(random_float(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) + elif len(time_list): # 获取时间替换 for i in time_list: @@ -308,7 +336,6 @@ def replace_random(value, res=None, param=None): value = replace_random(value, res, param) elif len(urlparam_list): - # urls = "$url(home_id)$" # replace_random(urls,param={"home_id":"$caches(haha)$"}) for i in urlparam_list: @@ -318,7 +345,6 @@ def replace_random(value, res=None, param=None): value = replace_random(value, res, param=param) elif len(relevance_list): - # urls = "$url(home_id)$" # replace_random(urls,param={"home_id":"$caches(haha)$"}) for i in relevance_list: @@ -435,4 +461,11 @@ from alarm # 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 - print(replace_random(time_num2)) + da = {"data": { + "param": {'mch_id': "$RandomFloat(1,333,2)$", 'nonce_str': 'eh0k52jvvvs51dbxr2pd', 'out_trade_no': 10002112123231, + 'sign': '{{sign}}'}}} + da2 = '"$RandomInt(1,333)$"' + r = eval(replace_random(da)) + print(r) + print(type(r["data"]["param"]["mch_id"])) + diff --git a/util/tools/readYamlFile.py b/util/tools/readYamlFile.py index 589a102..861e513 100644 --- a/util/tools/readYamlFile.py +++ b/util/tools/readYamlFile.py @@ -1,4 +1,5 @@ # coding:utf-8 +import datetime import json import yaml import threading @@ -17,6 +18,18 @@ datapath = root_path + dir_manage("${test_suite}$") + dir_manage("${data_dir}$") datalist = getFilePathList(datapath, ".yml") re = RedisHandler() + +class ComplexEncoder(json.JSONEncoder): + # 重写json类 处理时间格式 + def default(self, obj): + if isinstance(obj, datetime.datetime): + return obj.strftime('%Y-%m-%d %H:%M:%S') + elif isinstance(obj, datetime.date): + return obj.strftime('%Y-%m-%d') + else: + return json.JSONEncoder.default(self, obj) + + def ini_allyaml(datalists): """ 获取全部yaml数据 @@ -30,13 +43,13 @@ def ini_allyaml(datalists): 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]) + 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]) + file_data[k] = json.dumps(file_data[k],cls=ComplexEncoder) re.set_many(file_data) @@ -88,7 +101,9 @@ if __name__ == '__main__': # t1 = time.time() # ini_allyaml(datalist) threading_read() - + # s = ini_yaml("biaodan.yml") + # print(s) + # print(type(json.dumps(s,cls=ComplexEncoder))) # t2 = time.time() - t1 # print(f"文件读取时间为{t2}") diff --git a/util/tools/requestsTearDown.py b/util/tools/requestsTearDown.py index 5efe8e1..58ae7a4 100644 --- a/util/tools/requestsTearDown.py +++ b/util/tools/requestsTearDown.py @@ -8,6 +8,7 @@ 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.log import Log @@ -63,10 +64,11 @@ def caseTearDown(casedata, caseres, headerdata=None): tddata['dataname']: value } # 执行后置请求 - apisend(address=tdcase["address"], + res,code,restime = apisend(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']}") except Exception as e: -- Gitee From 82adedf50dd4f88f056a17ce7af9271a8f6fc036 Mon Sep 17 00:00:00 2001 From: jing song <529548204@qq.com> Date: Tue, 7 Jun 2022 17:59:09 +0800 Subject: [PATCH 2/3] =?UTF-8?q?readme=E5=A2=9E=E5=8A=A0=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++--- common/basePage.py | 92 ++++++++++++++---------- config/config.ini | 2 - test_suite/datas/demo/biaodan.yml | 4 +- test_suite/datas/demo/login.yml | 2 + test_suite/testcase/demo/test_biaodan.py | 2 +- test_suite/testcase/demo/test_login.py | 4 +- util/scripts/writeCase.py | 18 +++-- util/tools/iniRequests.py | 2 +- util/tools/randomData.py | 41 +++-------- util/tools/requestsTearDown.py | 2 +- 11 files changed, 106 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index 8e7d9e5..946b034 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ QQ 529548204 如果有问题请联系我 大家共同学习共同进步~ # 更新日志 +2022年6月7日 更新 取消config中http类型 改为yaml数据内 2022年5月30日 更新 YAML读取时间格式datetime数据后 json处理方式 2022年5月20日 更新增加jenkins持续集成说明配置方法等 2022年5月17日 更新增加xml参数处理,增加自定义加密方式(加密规则需要自己写 需要一定编码能力) @@ -116,14 +117,24 @@ QQ 529548204 ```yaml relevance: response: - - relCaseName: tradeAdd # 其他testcase的ID - relCaseNum: 1 # 关联的case数组里 第几条数据 - value: $.id # 当前返回结果的jsonpath - name: tradeId # 关联值名称 - - relCaseName: tradeAdd2 # 其他testcase的ID - relCaseNum: 2 # 关联的case数组里 第几条数据 - value: $.id # 当前返回结果的jsonpath - name: tradeId2 # 关联值名称 + - relCaseName: shangchuan # 其他testcase的ID + relCaseNum: 1 # 关联的case数组里 第几条数据 + reldata: + - value: $.data.fileName # 当前返回结果的jsonpath + name: fileName # 关联值名称 + - value: $.data.policy # 当前返回结果的jsonpath + name: policy # 关联值名称 + - value: $.data.signature # 当前返回结果的jsonpath + name: signature # 关联值名称 + - relCaseName: tradeAdd2 # 其他testcase的ID + relCaseNum: 2 # 关联的case数组里 第几条数据 + reldata: + - value: $.data.fileName # 当前返回结果的jsonpath + name: fileName # 关联值名称 + - value: $.data.policy # 当前返回结果的jsonpath + name: policy # 关联值名称 + - value: $.data.signature # 当前返回结果的jsonpath + name: signature # 关联值名称 ``` ### 1.3 参数介绍 `file` : 通过case外关键字file判断是否需要上传文件 如果需要则格式为:`{上传文件的参数名:文件路径}` @@ -271,6 +282,7 @@ login: # caseID **请务必唯一** file: true # bool值 true为需要文件的接口 case: - info: "用户名登录-成功" # 用例信息 + http: https # http host: 'host' # config.ini里面 请求host的key address: '/v1/apps/$url(region_id)$/' # $url(region_id)$ 正则匹配参数中的路径参数 method: 'post' @@ -392,7 +404,6 @@ case_dir = /testcase cache_dir = /caches test_name = 测试项目名称: saasWeb [host] -http_type = http host = [email] ;服务器 diff --git a/common/basePage.py b/common/basePage.py index 1a63e19..c4fa1af 100644 --- a/common/basePage.py +++ b/common/basePage.py @@ -19,7 +19,7 @@ Log() class apiSend(object): def __init__(self): - self.http_type = host_manage(hos="${http_type}$") + # self.http_type = host_manage(hos="${http_type}$") self.rel = Cache() @staticmethod @@ -31,9 +31,10 @@ class apiSend(object): dataran = replace_random(data) return dataran - def post(self, address, header, caches, timeout=8, data=None, files=None, host="host"): + def post(self, http, address, header, caches, timeout=8, data=None, files=None, host="host"): """ post请求 + :param http: :param host: :param caches: 关联情况 - cachefrom: 'body' # response : 从结果中获取 body : 从参数中获取 @@ -53,7 +54,7 @@ class apiSend(object): """ iniaddress = replace_random(address, param=data["urlparam"]) - url = str(self.http_type) + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress + url = http + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress data_random = self.iniDatas(data["param"]) logging.info("请求地址:%s" % "" + url) logging.info("请求方法:POST") @@ -71,7 +72,7 @@ class apiSend(object): if isinstance(value, int): files[fileskey] = str(value) pass - elif '/' in value or "\\" in value: + elif "\\" in value: file_parm = fileskey files[file_parm] = (os.path.basename(value), open(value, 'rb'), 'application/octet-stream') else: @@ -124,9 +125,10 @@ class apiSend(object): logging.error(response.text) raise - def get(self, address, caches, header, data, timeout=8, host="host"): + def get(self, http, address, caches, header, data, timeout=8, host="host"): """ get请求 + :param http: :param host: :param caches: 关联情况 - cachefrom: 'body' # response : 从结果中获取 body : 从参数中获取 @@ -143,7 +145,7 @@ class apiSend(object): # if "urlparam" in data.keys(): # address = replace_random(address, param=data["urlparam"]) data_random = self.iniDatas(data["param"]) - url = str(self.http_type) + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress + url = http + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress logging.info("请求地址:%s" % "" + url) logging.info("请求方法:GET") logging.info("请求头: %s" % str(header)) @@ -169,9 +171,10 @@ class apiSend(object): logging.error(response.text) raise - def put(self, address, caches, header, timeout=8, data=None, files=None, host="host"): + def put(self, http, address, caches, header, timeout=8, data=None, files=None, host="host"): """ put请求 + :param http: :param host: :param address: :param caches: 关联情况 @@ -186,7 +189,7 @@ class apiSend(object): :return: """ iniaddress = replace_random(address, param=data["urlparam"]) - url = str(self.http_type) + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress + url = http + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress logging.info("请求地址:%s" % "" + url) logging.info("请求方法:PUT") logging.info("请求头: %s" % str(header)) @@ -222,9 +225,10 @@ class apiSend(object): logging.error(response.text) raise - def delete(self, address, caches, header, data, timeout=8, host="host"): + def delete(self, http, address, caches, header, data, timeout=8, host="host"): """ get请求 + :param http: :param host: :param caches: 关联情况 - cachefrom: 'body' # response : 从结果中获取 body : 从参数中获取 @@ -238,7 +242,7 @@ class apiSend(object): """ iniaddress = replace_random(address, param=data["urlparam"]) data_random = self.iniDatas(data["param"]) - url = str(self.http_type) + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress + url = http + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress logging.info("请求地址:%s" % "" + url) logging.info("请求方法:DELETE") logging.info("请求头: %s" % str(header)) @@ -263,9 +267,21 @@ class apiSend(object): logging.error(response.text) raise - def patch(self, address, caches, header, timeout=8, data=None, files=None, host="host"): + def patch(self, http, address, caches, header, timeout=8, data=None, files=None, host="host"): + """ + + :param http: + :param address: + :param caches: + :param header: + :param timeout: + :param data: + :param files: + :param host: + :return: + """ iniaddress = replace_random(address, param=data["urlparam"]) - url = str(self.http_type) + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress + url = http + "://" + host_manage(hos='${{{}}}$'.format(host)) + iniaddress logging.info("请求地址:%s" % "" + url) logging.info("请求方法:PATHC") logging.info("请求头: %s" % str(header)) @@ -295,18 +311,18 @@ class apiSend(object): logging.error(response.text) raise - def __call__(self, address, method, headers, data, caches, **kwargs): + def __call__(self, http, address, method, headers, data, caches, **kwargs): try: if method == "post" or method == 'POST': - return self.post(address=address, data=data, header=headers, caches=caches, **kwargs) + return self.post(http=http, address=address, data=data, header=headers, caches=caches, **kwargs) elif method == "get" or method == 'GET': - return self.get(address=address, data=data, header=headers, caches=caches, **kwargs) + return self.get(http=http, address=address, data=data, header=headers, caches=caches, **kwargs) elif method == "delete" or method == 'DELETE': - return self.delete(address=address, data=data, header=headers, caches=caches, **kwargs) + return self.delete(http=http, address=address, data=data, header=headers, caches=caches, **kwargs) elif method == "put" or method == 'PUT': - return self.put(address=address, data=data, header=headers, caches=caches, **kwargs) + return self.put(http=http, address=address, data=data, header=headers, caches=caches, **kwargs) elif method == "patch" or method == 'PATCH': - return self.patch(address=address, data=data, header=headers, caches=caches, **kwargs) + return self.patch(http=http, address=address, data=data, header=headers, caches=caches, **kwargs) else: raise TypeError(f"请求异常,检查yml文件method") except Exception: @@ -314,23 +330,23 @@ class apiSend(object): apisend = apiSend() -if __name__ == '__main__': - # h = { - # "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjE2OTRmYjlmLTUzNjYtNGZjZS1hODg4LTBlY2UxOThmZThhZSJ9.5_mD4abE-5iHsSr6RB9R8qaIRV7zidUFkpytyyd2cjSiQcrdJvAE_6GjU9Q_Xsr0JmTkSCTiefpFySguyk2E8Q", - # "Content-Type": "multipart/form-data" - # - # } - # d = { - # "param": "updateSupport=0", - # "urlparam": None - # } - # p = {'address': '/v1/enter/trade/', 'assert': {'jsonpath': None, 'sqlassert': None, 'time': 2, 'code': 201}, - # 'data': {'param': {'name': '行业名称$RandomString($RandomPosInt(2,6)$)$', - # 'desc': '备注$RandomString($RandomPosInt(2,8)$)$'}, 'urlparam': None}, - # 'headers': {'Content-Type': 'application/json', - # 'Authorization': 'GREEN eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyMiwiZXhwIjoxNjUxODMzNjY4LCJ1c2VybmFtZSI6ImRsMDAxIn0.Dbk1ddEXdmW1tRzxZLvFgJwsh0hek6HJjzCabStdnz0'}, - # 'host': 'host_HB', 'info': '新建行业', 'method': 'POST', 'cache': None, 'relevance': None} - # ress = apisend(address=p['address'], data=p['data'], method=p['method'], headers=p['headers'], - # caches=p['cache'], host=p['host'], ) - # print(ress) - d =pymysql \ No newline at end of file +# if __name__ == '__main__': +# h = { +# "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjE2OTRmYjlmLTUzNjYtNGZjZS1hODg4LTBlY2UxOThmZThhZSJ9.5_mD4abE-5iHsSr6RB9R8qaIRV7zidUFkpytyyd2cjSiQcrdJvAE_6GjU9Q_Xsr0JmTkSCTiefpFySguyk2E8Q", +# "Content-Type": "multipart/form-data" +# +# } +# d = { +# "param": "updateSupport=0", +# "urlparam": None +# } +# p = {'address': '/v1/enter/trade/', 'assert': {'jsonpath': None, 'sqlassert': None, 'time': 2, 'code': 201}, +# 'data': {'param': {'name': '行业名称$RandomString($RandomPosInt(2,6)$)$', +# 'desc': '备注$RandomString($RandomPosInt(2,8)$)$'}, 'urlparam': None}, +# 'headers': {'Content-Type': 'application/json', +# 'Authorization': 'GREEN eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyMiwiZXhwIjoxNjUxODMzNjY4LCJ1c2VybmFtZSI6ImRsMDAxIn0.Dbk1ddEXdmW1tRzxZLvFgJwsh0hek6HJjzCabStdnz0'}, +# 'host': 'host_HB', 'info': '新建行业', 'method': 'POST', 'cache': None, 'relevance': None} +# ress = apisend(address=p['address'], data=p['data'], method=p['method'], headers=p['headers'], +# caches=p['cache'], host=p['host'], ) +# print(ress) +# d =pymysql diff --git a/config/config.ini b/config/config.ini index 26de895..f01e033 100644 --- a/config/config.ini +++ b/config/config.ini @@ -12,8 +12,6 @@ file_dir = /file test_name = demo [host] -http_type = https - demo = wanandroid.com [email] ;服务器 diff --git a/test_suite/datas/demo/biaodan.yml b/test_suite/datas/demo/biaodan.yml index d8a3cbd..e87c0a8 100644 --- a/test_suite/datas/demo/biaodan.yml +++ b/test_suite/datas/demo/biaodan.yml @@ -3,8 +3,10 @@ shoucang: order: 1 token: Cookies file: false + encryption: false case: - address: /lg/collect/add/json + http: https assert: jsonpath: sqlassert: null @@ -12,7 +14,7 @@ shoucang: code: 400 data: file: - param: 'title=2&author=2&link=2' + param: 2022-01-01 urlparam: null headers: Content-Type: multipart/form-data diff --git a/test_suite/datas/demo/login.yml b/test_suite/datas/demo/login.yml index c88ee3f..05a2700 100644 --- a/test_suite/datas/demo/login.yml +++ b/test_suite/datas/demo/login.yml @@ -3,8 +3,10 @@ login: order: 1 token: false file: false + encryption: false case: - address: /user/login + http: https assert: jsonpath: sqlassert: null diff --git a/test_suite/testcase/demo/test_biaodan.py b/test_suite/testcase/demo/test_biaodan.py index 32d28cd..6c9ce31 100644 --- a/test_suite/testcase/demo/test_biaodan.py +++ b/test_suite/testcase/demo/test_biaodan.py @@ -17,7 +17,7 @@ class Test_biaodan(object): casedata["headers"] = iniheaders(casedata["headers"]) casedata["headers"]["Cookies"] = "$caches(cookie)$" casedata = relevance(casedata, setup_Login) - res, restime, code = apisend(host=casedata["host"], address=casedata["address"], method=casedata["method"], + 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) diff --git a/test_suite/testcase/demo/test_login.py b/test_suite/testcase/demo/test_login.py index 975f65d..26b0a3d 100644 --- a/test_suite/testcase/demo/test_login.py +++ b/test_suite/testcase/demo/test_login.py @@ -14,8 +14,10 @@ class Test_login(object): ids=[i["info"] for i in readRedisData("login")["case"]]) @pytest.mark.flaky(reruns=1, reruns_delay=1) def test_login(self, casedata): - res, restime, code = apisend(host=casedata["host"], address=casedata["address"], method=casedata["method"], + 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) asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code) diff --git a/util/scripts/writeCase.py b/util/scripts/writeCase.py index e020e86..0318b2d 100644 --- a/util/scripts/writeCase.py +++ b/util/scripts/writeCase.py @@ -63,11 +63,14 @@ class Test_{filename}(object):""") casedata = relevance(casedata, setup_Login)""") else: f.write(f""" - def test_{item}(self, casedata):""") + def test_{item}(self, casedata): + casedata = relevance(casedata)""") if not filedata[item]["file"]: # 判断是否存上传文件 f.write(""" - res, restime, code = apisend(host=casedata["host"], address=casedata["address"], method=casedata["method"], + + 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"])""") if not filedata[item]["token"]: @@ -80,18 +83,19 @@ class Test_{filename}(object):""") asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code)\n""") else: f.write(f""" - res, restime, code = apisend(host=casedata["host"], address=casedata["address"], method=casedata["method"], + 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"], files=casedata["data"]["file"])""") if not filedata[item]["token"]: f.write(f""" - caseTearDown(casedata, res) - asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code)\n""") + caseTearDown(casedata, res) + asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code)\n""") else: f.write(f""" - caseTearDown(casedata, res, setup_Login) - asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code)\n""") + caseTearDown(casedata, res, setup_Login) + asserting(hope_res=casedata["assert"], real_res=res, re_time=restime, re_code=code)\n""") if __name__ == '__main__': diff --git a/util/tools/iniRequests.py b/util/tools/iniRequests.py index ac9e128..0c67ed6 100644 --- a/util/tools/iniRequests.py +++ b/util/tools/iniRequests.py @@ -47,7 +47,7 @@ def relevance (relevancedata, headerdata=None): relcase["headers"] = iniheaders(relcase["headers"]) relcase["headers"][case["token"]] = headerdata # 进行关联接口请求 - res, time, code = apisend(address=relcase["address"], + res, time, code = apisend(http=relcase["http"],address=relcase["address"], method=relcase["method"], headers=relcase["headers"], data=relcase["data"], caches=relcase["cache"], host=relcase["host"]) diff --git a/util/tools/randomData.py b/util/tools/randomData.py index e4cc0d9..7db60e8 100644 --- a/util/tools/randomData.py +++ b/util/tools/randomData.py @@ -234,8 +234,7 @@ def replace_random(value, res=None, param=None): int_list_json = re.findall(r'\"\$RandomInt\(([0-9]*,[0-9]*?)\)\$\"', value) int_list_dict = re.findall(r'\'\$RandomInt\(([0-9]*,[0-9]*?)\)\$\'', value) string_list = re.findall(r'\$RandomString\(([0-9]*?)\)\$', value) - float_list_json = re.findall(r'\"\$RandomFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$\"', value) - float_list_dict = re.findall(r'\'\$RandomFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$\'', value) + float_list = re.findall(r'\"\$RandomFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$\"', value) posfloat_list = re.findall(r'\$RandomPosFloat\(([0-9]*,[0-9]*,[0-9]*)\)\$', value) time_list = re.findall(r"\$GetTime\(time_type=(.*?),layout=(.*?),unit=([0-9],[0-9],[0-9],[0-9],[0-9])\)\$", value) choice_list = re.findall(r"\$Choice\((.*?)\)\$", value) @@ -247,20 +246,20 @@ def replace_random(value, res=None, param=None): if len(int_list_json): # 获取整型数据替换 结果是int + # int类型必须格式定死为双引号覆盖 ' "$RandomInt(1,333)$" ' for i in int_list_json: pattern = re.compile(r'\"\$RandomInt\(' + i + r'\)\$\"') key = str(random_int(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(int_list_dict): # 获取整型数据替换 结果是int + # int类型必须格式定死为双引号覆盖 ' "$RandomInt(1,333)$" ' for i in int_list_dict: pattern = re.compile(r'\'\$RandomInt\(' + i + r'\)\$\'') key = str(random_int(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(posint_list): # 获取整型数据替换 结果是字符串 for i in posint_list: @@ -268,7 +267,6 @@ def replace_random(value, res=None, param=None): key = str(random_int(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(string_list): # 获取字符串数据替换 for i in string_list: @@ -277,30 +275,14 @@ def replace_random(value, res=None, param=None): value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(float_list_json): - # 获取浮点数数据替换 返回浮点 - for i in float_list_json: - pattern = re.compile(r'\"\$RandomFloat\(' + i + r'\)\$\"') - key = str(random_float(i)) - value = re.sub(pattern, key, value, count=1) - value = replace_random(value, res, param) - - elif len(float_list_json): + elif len(float_list): # 获取浮点数数据替换 返回浮点 - for i in float_list_json: + for i in float_list: pattern = re.compile(r'\"\$RandomFloat\(' + i + r'\)\$\"') key = str(random_float(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(float_list_dict): - # 获取浮点数数据替换 返回浮点 - for i in float_list_dict: - pattern = re.compile(r'\'\$RandomFloat\(' + i + r'\)\$\'') - key = str(random_float(i)) - value = re.sub(pattern, key, value, count=1) - value = replace_random(value, res, param) - elif len(posfloat_list): # 获取浮点数数据替换 返回str for i in posfloat_list: @@ -308,7 +290,6 @@ def replace_random(value, res=None, param=None): key = str(random_float(i)) value = re.sub(pattern, key, value, count=1) value = replace_random(value, res, param) - elif len(time_list): # 获取时间替换 for i in time_list: @@ -336,6 +317,7 @@ def replace_random(value, res=None, param=None): value = replace_random(value, res, param) elif len(urlparam_list): + # urls = "$url(home_id)$" # replace_random(urls,param={"home_id":"$caches(haha)$"}) for i in urlparam_list: @@ -345,6 +327,7 @@ def replace_random(value, res=None, param=None): value = replace_random(value, res, param=param) elif len(relevance_list): + # urls = "$url(home_id)$" # replace_random(urls,param={"home_id":"$caches(haha)$"}) for i in relevance_list: @@ -461,11 +444,7 @@ from alarm # 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': "$RandomFloat(1,333,2)$", '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)$"' - r = eval(replace_random(da)) - print(r) - print(type(r["data"]["param"]["mch_id"])) - + print(eval(replace_random(da))) diff --git a/util/tools/requestsTearDown.py b/util/tools/requestsTearDown.py index 58ae7a4..449b02c 100644 --- a/util/tools/requestsTearDown.py +++ b/util/tools/requestsTearDown.py @@ -64,7 +64,7 @@ def caseTearDown(casedata, caseres, headerdata=None): tddata['dataname']: value } # 执行后置请求 - res,code,restime = apisend(address=tdcase["address"], + 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"]) -- Gitee From 722b1b538cb3381b8a77323afd21cbd58c1cc6a2 Mon Sep 17 00:00:00 2001 From: jing song <529548204@qq.com> Date: Thu, 28 Jul 2022 13:14:41 +0800 Subject: [PATCH 3/3] =?UTF-8?q?readme=E5=A2=9E=E5=8A=A0=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- config/config.ini | 14 +++++++++++++- test_suite/testcase/demo/test_login.py | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 946b034..c2df4cf 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ QQ 529548204 如果有问题请联系我 大家共同学习共同进步~ # 更新日志 -2022年6月7日 更新 取消config中http类型 改为yaml数据内 +2022年6月7日 更新 取消config中http类型 改为yaml数据内 2022年5月30日 更新 YAML读取时间格式datetime数据后 json处理方式 2022年5月20日 更新增加jenkins持续集成说明配置方法等 2022年5月17日 更新增加xml参数处理,增加自定义加密方式(加密规则需要自己写 需要一定编码能力) diff --git a/config/config.ini b/config/config.ini index f01e033..417e533 100644 --- a/config/config.ini +++ b/config/config.ini @@ -10,9 +10,11 @@ cache_dir = /caches recording_dir = /recording file_dir = /file -test_name = demo +test_name = new [host] demo = wanandroid.com +new = merchant.test.feng-go.com +oss = oss-fg.feng-go.com [email] ;服务器 mail_host = smtp.sina.com @@ -32,6 +34,16 @@ user = root password = 123456 database = new charset = utf8 + +[database2] + +host = 192.168.110.198 +port = 3307 +user = root +password = finsiot@123 +database = motor +charset = utf8 + [redis] host = 127.0.0.1 ;host = redis diff --git a/test_suite/testcase/demo/test_login.py b/test_suite/testcase/demo/test_login.py index 26b0a3d..e078adb 100644 --- a/test_suite/testcase/demo/test_login.py +++ b/test_suite/testcase/demo/test_login.py @@ -13,6 +13,7 @@ class Test_login(object): @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): res, restime, code = apisend(http=casedata["http"], host=casedata["host"], address=casedata["address"], method=casedata["method"], -- Gitee