pytest-auto-api2/tools/assertControl.py

115 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 21:03
# @Author : 余少琪
from tools.yamlControl import GetCaseData
from config.setting import ConfigHandler
import jsonpath
from tools.logControl import INFO, ERROR, WARNING
from tools import slash
class Transmission:
EQUAL: str = "=="
NOTEQUAL: str = "!="
IN: str = "IN"
NOTIN: str = "NOTIN"
class Assert:
def __init__(self, assertData: dict):
self.GetCaseData = GetCaseData(ConfigHandler.merchant_data_path + r'/ShopInfo/GetSupplierInfo.yaml')
self.assertData = assertData
@staticmethod
def _checkParams(responseData: dict, sqlData: dict):
"""
:param responseData: 响应数据
:param sqlData: 数据库数据
:return:
"""
# 判断断言的数据类型
if isinstance(responseData, dict) and isinstance(sqlData, dict):
pass
else:
raise "responseData、sqlData、assertData的数据类型必须要是字典类型"
@staticmethod
def _switch():
# 获取数据库开关
switch = GetCaseData(ConfigHandler.config_path).get_yaml_data()['MySqlDB']["switch"]
return switch
@staticmethod
def _assertType(key: any, Type: str, value: any):
"""
:param key:
:param Type:
:param value:
:return:
"""
try:
if Type == Transmission.EQUAL:
assert key == value
elif Type == Transmission.NOTEQUAL:
assert key != value
elif Type.upper() == Transmission.IN:
assert key in value
elif Type.upper() == Transmission.NOTIN:
assert key not in value
else:
raise f"断言失败,目前不支持{Type}断言类型,如需新增断言类型,请联系管理员"
INFO.logger.info("断言成功, 预期值:{}, 断言类型{}, 实际值{}".format(key, Type, value))
except AssertionError:
ERROR.logger.error("断言失败, 预期值:{}, 断言类型{}, 实际值{}".format(key, Type, value))
raise
def assertEquality(self, responseData: dict, sqlData: dict):
# 判断数据类型
self._checkParams(responseData, sqlData)
global getSqlData
for key, values in self.assertData.items():
assertValue = self.assertData[key]['value'] # 获取 yaml 文件中的期望value值
assertJsonPath = self.assertData[key]['jsonpath'] # 获取到 yaml断言中的jsonpath的数据
assertType = self.assertData[key]['AssertType']
# 从yaml获取jsonpath拿到对象的接口响应数据
respData = jsonpath.jsonpath(responseData, assertJsonPath)
# jsonpath 如果数据获取失败会返回False判断获取成功才会执行如下代码
if respData is not False:
if assertType == 'SQL':
# 判断数据库为开关为关闭状态
if self._switch() is False:
WARNING.logger.warning(f"检测到数据库状态为关闭状态,程序已为您跳过此断言,断言值:{values}")
# 数据库开关为开启
if self._switch():
# 判断当用例走的数据数据库断言但是用例中未填写SQL
if sqlData == {'sql': None}:
raise "请在用例中添加您要查询的SQL语句。"
# 走正常SQL断言逻辑
else:
ResSqlData = jsonpath.jsonpath(sqlData, assertValue)[0]
# 判断mysql查询出来的数据类型如果是bytes类型转换成str类型
if isinstance(ResSqlData, bytes):
ResSqlData = ResSqlData.decode('utf=8')
self._assertType(Type=self.assertData[key]['type'], key=respData[0], value=ResSqlData)
# 判断assertType为空的情况下则走响应断言
elif assertType is None:
self._assertType(Type=self.assertData[key]['type'], key=respData[0], value=assertValue)
else:
raise "断言失败,目前只支持数据库断言和响应断言"
else:
ERROR.logger.error("JsonPath值获取失败{}".format(assertJsonPath))
raise
if __name__ == '__main__':
pass