根据业务场景,本人写了一个通用的动态断言方法,支持value,{key:value},{key:正则表达式},方法如下
# coding=utf-8
import re
from app_execution.allFunction import allFunction
class TestResult(object):
def testcase(self, result, assertdata): # 根据respcode和message正则断言
testresult ='0'
if (result == None or assertdata == None): # 如果断言规则是空的
testresult = '1'
if isinstance(assertdata, str): # 如果断言规则是字符串
assert_respcode_result = re.search(assertdata, result['respCode'], re.I | re.M)
assert_message_result = re.search(assertdata, result['message'], re.I | re.M)
if assert_respcode_result or assert_message_result:
testresult = '1'
else:
testresult = TestResult().assert_key(assertdata, result)
return testresult
def assert_key(self, assert_data, result):#递归断言
testresult = '0'
if not isinstance(assert_data, dict): # 如果断言规则是dict
assert_data = allFunction().parse_js(assert_data)
if isinstance(assert_data, dict):
for key in assert_data:
assertlist = []
assert_list = allFunction().get_target_value(key, result, assertlist)#获取key的value
if assert_list != []:
if not isinstance(assert_data[key], dict) and not isinstance(assert_data[key], list):
regex=assert_data[key]
subject= assert_list[0]
pattern=re.compile(regex)
if pattern.search(subject):#正则表达式断言
testresult = '1'
continue
elif isinstance(assert_data[key], dict) or isinstance(assert_data[key], list):
TestResult().assert_key(assert_data[key], result)
else:
break
else:
break
return testresult
可以看出assert_key()是使用了递归,这里面还调用了其他方法,一下一一解释
1.allFunction().get_target_value(),是用来无限遍历非标准json
2.allFunction().parse_js(),解析非标准JSON的Javascript字符串,等同于json.loads(JSON str)