def test_withdraw(self, case): '提现用例' if case['check_sql'] is not None and isinstance( case['check_sql'], str): if re.search("#(.*?)#", case['check_sql']): case['check_sql'] = re_replace(case['check_sql'], case['obj']) logger.info('第{}条用例执行的sql语句是{}'.format(self.__class__.count, case['check_sql'])) # 提现前的帐户余额 pre_withdraw_amount = db.select_one_data( eval(case['check_sql'])['sql_01']) pre_withdraw_amount = str( Decimal(pre_withdraw_amount['leave_amount']).quantize( Decimal('0.00'))) # 提现金额 withdraw_amount = eval(case['param'])['amount'] logger.info(withdraw_amount) if case['id'] == 5: withdraw_amount = round( float(pre_withdraw_amount) + 1000.23, 2) setattr(EnvData, 'max_amount', withdraw_amount) # 期望金额 expect_amount = round( (float(pre_withdraw_amount) * 100 - withdraw_amount * 100) / 100, 2) setattr(EnvData, 'expect_amount', expect_amount)
def setUpClass(cls): logger.info('======== start ============》开始执行{}类下的用例'.format(cls.__name__)) clear_Envdata_attr() # 清除上个脚本设置的动态属性 cls.count = 0 user,pwd = get_old_phone() res = MyRequest('POST','/futureloan/member/login',{"mobile_phone":user,"pwd":pwd}).send_requests() cls.user_id = jsonpath.jsonpath(res.json(),'$..id')[0] setattr(EnvData,'user_id',cls.user_id) cls.token = jsonpath.jsonpath(res.json(),'$..token')[0]
def setUpClass(cls): logger.info('======== start ============》开始执行{}类下的用例'.format( cls.__name__)) clear_Envdata_attr() cls.count = 0 user, pwd = get_old_phone() res = MyRequest('POST', '/futureloan/member/login', { "mobile_phone": user, 'pwd': pwd }).send_requests() cls.user_id = jsonpath.jsonpath(res.json(), '$..id')[0] cls.token = jsonpath.jsonpath(res.json(), '$..token')[0] setattr(EnvData, 'user_id', cls.user_id) # 初始化余额 db.update_data( 'UPDATE member SET leave_amount=9898.96 WHERE id={}'.format( cls.user_id))
def test_loan(self, case): test_result = None # 前置sql if case['check_sql'] is not None and isinstance( case['check_sql'], str): if re.search(r"(.*?)", case['check_sql']): case['check_sql'] = re_replace(case['check_sql']) logger.info('打印出sql-=============》{}'.format( eval(case['check_sql'])['sql_01'])) loan_id = db.select_one_data( eval(case['check_sql'])['sql_01'])['id'] logger.info("{}".format(loan_id)) expect_line = db.get_count(eval(case['check_sql'])['sql_02']) setattr(EnvData, "loan_id", loan_id)
def extract_data_from_excel(extract_exprs,response_dict): """ 该方法本项目主要应用在业务流上 根据jsonpath提取表示式,从响应结果中匹配出来的数据作为EnvData中的类属性,共所有用例使用 :param extract_exprs:excel中读取出来的提取表达式字符串 :param response_dict:请求之后的响应结果 :return: """ extract_dict =json.loads(extract_exprs) # 将从excel中读取出的提取表达式转换为字典 for key,value in extract_dict.items(): try: res = str(jsonpath.jsonpath(response_dict,value)[0]) # 匹配到数据返回列表 匹配不到返回false except Exception as e: logger.info("对响应结果的替换出现错误") raise e else: if res : setattr(EnvData,key,res)
def re_replace(target,obj=EnvData): """ # 通过字符串正则匹配的方式将excel中读取参数化数据进行替换 真实数据只从2个地方去获取:1个是配置文件当中的DATA区域 。另1个是,EvnData的类属性。 :param target:字典中每个key对应的value :param obj: EnvData类的实例对象 :return: """ p = "#(.*?)#" while re.search(p,target): ret=re.search(p,target) key = ret.group(1) try: value= cnf.read_section_to_dict('DATA')[key] except: try: value = getattr(obj,key) except Exception: logger.info("EnvData类中不存在此【{}】".format(key)) raise target = re.sub(p,str(value),target,count=1) return target
def tearDownClass(cls): logger.info( "------------>结束执行{} 类下的测试用例集 <-----------------".format( cls.__name__))
def tearDownClass(cls) -> None: logger.info('结束执行获取会话用例')
if case['expect_result'] is not None and isinstance( case['expect_result'], str): if re.search(r'#(.*?)#', case['expect_result']): case['expect_result'] = re_replace(case['expect_result'], case['obj']) expect_result = json.loads(case['expect_result']) res = MyRequest(case['method'], case['url'], case['param']).send_requests(self.__class__.token) try: self.assertEqual(expect_result['code'], res.json()['code']) self.assertEqual(expect_result['msg'], res.json()['msg']) test_result = None if case['check_sql'] is not None and case['id'] != 5: logger.info("第{}条用例期望结果{}".format(self.__class__.count, expect_result)) # 获取结果返回结果 final_amount = res.json()['data']['leave_amount'] # 获取提现后数据库中查询的余额 final_db_amount = db.select_one_data( eval(case['check_sql'])['sql_01']) final_db_amount = str( Decimal(final_db_amount['leave_amount']).quantize( Decimal('0.00'))) # 期望结果与接口返回结果比对 self.assertEqual(expect_result['data']['leave_amount'], final_amount) # 期望结果与数据库中查询结果比对 self.assertEqual(float(expect_result['data']['leave_amount']),
def setUp(self) -> None: self.__class__.count += 1 logger.info('当前执行第{}条测试用例'.format(self.__class__.count))
def tearDown(self): logger.info("第>》》》 {} 《《《<条执行用例执行完成".format(self.__class__.count)) logger.info("<" * 50) self.t.close_excel()
def setUpClass(cls) -> None: logger.info('开始执行获取访客会话用例') cls.count = 0
def tearDownClass(cls): logger.info('======== END ============》{}类下的用例已经全部执行完成'.format( cls.__name__))
if hasattr(EnvData, 'admin_member_token') and person_symbol == 0: # 管理员发起请求 actual_result = MyRequest(case['method'], case['url'], case['param']).send_requests( EnvData.admin_member_token) elif hasattr(EnvData, 'token') and person_symbol == 1: # 普通角色发起请求 actual_result = MyRequest(case['method'], case['url'], case['param']).send_requests( EnvData.token) else: actual_result = MyRequest(case['method'], case['url'], case['param']).send_requests() if case['extract_data']: # 响应结果中匹配出来的数据作为EnvData中的类属性,共所有用例使用 extract_data_from_excel(case['extract_data'], actual_result.json()) logger.info('==========EnvData环境类目前的类属性========={}'.format( EnvData.__dict__)) if case['type'] == 'case': try: self.assertEqual(expect_result['code'], actual_result.json()['code']) self.assertEqual(expect_result['msg'], actual_result.json()['msg']) if case['check_sql'] is not None: if len(eval(case['check_sql'])) > 1: self.assertEqual( expect_result['data']['member_id'], actual_result.json()['data']['member_id']) self.assertEqual( expect_result['data']['loan_id'], actual_result.json()['data']['loan_id'])
def setUpClass(cls): logger.info( "------------>开始执行{} 类下的测试用例集 <-----------------".format( cls.__name__)) cls.count = 0 clear_Envdata_attr() # 清理环境类中的类属性
logger.info("{}".format(loan_id)) expect_line = db.get_count(eval(case['check_sql'])['sql_02']) setattr(EnvData, "loan_id", loan_id) if case['param'] is not None and isinstance(case['param'], str): if re.search(r"(.*?)", case["param"]): case["param"] = re_replace(case['param']) if case['expect_result'] is not None and isinstance( case['expect_result'], str): if re.search(r"(.*?)", case['expect_result']): case["expect_result"] = re_replace(case["expect_result"]) expect_result = json.loads(case["expect_result"]) logger.info("*****************用列的期望结果为{}".format(expect_result)) if hasattr(EnvData, "admin_member_token"): actual_result = MyRequest(case['method'], case['url'], case['param']).send_requests( EnvData.admin_member_token) else: actual_result = MyRequest(case['method'], case['url'], case['param']).send_requests() if case['extract_data']: extract_data_from_excel(case['extract_data'], actual_result.json()) try: if case['type'] == 'case': self.assertEqual(expect_result['code'], actual_result.json()['code']) self.assertEqual(expect_result['msg'],
def tearDown(self) -> None: logger.info('第{}条测试用例执行结束'.format(self.__class__.count))
def setUpClass(cls): logger.info('======== start ============》开始执行{}类下的用例'.format( cls.__name__)) clear_Envdata_attr() cls.count = 0
def setUp(self): self.__class__.count += 1 logger.info("---------->开始执行第{}条测试用例-----------------".format( self.__class__.count)) self.t = ReadExcel(load_data_path, sheet_name)
def setUp(self): logger.info(">" * 50) self.__class__.count += 1 logger.info("开始第>》》》 {} 《《《<条执行用例".format(self.__class__.count)) self.t = ReadExcel(load_data_path, sheet_name)
def tearDown(self): self.t.close_excel() logger.info("---------->结束执行第{}条测试用例-----------------".format( self.__class__.count))
def send_requests(self,token=None,cookie=None,**kwargs): # 获取请求头部信息 headers = self.__handle_header(token,**kwargs) # 对excel中url是否带'/'进行兼容处理 url = self.__pre_url () # 对excel中接口所传的字符串类型的字典参数进行json化处理 data=self.__pre_data (token) logger.info ("请求头 -> {}".format (headers)) logger.info ("请求方法 -> {}".format (self.method)) logger.info ("请求体 -> {}".format (data)) # 根据方法进行调用 if self.method.upper() == "POST": try: res = requests.post(url,json=data,headers=headers,cookies=cookie) except Exception: e = logger.exception("调用post封装方法,请求{}地址时出错".format(url)) raise e elif self.method.upper() =='PATCH': try: logger.info("======>>>开始执行patch请求,数据为{} 类型为{}".format(data,type(data))) logger.info("======>>>开始执行patch请求,请求投为为{} 类型为{}".format(headers,type(headers))) res = requests.patch(url,json=data,headers=headers,cookies=cookie) except Exception: e=logger.exception("调用patch封装方法,请求{}地址时出错".format(url)) raise e else: try: res =requests.get(url,params=data,headers=headers,cookies=cookie) except Exception: e = logger.exception ("调用post封装方法,请求{}地址时出错".format (url)) raise e logger.info ("响应状态码 -> {}".format (res.status_code)) logger.info("响应头 -> {}".format(res.headers)) logger.info("请求头为--> {}".format(res.request.headers)) logger.info ("响应体【实际结果】 -> {}".format (res.json())) return res
cls.count = 0 @classmethod def tearDownClass(cls) -> None: logger.info('结束执行获取会话用例') def setUp(self) -> None: self.__class__.count += 1 logger.info('当前执行第{}条测试用例'.format(self.__class__.count)) def tearDown(self) -> None: logger.info('第{}条测试用例执行结束'.format(self.__class__.count)) @data(*datas) def test_chart_by_session(self, case): if case['param'] is not None and isinstance(case['param'], str): if re.search(r'#(.*?)#', case['param']): case['param'] = re_replace(case['param']) expect_result = json.loads(case['expect_result']) logger.info('请求参数为{}'.format(case['param'])) res = HandleYunWenRequest(case['method'], case['url'], case['param']).send_request() try: self.assertEqual(res.json()['code'], expect_result['code']) self.assertEqual(res.json()['codeDesc'], expect_result['codeDesc']) except AssertionError as e: logger.exception("第{}条用例执行-->【失败】".format(self.__class__.count)) raise e else: logger.info(("第{}条用例执行-->【成功】".format(self.__class__.count)))