import unittest
from ddt import ddt, data
from unittestreport import list_data, ddt
from api.tools.handle_path import test_data_dir
from api.tools.handle_excel import HandleExcel
from api.tools.handle_replace import HandleReplace
from api.tools.handle_response import HandleResponse
from api.tools.handle_requests import HandleRequests
from api.tools.handle_extract import HandleExtract
from api.tools.handle_assert_db import HandleAssertDb
from api.tools.handle_db import mysql
from api.tools.handle_log import my_log
from api.conf.setting import assert_db_info
# 获取测试用例数据
case_list = HandleExcel(test_data_dir, "place_order").get_excel_test_case()
@ddt
class TestPlaceOrder(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
# 请求头
cls.header = {"Content-Type": "application/json;charset=UTF-8", "locale": "zh_CN"}
# 参数替换类的初始化
cls.handle_replace = HandleReplace() # 参数化data,用配置文件读取数据进行参数化
# 请求响应数据类的初始化
cls.handle_response = HandleResponse() # 确定响应类型,进行断言
cls.handle_requests = HandleRequests() # 发送请求
cls.handle_extract = HandleExtract() # 全局变量提取
cls.handle_assert_db = HandleAssertDb() # 数据库断言
@classmethod
def tearDownClass(cls) -> None:
mysql.db_close()
# @list_data(case_list) 相当于@data(*case_list) # [{},{}]多少个{}代表多少个测试用例
@list_data(case_list) # [{},{}] # unittestreport类中的list_data和data功能差不多,可以自动读取excel中的title字段,生成到测试报告中
def test_place_order(self, case): # 很多错误是由于类型错误导致{},{}
# 1、发送请求前:需要解决data中的/n和空格,需要正则参数化数据##替换
# 2、如果setup_sql不为空,会调用前置处理执行setup_sql语句,获取字典数据,然后设置为内属性(__execute_sql_and_setattr)
new_data = self.handle_replace.replace_data(case["data"], setup_sql=case["setup_sql"])
my_log.info(msg=f"参数化后的入参data格式:{new_data}")
# 2、发送请求
new_response = self.handle_requests.send_requests(url=case["url"], method=case["method"], data=new_data, is_upload=case["is_upload"])
my_log.info(msg=f"处理后的响应结果是:{new_response}")
# 断言 预期结果:case["expected_data"] = {"token_type":"bearer"} {"response":"验证码有误或已过期"}
# 实际结果: {'response_type': 'str', 'response': '验证码有误或已过期'} {'response_type': 'json','token_type': 'bearer'}
my_log.info(msg="处理后的响应结果是:{}".format(case["expected_data"]))
# 3、接口响应断言
self.handle_response.assert_response(case["expected_data"], new_response)
# 4、通过extract方法提取响应结果,生成全局变量 预期结果 实际响应数据
self.handle_extract.handle_extract(case["extract_data"], new_response)
# 5、数据库断言
self.handle_assert_db.assert_db(assert_db=case["assert_db"])
if __name__ == '__main__':
unittest.main()