def assert_sql(self, check_sql_str): self.get_sql_comp_res(check_sql_str) # 关闭数据库连接 self.db.close() if False in self.sql_com_res.values(): logger.error("断言失败,数据库比对不成功!") raise AssertionError else: logger.info("数据库比对成功!")
def test_business_flow_api(self, case): logger.info("#################开始执行业务流接口#######################") # 替换 case = replace_case_with_re(case) # 请求 # 判断是否要添加token if hasattr(Data, "token"): resp = self.hr.send_requests(case["method"], case["url"], case["request_data"], token=getattr(Data, "token")) else: resp = self.hr.send_requests(case["method"], case["url"], case["request_data"]) # 如果有提取字段,从响应消息中提取对应字段,赋值给Data属性 if case["extract"]: set_dataclass_attr_from_resp(resp.json(), case["extract"]) # 如果有预期结果,则将实际结果与预期结果进行比较 if case["expected"]: actual = resp.json() logger.info("用例执行实际结果:{}".format(actual)) expected = eval(case["expected"]) logger.info("用例预期结果:{}".format(expected)) # 断言 try: assert actual["code"] == expected["code"] assert actual["msg"] == expected["msg"] except AssertionError: logger.exception("断言失败!") raise except Exception: logger.exception("除断言以外的报错!") raise
def replace_case_with_re(case_dict): case_str = str(case_dict) # 提取正则表达式 replace_mark_list = re.findall("#(\w+)#", case_str) logger.info("用例中提取到的正则结果{}".format(replace_mark_list)) # 如果有手机号需要未注册的,调用函数生成新的未注册过手机号 if "phone" in replace_mark_list: new_phone = get_new_phone() setattr(Data, "phone", new_phone) # 将新生成的手机号设置成Data类属性 logger.info("如果有手机号需要未注册的,调用函数生成新的未注册过手机号,将新生成的手机号设置成Data类属性") if replace_mark_list: for mark in replace_mark_list: # 遍历正则结果列表 case_str = case_str.replace(f"#{mark}#", getattr(Data, mark)) logger.info(f"替换#{mark}#,替换后{mark}值为:{getattr(Data, mark)}") logger.info("替换后用例为:\n {}".format(case_str)) return eval(case_str)
def send_requests(self, method, url, data=None, token=None): logger.info("==================开始发起请求============================") logger.info("请求方法为:{}".format(method)) # 请求头处理 self.__deal_header(token) # 请求数据处理 self.__deal_data(data) # 处理url self.__deal_url(url) if method.upper() == "GET": response = requests.get(self.url, self.data, headers=self.headers) elif method.upper() == "PATCH": response = requests.patch(self.url, json=self.data, headers=self.headers) else: response = requests.post(self.url, json=self.data, headers=self.headers) logger.info("请求响应状态码:{}".format(response.status_code)) logger.info("请求响应为:\n {}".format(response.json())) return response
def testRecharge(self, case): logger.info("*****************开始执行充值接口用例**************************") # 替换 case = replace_case_with_re(case) logger.info("当前测试用例为:\n {}".format(case)) # 发起请求 # 判断是否要传递token值 if hasattr(Data, "token"): res = self.hr.send_requests(case["method"], case["url"], case["request_data"], token=getattr(Data, "token")) else: res = self.hr.send_requests(case["method"], case["url"], case["request_data"]) # 如果有提取字段,那么需要从响应中提取对应数据,设置为Data.token if case["extract"]: set_dataclass_attr_from_resp(res.json(), case["extract"]) # 如果有预期结果,需要把响应结果与预期结果进行比较 if case["expected"]: # 响应结果 actual = res.json() logger.info("用例实际执行结果:\n {}".format(actual)) expected = eval(case["expected"]) logger.info("用例预期结果:\n {}".format(expected)) # 断言 try: assert actual["code"] == expected["code"] assert actual["msg"] == expected["msg"] if actual["data"]['leave_amount']: assert actual["data"]['leave_amount'] == float( getattr(Data, "money")) except AssertionError: logger.exception("断言失败!") raise # 把异常抛给unittest框架 except Exception: logger.exception("除断言以外的异常报错!") raise # 如果有数据库校验,则进行数据库校验 if case["check_sql"]: ha = HandleAssert() ha.assert_sql(case["check_sql"])
def test_register(self, case): logger.info( "*************************** 开始执行注册接口测试用例 ***************************" ) # 替换手机号 case = replace_case_with_re(case) # 替换需要替换的--系统中已存在的手机号--从配置文件读取 if case["request_data"].find("*phone*") != -1: phone = conf.get("user", "user") case["request_data"] = case["request_data"].replace( "*phone*", phone) # 替换需要替换的--系统中已存在的手机号--从配置文件读取 if case["request_data"].find("*pwd*") != -1: pwd = conf.get("user", "pwd") case["request_data"] = case["request_data"].replace("*pwd*", pwd) # 发起请求 resp = self.hr.send_requests(case["method"], case["url"], case["request_data"]) logger.info("当前测试用例为:\n {}".format(case)) if case["expected"]: # 响应结果 actual = resp.json() logger.info("用例实际执行结果:\n {}".format(actual)) expected = eval(case["expected"]) logger.info("用例预期结果:\n {}".format(expected)) # 断言 try: assert actual["code"] == expected["code"] assert actual["msg"] == expected["msg"] except AssertionError: logger.exception("断言失败!") raise # 把异常抛给unittest框架 except Exception: logger.exception("除断言以外的异常报错!") raise if case["check_sql"]: sleep(0.5) # 等待服务器数据与数据库交互完成 ha = HandleAssert() ha.assert_sql(case["check_sql"])
def test_add_bid_api(self, case): logger.info( "########################开始执行添加项目接口#########################") # 替换 case = replace_case_with_re(case) logger.info("当前执行用例为:\n {}".format(case)) # 请求 # 判断是否需要传递token if hasattr(Data, "token"): resp = self.hr.send_requests(case["method"], case["url"], case["request_data"], token=getattr(Data, "token")) else: resp = self.hr.send_requests(case["method"], case["url"], case["request_data"]) # 提取需要的变量 if case["extract"]: set_dataclass_attr_from_resp(resp.json(), case["extract"]) # 如果有预期结果则用实际结果与预期结果进行比较 if case["expected"]: actual = resp.json() logger.info("用例执行结果为: {}".format(actual)) expected = eval(case["expected"]) logger.info("用例预期结果为:{}".format(expected)) try: assert actual["code"] == expected["code"] if expected.get("msg"): assert actual["msg"] == expected["msg"] except AssertionError: logger.exception("断言失败!") raise AssertionError except: logger.exception("断言以外的报错!") raise
def __deal_data(self, data): if isinstance(data, str): self.data = json.loads(data) else: self.data = data logger.info("请求数据为:\n {}".format(self.data))
def __deal_header(self, token=None): if token is not None: self.headers["Authorization"] = f"Bearer {token}" logger.info("请求头为:\n {}".format(self.headers))
def get_sql_comp_res(self, check_sql_str): check_sql_dict = eval(check_sql_str) logger.info("数据库校验为:\n{}".format(check_sql_dict)) if check_sql_dict["check_type"] == "value": logger.info("比较sql语句查询结果之后的值") sql_res = self.db.get_one(check_sql_dict["check_sql"]) logger.info("执行sql:{}".format(check_sql_dict["check_sql"])) logger.info("查询结果:{}".format(sql_res)) logger.info("预期结果为:{}".format(check_sql_dict["expected"])) # 执行的结果进行比较。sql_res为字典类型 for key, value in check_sql_dict["expected"].items(): if key in sql_res.keys(): if isinstance(sql_res[key], Decimal): sql_res[key] = float(sql_res[key]) logger.info("将Decimal转换为float后的值:{}".format(sql_res[key])) if value == sql_res[key]: self.sql_com_res[key] = True # 比较成功 存储到sql_com_res中 logger.info("比较成功!") else: self.sql_com_res[key] = False # 比较失败 存储到sql_com_res中 logger.info("比较失败!") else: logger.info("sql查询结果里面没有对应的列名{},请检查预期结果或查询语句是否正确}".format(key)) # 比对slq语句查询之后的条数 elif check_sql_dict["check_type"] == "count": logger.info("比较sql语句查询之后的条数,sql查询结果为整数,只要比对数字即可!") sql_res = self.db.get_count(check_sql_dict["check_sql"]) logger.info("执行sql:{}".format(["check_sql"])) logger.info("查询结果:{}".format(sql_res)) logger.info("预期结果为:{}".format(check_sql_dict["expected"])) # 比对 if sql_res == check_sql_dict["expected"]: self.sql_com_res["count"] = True logger.info("比较成功!") else: self.sql_com_res["count"] = False logger.info("比较失败!")