1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
| # -*- utf-8 -*-
# @Time: 2021/8/20 15:56
# @name: 彭升军
# @File: Assertion_Check_Util.py
# @Software: PyCharm
import requests
import json
import re
from Encapsulation.Business_Support_Until.business_support_requests import New_Request
class CheckUtils:
def __init__(self, response_data):
self.response_data = response_data
# 键值对断言标识,断言通过为 True
self.check_pass = None
self.pass_check = ''
self.check_rules = { # 判断规则和方法名去对应的一个过程
'none': self.none_check,
'json_key': self.body_key_check, # 'json_key': self.key_check,
'json_key_value': self.body_key_value_check, # 'json_key_value':self.key_value_check,
'body_regexp': self.regexp_check, # 正则
'check_key_value': self.check_key_value,
# 'header_key': self.header_key_check, # 比对响应头
'header_key_value': self.header_key_value_check, # 比对响应头和它对应的值
'response_code': self.response_code_check
}
self.assert_result = {
'code': "断言成功!", # 状态吗,200 表示断言成功
'pass_check': self.pass_check,
# 'response_code': self.response_data.status_code, # 响应状态码
# 'response_reason': self.response_data.reason,
# 'response_headers': self.response_data.headers, # 响应头
# 'response_body': self.response_data.text, # 响应正文
'response_body': self.response_data, # 响应正文
# 'response_url': self.response_data.url, # 响应地址
'check_result': True
}
def none_check(self):
return self.assert_result
def __key_check(self, actual_result, check_data): # 做成公共的私有的内置方法
key_list = check_data.split(',')
tmp_result_pass = []
tmp_result_fiall = []
for key in key_list:
if key in actual_result.keys():
if key == 'success' and key == 'model':
self.assert_result['pass_check'] = key
tmp_result_pass.append(self.assert_result)
else:
tmp_result_fiall.append(self.assert_result)
else:
self.assert_result['check_result'] = False
self.assert_result['code'] = "断言失败"
self.assert_result['pass_check'] = key + ": 断言失败"
tmp_result_fiall.append(self.assert_result)
assert self.assert_result['check_result'] is True, "断言不通过"
if tmp_result_pass:
return tmp_result_pass
else:
return tmp_result_fiall
# 比较头部
def header_key_check(self, check_data): # 检查头部的
return self.__key_check(self.response_data.headers, check_data)
# 比较正文
def body_key_check(self, check_data): # 检查正文的
return self.__key_check(self.response_data, check_data)
def __key_value_check(self, actual_result, check_data):
key_value_dict = eval(check_data)
tmp_result = []
for key_value in key_value_dict.items():
if key_value in actual_result.items():
self.assert_result['code'] = "断言成功"
self.assert_result['pass_check'] = key_value
tmp_result.append(self.assert_result)
if not tmp_result:
self.assert_result['check_result'] = False
self.assert_result['code'] = "断言失败"
self.assert_result['pass_check'] = f"{key_value }: 断言失败"
tmp_result.append(self.assert_result)
assert self.assert_result['check_result'] is True, "断言不通过"
return tmp_result
else:
return tmp_result
# 比对响应头和它对应的值
def header_key_value_check(self, check_data):
return self.__key_value_check(self.response_data.headers, check_data)
def body_key_value_check(self, check_data):
return self.__key_value_check(self.response_data, check_data)
# 头部比较
def response_code_check(self, check_data):
if self.response_data.status_code == int(check_data):
return self.assert_result
# 正则表达试
def regexp_check(self, check_data):
tmp_result = re.findall(check_data, str(self.response_data)) # 这里需要字符串/txt
if tmp_result:
self.assert_result['code'] = "断言成功"
self.assert_result['pass_check'] = check_data
return self.assert_result
else:
self.assert_result['check_result'] = False
self.assert_result['code'] = "断言失败"
self.assert_result['pass_check'] = check_data + ":断言失败找不到这样的字符!"
assert self.assert_result['check_result'] is True, "断言不通过"
return self.assert_result
def run_check(self, check_type, check_data):
if check_type == '无' or check_data == '':
return self.check_rules[check_type]()
else:
check_value = self.check_rules[check_type](check_data)
assert self.assert_result['check_result'] is True, "断言不通过"
return check_value
# 比价键值对对比
def get_all_real_data(self, key, value, real: dict):
try:
for real_key in real.keys():
if type(real[real_key]) == list:
for realData in real[real_key]:
if type(realData) == dict:
self.get_all_real_data(key, value, realData)
if key == real_key:
self.check_pass = True
self.assert_result['pass_check'] = f"预期结果:{value} 实际结果:{real[real_key]}"
assert value == real[real_key], f"预期结果:{value} 实际结果:{real[real_key]}"
if type(real[real_key]) == dict:
self.get_all_real_data(key, value, real[real_key])
except Exception as e:
self.assert_result['code'] = "断言失败"
self.assert_result['pass_check'] = e
self.assert_result['check_result'] = False
return self.assert_result
def check_key_value(self, expect: dict):
"""
断言封装
:param expect: 预期结果
:param real: 实际结果
"""
try:
for key in expect.keys():
self.get_all_real_data(key, expect[key], self.response_data)
# 判断是否是list
if type(expect[key]) == list:
for expectData in expect[key]:
# 判断是否是子典
if type(expectData == dict):
self.check_key_value(expectData, self.response_data)
if type(expect[key]) == dict:
self.check_key_value(expect[key], self.response_data[key])
assert self.check_pass is not None, f"预期结果的 {key} 不在实际结果当中!"
if self.assert_result['check_result'] is True:
return self.assert_result
else:
return self.assert_result
except Exception as e:
self.assert_result['code'] = "断言失败"
self.assert_result['pass_check'] = e
self.assert_result['check_result'] = False
assert self.assert_result['check_result'] is True, "断言不通过"
return self.assert_result
# if __name__ == '__main__':
# # # # # # session = requests.session()
# data = {
# "model": {
# 'merchantId': 55556398
# },
# "pageIndex": 0,
# "pageSize": 0,
# "queryCount": True,
# "start": 0
# }
# response = New_Request().request_post(
# url=''
# , para=data)
# # # # response.encoding = response.apparent_encoding
# checkUtils = CheckUtils(response)
# # # print("lll:", response.headers)
# print("建对比", checkUtils.run_check('json_key', 'success,model'))
# print("键值对对比", checkUtils.run_check('json_key_value', "{'success': True}"))
# print("正文正则表达试", checkUtils.run_check('body_regexp', '15842'))
# # print("11", checkUtils.run_check('header_key', 'Connection,Content-Length'))
# # print("头部键值对对比", checkUtils.run_check('header_key_value', "{'accountBillNo': 'CA1251161536585166848'}")) # 键值对
# print(checkUtils.run_check("check_key_value", {'reportId': 158421})) # 键值对 |