数据库断言封装
import ast
import jsonpath
from common.my_mysql import My_mysql
from common.py_log import LoggerHandler
loger = LoggerHandler()
class MyAssert:
def assert_db(self,check_db_str):
"""
1、将check_db_str转成python对象(列表),通过eval
2、遍历1中的列表,访问每一组db比对
3、对于每一组来讲,1)调用数据库类,执行sql语句。调哪个方法,根据type来决定。得到实际结果
2)与期望结果比对
:param check_db_str: 测试数据excel当中,assert_db列读取出来的数据库检验字符串。
示例:[{"sql":"select id from member where mobile_phone='#phone#'","expected":1,"type":"count"}]
:return:
"""
# 所有断言的比对结果列表
check_db_res = []
# 把字符串转换成python列表
check_db_list = ast.literal_eval(check_db_str) # 比eval安全一点。转成列表。
# 建立数据库连接
db = My_mysql()
# 遍历check_db_list
for check_db_dict in check_db_list:
loger.info("当前要比对的sql语句:\n{}".format(check_db_dict["sql"]))
loger.info("当前执行sql的查询类型(查询结果条数 或 查询某个值。):\n{}".format(check_db_dict["db_type"]))
loger.info("期望结果为:\n{}".format(check_db_dict["expected"]))
# 根据type来调用不同的方法来执行sql语句。
if check_db_dict["db_type"] == "count":
loger.info("比对数据库查询的结果条数,是否符合期望")
# 执行 sql 语句
res = db.get_count(check_db_dict["sql"])
loger.info("sql的执行结果为:\n{}".format(res))
# 将比对结果添加到结果列表当中
check_db_res.append(res == check_db_dict["expected"])
# if check_db_dict["comp_type"] == "eql":
# check_db_res.append(res == check_db_dict["expected"])
if False in check_db_res:
loger.error("部分断言失败!,请查看数据库比对结果为False的")
# raise AssertionError
return False
else:
loger.info("所有断言成功!")
return True
if __name__ == '__main__':
# 已经从excel当中读取出来的字符串
check_db_str='''[{"sql":"select id from member where mobile_phone='14560748362'","expected":1,"db_type":"count"}]'''
res = MyAssert().assert_db(check_db_str)
print(res)
=====================================
#phone# 占位符替换
1、在excel中准备测试数据 - 登陆接口
2、从excel当中读取测试数据 - 登陆接口
3、定义一个测试类TestLogin,使用参数化
4、在类内部:
4.1 如果有要替换的占位符,那么先要替换掉占位符。 – 也要准备占位符对应的数据。
4.2 把替换之后的请求数据(json格式的字符串),转换成一个字典
4.3 发起请求,并接收响应结果
4.4 定义空列表,存放响应断言和数据库断言的最终结果
4.5 处理响应结果断言
4.6 处理数据库断言
4.6 最后看4.4的列表中是否有False,有就AssertionError
import os
import json
import pytest
from common.py_log import LoggerHandler
from common.my_assert import MyAssert
from common.My_excel import MyExcel
from common.my_requests import MyRequests
from common.handele_phonne import get_new_phone
from common.my_path import testdata_dir
logger = LoggerHandler()
# 第一步:读取注册接口的测试数据 - 是个列表,列表中的每个成员,都是一个接口用例的数据。
excel_path = os.path.join(testdata_dir,"注册接口用例.xlsx")
me = MyExcel(excel_path, "注册")
cases = me.read_data()
# 第二步:遍历测试数据,每一组数据,发起一个http的接口请求
# 实例化请求对象
mq = MyRequests()
massert = MyAssert()
class Test_Register:
@pytest.mark.parametrize("case", cases)
def test_register(self,case):
logger.info("=========================== 注册接口测试 ==============================")
new_phone = get_new_phone() # # 设置属性,自动生成手机号码,方便替换是调用。
# 1、替换请求数据当中,要替换掉的内容。占位符的形式:#value#
# 替换掉占位符 - 请求数据和断言里面替换掉 #phone# ,替换成未注册手机号码
if case["req_data"].find("#phone#") != -1: # 如果 case["req_data"] 和 case["req_data"] .里面的(#手机号码#) != -1: (-1)在这里是没有。
case["req_data"] = case["req_data"].replace("#phone#", new_phone) # case["req_data"] = case["req_data"].替换掉(#手机号码#,new_phone:新生成的手机号码)
if case["assert_list"] and case["assert_list"].find("#phone#") != -1: # 如果 case["assert_list"] 和 case["assert_list"] .里面的(#手机号码#) != -1:
case["assert_list"] = case["assert_list"].replace("#phone#", new_phone) # case["assert_list"] = case["assert_list"].替换掉(#手机号码#,new_phone:新生成的手机号码)
if case["assert_db"] and case["assert_db"].find("#phone#") != -1: # 如果 case["assert_db"] 和 case["assert_db"] .里面的(#手机号码#) != -1:
case["assert_db"] = case["assert_db"].replace("#phone#", new_phone) # case["assert_db"] = case["assert_db"].替换掉(#手机号码#,new_phone:新生成的手机号码)
# 2、把替换之后的请求数据(json格式的字符串),转换成一个字典
req_dict = json.loads(case["req_data"])
# 3、发起请求,并接收响应结果
resp = mq.send_requests(case["url"], case["method"], req_dict)
print(resp.json())
# 定义结果空列表,方便下面断言后添加到列表里面。
assert_res = []
# 4、断言响应结果中的数据
if case["assert_list"]:
response_check_res = massert.assert_response_value(case["assert_list"], resp.json())
assert_res.append(response_check_res)
# 5、断言数据库
if case["assert_db"]:
db_check_res = massert.assert_db(case["assert_db"])
assert_res.append(db_check_res)
# 最终的抛 AssertttionError
if False in assert_res:
raise AssertionError