工具层handle_response
- **
__handle_str
**:利用str.replace
清洗 Excel 数据中的换行符和空格,确保格式合法; - **
handle_response
**:基于isinstance
和requests
的json()/text
方法,标准化 JSON/文本响应,输出统一结构; - **
assert_reponse
**:通过jsonpath
动态提取字段、ast.literal_eval
安全转换预期值为字典,结合unittest
的assertEqual
实现灵活断言,避免硬编码; - **
assert_db
**:直接调用assertEqual
验证数据库数据一致性。
__handle_str
(清洗输入)handle_response
(标准化响应)assert_reponse
(动态断言)assert_db
(数据库断言)
自定义函数 所用模块/方法 函数作用 handle_response(response)
isinstance
判断对象的数据类型并返回布尔值;
区分响应数据格式(JSON 或纯文本),确保后续处理逻辑适配不同接口返回类型 assert_reponse(expected_data, response)
动态提取实际响应字段,并与预期数据对比,执行自动化断言
__handle_str()
清洗数据清洗excel中的预期结果的换行符(
\n
)和空格,避免因数据格式错误(如 JSON 中存在非法空格)导致解析失败或断言不匹配isinstance
判断对象的数据类型是字典dict并返回布尔值
ast.literal_eval(expected_data)
字符串转字典将字符串格式的预期值(如 "{'token_type': 'bearer'}"
)安全转换为字典,避免eval
的安全风险。jsonpath(response, "$..key")
动态字段提取通过 JSONPath 表达式(如 $..token_type
)从响应中提取动态字段值,支持嵌套结构,避免硬编码路径。 assert_db(extract_data, actual_data)
self.assertEqual()
直接比对数据库查询结果与预期数据,验证数据一致性。 import ast import unittest from jsonpath import jsonpath class HandleResponse(unittest.TestCase): def __handle_str(self,data:str): #data:excel中获取的请求参数 for str_data in ["\n"," "]: data = data.replace(str_data,"") return data #去掉空格后的请求参数 # 响应结果处理 def handle_response(self,response): try: if isinstance(response.json(),dict): #判断一个对象是否时一个已知的类型 return {"response_type":"json","response":response.json()} except Exception as e : if isinstance(response.text,str): return {"response_type":"str","response":response.text} else: return {} def assert_reponse(self,expected_data,response): # 期望结果: expected_data = {"token_type": "bearer"} # 实际结果: actual_data = {"token_type":"bearer"} if expected_data: #去空格 expected_data = self.__handle_str(data=expected_data) # 三元运算符 [结果为真的值] if [条件] else [结果为假的值] expected_data = expected_data if isinstance(expected_data,dict) else ast.literal_eval(expected_data) actual_data = {} if response["response_type"] == "json": for key in expected_data: actual_data[key]=jsonpath(response,f"$..{key}")[0] self.assertEqual(expected_data,actual_data) else: for key in expected_data: actual_data[key] = response["response"] self.assertEqual(expected_data, actual_data) else: print("预期结果为空,不需要做接口响应的断言") # 断言数据库 def assert_db(self,extract_data,actual_data): self.assertEqual(extract_data,actual_data) if __name__ == '__main__': cl = HandleResponse()