def test_login(info): all_data = json.dumps(info) # 替换 info = Handler.replace_data(all_data) print(info) # 转化成字典 info = json.loads(info) Handler.new_phone = Handler.generate_new_phone() if '*phone*' in info['json']: mobile_phone = Handler().generate_new_phone() info['json'] = info['json'].replace('*phone*', mobile_phone) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], headers=json.loads(info['headers']), json=json.loads(info['json'])) res_body = res.json() try: assert res_body['code'] == info['expected'] except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: #excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('login', str(res_body), row=int(info['case_id'] + 1), column=9) if res_body['code'] == info['expected']: excel.write('login', True, row=int(info['case_id'] + 1), column=8) else: excel.write('login', False, row=int(info['case_id'] + 1), column=8)
def test_login(self, case_info, driver): login_page = PageLogin(driver) if 1 <= case_info['case_id'] <= 11: after_login = login_page.login_fail( eval(case_info['data'])['mobile_phone'], eval(case_info['data'])['pwd']) elif case_info['case_id'] == 12: after_login = login_page.login_success( eval(case_info['data'])['mobile_phone'], eval(case_info['data'])['pwd']) try: if 1 <= case_info['case_id'] <= 7: assert after_login.get_msg_incorrect_phone( ) == case_info['expected_resp'] elif case_info['case_id'] == 8: assert after_login.get_msg_none_phone( ) == case_info['expected_resp'] elif case_info['case_id'] in (9, 10): assert after_login.get_msg_error( ) == case_info['expected_resp'] elif case_info['case_id'] == 11: assert after_login.get_msg_none_pwd( ) == case_info['expected_resp'] elif case_info['case_id'] == 12: assert after_login.get_msg_account( ) == case_info['expected_resp'] Handler.success_case('login', len(case_info), case_info['case_id'], __name__) except: Handler.fail_case('login', len(case_info), case_info['case_id'], __name__) raise
def test_login(datas): if '#new_phone#' in datas["data"]: phone = Handler.generate_new_phone() datas["data"] = datas["data"].replace('#new_phone#', phone) if '*phone*' in datas['data']: new_phone = Handler.generate_new_phone() datas['data'] = datas['data'].replace('*phone*', new_phone) datas = json.dumps(datas) # 替换 datas = Handler.replace_data(datas) # 转化成字典 datas = json.loads(datas) resp = requests.request(method=datas['method'], url=Handler.env_config["envurl"] + datas['path'], headers=json.loads(datas['headers']), json=json.loads(datas['data'])) try: assert resp.json()['msg'] == datas['expected'] except AssertionError as e: logger.info("msg不正确,{}测试失败{}".format(datas["title"], e)) raise e # 设置Handler对应的属性。 if datas['extractor']: extrators = json.loads(datas['extractor']) for prop, jsonpath_exp in extrators.items(): # value = 'token' value = jsonpath(resp.json(), jsonpath_exp)[0] # setastr(Handler, "loan_token", "yfowepfpwefwoefowf" setattr(Handler, prop, value)
def test_condition(info): if "#register_name#" in info['url']: register_name = Handler.user_config['user']['register_name'] info['url'] = info['url'].replace('#register_name#', register_name) if "#unregister_name#" in info['url']: unregister_name = Handler.generate_random_str(6) info['url'] = info['url'].replace('#unregister_name#', unregister_name) if "#register_email#" in info['url']: sql = 'select email from auth_user limit 1' result = Handler.db.query(sql)['email'] info['url'] = info['url'].replace('#register_email#', result) if "#unregister_email#" in info['url']: unregister_email = Handler.generate_random_str(9) unregister_email = unregister_email + "@qq.com" info['url'] = info['url'].replace('#unregister_email#', unregister_email) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url']) res_body = json.dumps(res.text) #assert json.loads(res.text)['count'] == info['expected'] try: assert json.loads(res.text)['count'] == info['expected'] except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: # excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('condition', str(res.text), row=int(info['case_id'] + 1), column=8) if json.loads(res.text)['count'] == info['expected']: excel.write('condition', True, row=int(info['case_id'] + 1), column=7) else: excel.write('condition', False, row=int(info['case_id'] + 1), column=7)
def setUp(self): # 每条用例执行之前,向投资账户预充值 10000 Handler.recharge_investor(10000) # 每条用例执行之前,先获取投资账户投资前的余额 self.leaveamount_before = MysqlHandlerMid().query(self.sql_leaveamount)['leave_amount'] # 每条用例执行之前,先查询投资账户投资/流水/回款记录条数 self.invest_count_before = MysqlHandlerMid().query(self.sql_count_invest)['count(id)'] self.financelog_count_before = MysqlHandlerMid().query(self.sql_count_financelog)['count(id)'] self.repayment_count_before = MysqlHandlerMid().query(self.sql_count_repayment)['count(r.id)'] # 每条用例执行之前,先进行加标 Handler.add()
def test_invest(self, case_info, login): actual = login.into_invest_list().invest( eval(case_info['data'])['amount']).get_msg_success_invest() try: assert actual == eval(case_info['expected_resp']) Handler.success_case('invest', len(case_info), case_info['case_id'], __name__) except: Handler.fail_case('invest', len(case_info), case_info['case_id'], __name__) raise
def test_recharge(self, data_item): logger.info('正在执行{}用例第{}条>>>'.format(data_item["interface"], data_item["case_id"])) data_item["headers"] = even_data.data_replace(data_item["headers"]) data_item["data"] = even_data.data_replace(data_item["data"]) db = Handler.db_class() sql = "select leave_amount from futureloan.member where id={};".format( even_data.member_id) # 访问接口前获取充值前的余额 before_amount = db.query(sql)["leave_amount"] db.close() # print(type(before_amount),before_amount) # print(type(amount),amount) exp_res = json.loads(data_item['expected_result']) act_res = Response(url_header + data_item["url"], data_item["method"]).get_response( headers=json.loads(data_item["headers"]), json=json.loads(data_item["data"])) # print(act_res) try: for k, v in exp_res.items(): self.assertTrue(act_res[k] == v) if act_res['code'] == 0: logger.info('充值成功!') amount = json.loads(data_item['data'])["amount"] # 校验响应中的数据和期望数据一致 self.assertTrue( Decimal(str(jsonpath(act_res, "$..leave_amount")[0])) == Decimal(str(amount)) + before_amount) logger.info('响应数据中余额与期望金额一致。') db = Handler.db_class() leave_amount = db.query(sql)["leave_amount"] db.close() # print(type(leave_amount),leave_amount) # 校验数据库的数据与期望一致 self.assertTrue(leave_amount == Decimal(str(amount)) + before_amount) logger.info('数据库会员{}余额与期望金额一致'.format(even_data.member_id)) logger.info('用例{}通过。'.format(data_item["case_id"])) # 测试结果回写到excel Handler.excel.data_write('recharge', data_item["case_id"] + 1, 9, "pass") except AssertionError as e: logger.error('用例{}不通过!!'.format(data_item["case_id"])) Handler.excel.data_write('recharge', data_item["case_id"] + 1, 9, "fail") raise e
def test_add(self, case_info): method = case_info['method'] url = host + case_info['url'] headers = Handler().replace_data(case_info['headers']) headers = eval(headers) data = Handler().replace_data(case_info['data']) data = eval(data) expected_resp = eval(case_info['expected_resp']) actual_resp = visit_api(method, url, headers, json=data) bid_after = MysqlHandlerMid().query(self.sql)['count(*)'] try: for k, v in expected_resp.items(): self.assertEqual(actual_resp[k], v) if actual_resp['code'] == 0: self.assertTrue(bid_after == self.bid_before + 1) bid_info = MysqlHandlerMid().query( 'select * from futureloan.loan where member_id = {} order by create_time desc;' .format(Handler.borrower_id)) self.assertTrue(bid_info['member_id'], Handler.borrower_id) self.assertEqual(bid_info['title'], data['title']) self.assertEqual(bid_info['amount'], Decimal(str(data['amount']))) self.assertEqual(bid_info['loan_rate'], Decimal(str(data['loan_rate']))) self.assertEqual(bid_info['loan_term'], data['loan_term']) self.assertEqual(bid_info['loan_date_type'], data['loan_date_type']) # self.assertEqual(bid_info['bidding_days'], data['bidding_days']) self.assertTrue( int(str(datetime.now()).split(':')[1]) - int(str(bid_info['create_time']).split(':')[1]) <= 1) self.assertFalse(bid_info['bidding_start_time']) self.assertFalse(bid_info['full_time']) self.assertTrue(bid_info['status'] == 1) else: self.assertEqual(self.bid_before, bid_after) excel.write_data('add', case_info['case_id'] + 1, 8, '通过') logger.info('第 {} 条用例通过'.format(case_info['case_id'])) except (AssertionError, KeyError) as e: excel.write_data('add', case_info['case_id'] + 1, 8, '不通过') logger.error('第 {} 条用例不通过'.format(case_info['case_id'])) raise e
def test_recharge(self, case_info): method = case_info['method'] url = host + case_info['url'] headers = Handler().replace_data(case_info['headers']) headers = eval(headers) data = Handler().replace_data(case_info['data']) data = eval(data) expected_resp = eval(case_info['expected_resp']) actual_resp = visit_api(method, url, headers, json=data) leaveamount_after = MysqlHandlerMid().query(self.sql)['leave_amount'] try: for k, v in expected_resp.items(): self.assertEqual(actual_resp[k], v) if actual_resp['code'] == 0: self.assertTrue( self.leaveamount_before + Decimal(str(data['amount'])) == leaveamount_after) self.assertTrue(self.leaveamount_before + Decimal(str(data['amount'])) == Decimal( str(actual_resp['data']['leave_amount']))) query_data = MysqlHandlerMid().query( 'select * from futureloan.financelog where income_member_id = {} order by create_time desc;' .format(Handler.investor_id)) self.assertTrue(query_data) self.assertEqual(query_data['income_member_id'], Handler.investor_id) self.assertEqual(query_data['amount'], Decimal(str(data['amount']))) self.assertTrue(self.leaveamount_before + Decimal(str(data['amount'])) == query_data['income_member_money']) self.assertTrue(query_data['status'] == 1) self.assertTrue( int(str(datetime.now()).split(':')[1]) - int(str(query_data['create_time']).split(':')[1]) <= 1) else: # 异常用例,需查库验证,测试账户充值前后余额保持不变 self.assertEqual(self.leaveamount_before, leaveamount_after) excel.write_data('recharge', case_info['case_id'] + 1, 8, '通过') logger.info('第 {} 条用例通过'.format(case_info['case_id'])) except (AssertionError, KeyError) as e: excel.write_data('recharge', case_info['case_id'] + 1, 8, '不通过') logger.error('第 {} 条用例不通过'.format(case_info['case_id'])) raise e
def add_cases(add_interface): headers = {"Authorization": login["token"]} data = { "name": "#case_name#", "interface": { "pid": "#project_id#", "iid": "#interface_id#" }, "include": { "config": 1, "testcases": [1, 2] }, "autor": "可优", "request": "请求数据" } data = str(data) if "#case_name#" in data: cases_name = Handler.generate_random_str(6) data = data.replace('#case_name#', cases_name) if "#project_id#" in data: project_id = add_projects['project_id'] data = data.replace('#project_id#', project_id) if '#interface_id#' in data: interface_id = add_interface['interface_id'] data = data.replace('#interface_id#', interface_id) res = requests.request(method='POST', url=Handler.yaml_config['host'] + "/testcases/", headers=headers, json=eval(data)) res_body = json.loads(res.text) project_id = jsonpath(res_body, '$..id')[0] return project_id
def test_withdraw(datas): datas = json.dumps(datas) # 替换 datas = Handler.replace_data(datas) # 转化成字典 datas = json.loads(datas) if json.loads(datas['expected'])['code'] == 1002: datas['data'] = datas['data'].replace( str(json.loads(datas['data'])['amount']), str(json.loads(datas['data'])['amount'] + 1)) money_before = Decimal(0) if json.loads(datas['expected'])['code'] in ( 0, 1002) and 'member_id' in datas['data']: sql = 'select leave_amount from member where id={}'.format( json.loads(datas['data'])['member_id']) result = Handler.db_class.query(sql, one=True) money_before = Decimal(result['leave_amount']) logger.info("充值前账号金额:{}".format(money_before)) resp = requests.request(method=datas['method'], url=Handler.env_config["envurl"] + datas['path'], headers=json.loads(datas['headers']), json=json.loads(datas['data'])) # 断言code是否正确 try: assert resp.json()['code'] == json.loads(datas['expected'])['code'] except AssertionError as e: logger.info("code不正确,{}测试失败{}".format(datas["title"], e)) raise e # 接口返回值断言提现前后账户金额是否正确 # try: # if resp.json()['code'] == 0 and 'member_id' in datas['data']: # assert json.loads(datas['data'])['amount'] - json.loads(datas['data'])['amount'] == resp.json()['data']['leave_amount'] # 账户提现前金额 - 提现金额= 账户提现后金额 # logger.info("提现前金额{} - 提现金额{} == 提现后金额{}".format(datas['extractor']['money'],datas['data']['amount'],resp.json()['data']['leave_amount'])) # except AssertionError as err: # logger.info("提现前后账户金额不正确,{}测试失败{}".format(datas["title"],err)) # raise err # 数据库查询断言提现前后账户金额是否正确 if resp.json()['code'] == 0 and 'member_id' in datas['data']: sql = 'select leave_amount from member where id={}'.format( json.loads(datas['data'])['member_id']) result = Handler.db_class.query(sql, one=True) money_after = result['leave_amount'] money = Decimal(json.loads(datas['data'])['amount']) assert money_before - money == money_after logger.info("提现前账号金额{},提现金额{},提现后账户总金额{}".format( money_before, money, money_after)) # 设置Handler对应的属性。 if datas['extractor']: extrators = json.loads(datas['extractor']) for prop, jsonpath_exp in extrators.items(): value = jsonpath(resp.json(), jsonpath_exp)[0] setattr(Handler, prop, value)
def test_add_projects(info, login): if "#token#" in info['headers']: info['headers'] = info['headers'].replace('#token#', login['token']) if "#project_name#" in info['json']: project_name = Handler.generate_random_str(6) info['json'] = info['json'].replace('#project_name#', project_name) if "*project_name*" in info['json']: project_name = Handler.user_config['user']['project_name'] info['json'] = info['json'].replace('*project_name*', project_name) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], headers=json.loads(info['headers']), json=json.loads(info['json'])) #assert res.status_code == info['expected'] try: assert res.status_code == info['expected'] except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: # excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('add', str(res.text), row=int(info['case_id'] + 1), column=9) if res.status_code == info['expected']: excel.write('add', True, row=int(info['case_id'] + 1), column=8) else: excel.write('add', False, row=int(info['case_id'] + 1), column=8)
def test_login(info): if "*username*" in info['json']: username = Handler.generate_random_str(6) info['json'] = info['json'].replace('*username*', username) if "#username#" in info['json']: username = Handler.user_config['user']['login_user'] info['json'] = info['json'].replace('#username#', username) if "#pwd#" in info['json']: pwd = Handler.user_config['user']['password'] info['json'] = info['json'].replace('#pwd#', pwd) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], json=json.loads(info['json'])) #assert res.status_code == info['expected'] try: assert res.status_code == info['expected'] except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: # excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('login', str(res.text), row=int(info['case_id'] + 1), column=8) if res.status_code == info['expected']: excel.write('login', True, row=int(info['case_id'] + 1), column=7) else: excel.write('login', False, row=int(info['case_id'] + 1), column=7)
def random_phone(self): """随机生成一个动态的手机号码。 注册成功的用例当中,需要一个没有被注册过的手机号。需要查询数据库。 """ # 第一步,随机生成手机号 # 前面 2 位 13 import random while True: phone = "13" for i in range(9): num = random.randint(0, 9) phone += str(num) print(phone) # 查询数据库,如果数据库当中有这个手机号,再次生成,while, # from middleware.handler import MysqlHandlerMid # db = MysqlHandlerMid() db = Handler.db_mysql_class() sql_code = "SELECT * FROM futureloan.member WHERE mobile_phone={};".format( phone) phone_record = db.query(sql_code) if not phone_record: db.close() return phone db.close()
def test_loan_list(data): #获取Excel中的数据,并将数据转成json格式的字符串 data = json.dumps(data) #将Excel中的#str#调用方法替换 data = Handler.replace_data(string=data) #再将data格式的字符串转为字典格式 data = json.loads(data) headers = json.loads(data['headers']) expected = json.loads(data['expected']) json_data = json.loads(data['json']) reponse = requests.request(method=data['method'], url=Handler.config_yaml['host'] + data['url'], headers=headers, json=json_data) result = reponse.json() try: for key, value in expected.items(): #key=code,value=0 assert jsonpath(result, key)[0] == value if data['extractor']: extractors = json.loads(data['extractor']) for handle_pro, jsonpath_value in extractors.items(): values = jsonpath(result, jsonpath_value)[0] setattr(Handler, handle_pro, values) Handler.logger.info("用例执行成功,请求头为{},请求体为{},响应为{}".format( headers, json_data, result)) except AssertionError as err: Handler.logger.error("用例执行失败{},请求头为{},请求体为{},响应为{}".format( err, headers, json_data, result)) raise err finally: Handler.excel.write_excel(sheet_name='loanlist', colnum=9, row=int(data['case_id']) + 1, data=str(result))
def send_requests(datas): method = datas["method"] url = Handler.env_config["envurl"] + datas["path"] headers = datas["headers"] # 将字符串转换为字典 data = datas["body"] if '#new_phone#' in data: phone = Handler.generate_new_phone() data = data.replace('#new_phone#', phone) logger.info(data) resp = {} # 接收返回数据 res = "" try: res = requests.request(method, url, headers=eval(headers), json=eval(data), verify=False) resp = res.json() resp["StatusCode"] = str(res.status_code) # 状态码转成str resp["time"] = str(res.elapsed.total_seconds()) # 接口请求时间转str if resp["StatusCode"] != "200": resp["error"] = resp["text"] resp["return_code"] = str(res.status_code) else: resp["error"] = "" except Exception as msg: resp["msg"] = str(msg) resp["text"] = res.content.decode("utf-8") # 打印错误返回信息以文本形式输出 resp["return_code"] = "error" resp["rowNum"] = datas["rowNum"] logger.info("resp{}".format(resp)) return resp
def test_withdraw(datas): datas = json.dumps(datas) # 替换 datas = Handler.replace_data(datas) # 转化成字典 datas = json.loads(datas) resp = requests.request(method=datas['method'], url=Handler.env_config["envurl"] + datas['path'], headers=json.loads(datas['headers']), json=json.loads(datas['data'])) # 断言code是否正确 try: assert resp.json()['code'] == datas['expected'] except AssertionError as e: logger.info("code不正确,{}测试失败{}".format(datas["title"], e)) raise e # 设置Handler对应的属性。 if datas['extractor']: extrators = json.loads(datas['extractor']) for prop, jsonpath_exp in extrators.items(): value = jsonpath(resp.json(), jsonpath_exp)[0] setattr(Handler, prop, value)
def test_invest(info): """投资接口""" # 保证替换成功,excel当中的 #invest_phone# 必须和属性名保持一致 # json_data = info['json'] # json_data = Handler.replace_data(json_data) # print(json_data) # info转化成json字符串 all_data = json.dumps(info) # 替换 info = Handler.replace_data(all_data) print(info) # 转化成字典 info = json.loads(info) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], headers=json.loads(info['headers']), json=json.loads(info['json'])) print(res.json()) assert res.json()['code'] == info['expected'] # 设置Handler对应的属性 if info['extractor']: extrators = json.loads(info['extractor']) for prop, jsonpath_exp in extrators.items(): # value = 'token' value = jsonpath(res.json(), jsonpath_exp)[0] # setattr(Handler,"laon_token","sadsadsfdgt") setattr(Handler, prop, value)
def test_register_01(test_info): Handler.new_phone = Handler.generate_new_phone() # 字典取值 actual_url = test_info['url'] actual_method = test_info['method'] actual_json = test_info['json'] actual_headers = test_info['headers'] expected = test_info['expected'] # 读取 test_info['json'], # 如果存在 # new_phone, if '#new_phone#' in actual_json: # 生成手机号码 13789456789 generate_new_phone mobile_phone = Handler.generate_new_phone() # 替换为new_phone actual_json = actual_json.replace('#new_phone#', mobile_phone) # 通过这种方法,密码不一定知道,最好写入白名单 if '#exist_phone#' in actual_json: pass # 传入都是字符串 res = requests.request(method=actual_method, url=Handler.yaml_config['host'] + actual_url, headers=eval(actual_headers), json=eval(actual_json)) res_body = res.json() print(res_body) try: assert res_body['code'] == expected except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: # excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('register', str(res_body), row=int(test_info['case_id']) + 1, column=9) if res_body['code'] == expected: excel.write('register', 'True', row=int(test_info['case_id']) + 1, column=8) else: excel.write('register', 'False', row=int(test_info['case_id']) + 1, column=8)
def send_mail(report_path, project_name): '''发送邮件''' with open(report_path, 'rb') as f: # 读取测试报告正文,作为邮件正文 mail_body = f.read() now = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 获取邮箱服务地址 hd = Handler() smtp_server = hd.yaml['email']['smtp_server'] try: # 启动163邮箱服务 smtp = smtplib.SMTP(smtp_server, 25) # 获取发件人信息 sender = hd.yaml['email']['smtp_sender'] # 发件人邮箱授权码 password = hd.yaml['email']['smtp_sender_password'] # 接收人邮箱 receiver = hd.yaml['email']['smtp_receiver'] # 登陆 smtp.login(sender, password) msg = MIMEMultipart() # 编写html类型的邮件正文,MIMEtext() 用于定义邮件正文 # 发送 text = MIMEText(mail_body, 'html', 'utf-8') # 定义邮件正文标题 text['Subject'] = Header(project_name + '接口测试报告', 'utf-8') msg.attach(text) # 发送附件 # Header 用于定义邮件主题,主题加上时间,防止主题重复导致发送失败 msg['Subject'] = Header('【测试用例执行结果】:' + project_name + '测试报告' + now, 'utf-8') msg_file = MIMEText(mail_body, 'html', 'utf-8') # 构造MIMEBase对象做为文件附件内容并附加到根容器 msg_file['Content-Type'] = 'application/octet-stream' msg_file['Content-Disposition'] = 'attachment; file_name="测试报告.html"' msg.attach(msg_file) # 定义发件人 msg['From'] = sender # 定义收件人 msg['To'] = receiver smtp.sendmail(msg['From'], msg['To'].split(';'), msg.as_string()) smtp.quit() return True except smtplib.SMTPException as e: print(str(e)) return False
def test_add(self, data_item): logger.info('正在执行{}用例第{}条>>>'.format(data_item["interface"], data_item["case_id"])) data_item['headers'] = even_data.data_replace(data_item['headers']) data_item['data'] = even_data.data_replace(data_item['data']) sql = "SELECT * FROM futureloan.loan WHERE member_id={};".format( even_data.member_id) # 访问接口前获取loan的记录条数 db = Handler.db_class() before_loan_num = len(db.query(sql, one=False)) db.close() # print(type(before_amount),before_amount) # print(type(amount),amount) exp_res = json.loads(data_item['expected_result']) act_res = Response(url_header + data_item["url"], data_item["method"]).get_response( headers=json.loads(data_item["headers"]), json=json.loads(data_item["data"])) # print(act_res) try: for k, v in exp_res.items(): self.assertTrue(act_res[k] == v) if act_res['code'] == 0: logger.info('项目添加成功!') # 访问接口后获取loan的记录条数 db = Handler.db_class() after_loan_num = len(db.query(sql, one=False)) db.close() # print(type(leave_amount),leave_amount) # 校验数据库的数据与期望一致 self.assertTrue(after_loan_num == before_loan_num + 1) logger.info('数据库新增一条记录') logger.info('用例{}通过。'.format(data_item["case_id"])) # 测试结果回写到excel Handler.excel.data_write('add', data_item["case_id"] + 1, 9, "pass") except AssertionError as e: logger.error('用例{}不通过!!'.format(data_item["case_id"])) # print(act_res, exp_res) Handler.excel.data_write('add', data_item["case_id"] + 1, 9, "fail") raise e
def test_register_01(test_info): # actual_url = 'http://api.lemonban.com/futureloan/member/register' # actual_method = 'POST' # actual_json = {"mobile_phone":"","pwd":""} # actual_headers = {"X-Lemonban-Media-Type":"lemonban.v2"} # expected = 2 # 元组要控制索引 # actual_url = test_info[3] # actual_method = test_info[6] # actual_json = test_info[4] # actual_headers = test_info[5] # expected = test_info[7] # 字典取值 actual_url = test_info['url'] actual_method = test_info['method'] actual_json = test_info['json'] actual_headers = test_info['headers'] expected = test_info['expected'] # 读取 test_info['json'], # 如果存在 # new_phone, if '#new_phone#' in actual_json: # 生成手机号码 13789456789 generate_new_phone mobile_phone = Handler().generate_new_phone() # 替换为new_phone actual_json = actual_json.replace('#new_phone#', mobile_phone) # 通过这种方法,密码不一定知道,最好写入白名单 if '#exist_phone#' in actual_json: pass # 传入都是字符串 res = requests.request(method=actual_method, url=Handler.yaml_config['host'] + actual_url, headers=eval(actual_headers), json=eval(actual_json)) res_body = res.json() print(res_body) try: assert res_body['code'] == expected except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: # excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('register', str(res_body), row=int(test_info['case_id']) + 1, column=9) if res_body['code'] == expected: excel.write('register', 'True', row=int(test_info['case_id']) + 1, column=8) else: excel.write('register', 'False', row=int(test_info['case_id']) + 1, column=8)
def test_register_01(info): if "#new_username#" in info['json']: username = Handler.generate_random_str(6) info['json'] = info['json'].replace('#new_username#', username) if "#old_username#" in info['json']: username = Handler.user_config['user']['login_user'] info['json'] = info['json'].replace('#old_username#', username) if "#email#" in info['json']: email = Handler.generate_random_str(9) email = email + "@qq.com" info['json'] = info['json'].replace('#email#', email) if "*email*" in info['json']: sql = 'select email from auth_user limit 1' email = Handler.db.query(sql)['email'] #email = email + "@qq.com" #info['url'] = info['url'].replace('#register_email#', result) info['json'] = info['json'].replace('*email*', email) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], json=json.loads(info['json'])) #assert res.status_code ==info['expected'] try: assert res.status_code == info['expected'] except AssertionError as e: Handler.logger.error("用例失败:{}".format(e)) raise e finally: # excel = ExcelHandler(excel_file) excel = Handler.excel excel.write('register', str(res.text), row=int(info['case_id'] + 1), column=8) if res.status_code == info['expected']: excel.write('register', True, row=int(info['case_id'] + 1), column=7) else: excel.write('register', False, row=int(info['case_id'] + 1), column=7)
def test_condition(info): if "#register_name#" in info['url']: register_name = Handler.user_config['user']['register_name'] info['url'] = info['url'].replace('#register_name#', register_name) if "#unregister_name#" in info['url']: unregister_name = Handler.generate_random_str(6) info['url'] = info['url'].replace('#unregister_name#', unregister_name) if "#register_email#" in info['url']: register_email = Handler.user_config['user']['register_email'] info['url'] = info['url'].replace('#register_email#', register_email) if "#unregister_email#" in info['url']: unregister_email = Handler.generate_random_str(9) unregister_email = unregister_email + "@qq.com" info['url'] = info['url'].replace('#unregister_email#', unregister_email) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url']) res_body = json.dumps(res.text) assert json.loads(res.text)['count'] == info['expected']
def test_register_01(info): if "#new_username#" in info['json']: username = Handler.generate_random_str(6) info['json'] = info['json'].replace('#new_username#', username) if "#old_username#" in info['json']: username = Handler.user_config['user']['login_user'] info['json'] = info['json'].replace('#old_username#', username) if "#email#" in info['json']: email = Handler.generate_random_str(9) email = email + "@qq.com" info['json'] = info['json'].replace('#email#', email) if "*email*" in info['json']: email = Handler.user_config['user']['register_email'] email = email + "@qq.com" info['json'] = info['json'].replace('*email*', email) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], json=json.loads(info['json'])) assert res.status_code == info['expected']
def test_audit(self, case_info): method = case_info['method'] url = host + case_info['url'] headers = Handler().replace_data(case_info['headers']) headers = eval(headers) data = Handler().replace_data(case_info['data']) data = eval(data) sql = 'select `status` from futureloan.loan where id = {};'.format( data['loan_id']) if '*' not in case_info['title']: bid_info_before = MysqlHandlerMid().query(sql) expected_resp = eval(case_info['expected_resp']) actual_resp = visit_api(method, url, headers, json=data) try: for k, v in expected_resp.items(): self.assertEqual(actual_resp[k], v) if actual_resp['code'] == 0: bid_info = MysqlHandlerMid().query(sql) if data['approved_or_not'] is True: self.assertTrue(bid_info['status'] == 2) elif data['approved_or_not'] is False: self.assertTrue(bid_info['status'] == 5) else: if case_info['case_id'] in (5, 6, 7, 8, 9, 10): bid_info_after = MysqlHandlerMid().query(sql) self.assertEqual(bid_info_after['status'], bid_info_before['status']) excel.write_data('audit', case_info['case_id'] + 1, 8, '通过') logger.info('第{}条用例通过'.format(case_info['case_id'])) except (AssertionError, KeyError) as e: excel.write_data('audit', case_info['case_id'] + 1, 8, '不通过') logger.error('第{}条用例不通过'.format(case_info['case_id'])) raise e
def test_register(self, case_info): method = case_info['method'] url = host + case_info['url'] headers = eval(case_info['headers']) data = Handler().replace_data(case_info['data']) data = eval(data) expected_resp = eval(case_info['expected_resp']) actual_resp = visit_api(method, url, headers, json=data) try: for k, v in expected_resp.items(): self.assertEqual(actual_resp[k], v) if actual_resp['code'] == 0: # 使用封装默认的 fetchall 查询,查询到则结果为列表套字典,查询不到则结果为空元组 query_normal = MysqlHandlerMid().query( 'select * from futureloan.member where mobile_phone = "{}";' .format(data['mobile_phone']), False) self.assertTrue( query_normal) # 此条断言通过表示:查询到了手机号为 XXX 的记录,但是否仅有一条不能确定 self.assertTrue( len(query_normal) == 1) # 通过列表长度为 1,确认手机号为 XXX 的记录仅有一条 self.assertTrue(query_normal[0]['leave_amount'] == 0) self.assertTrue( int(str(datetime.now()).split(':')[1]) - int(str(query_normal[0]['reg_time']).split(':')[1]) <= 1) # 注册时间验证 if '*' in case_info['title']: # 用例 3 额外标记,进行不同断言 self.assertTrue( query_normal[0]['type'] == 1) # 不传 type,是否为普通会员 self.assertTrue(query_normal[0]['reg_name'] == '小柠檬') # 不传 reg_name,是否注册名为小柠檬 else: self.assertEqual(query_normal[0]['type'], data['type']) # 用例 1、2 self.assertEqual(query_normal[0]['reg_name'], data['reg_name']) # 用例 1、2 else: # 异常用例 if '$' not in case_info[ 'title']: # 除重复注册、手机号为空外的异常用例,需查库验证会不会异常插入到数据库 query_exceptional = MysqlHandlerMid().query( 'SELECT * from futureloan.member WHERE mobile_phone = "{}";' .format(data['mobile_phone']), False) self.assertFalse(query_exceptional) excel.write_data('register', case_info['case_id'] + 1, 8, '通过') logger.info('第 {} 条用例通过'.format(case_info['case_id'])) # 添加 KeyError 异常处理:当接口返回缺少应有字段,也代表用例不能通过 except (AssertionError, KeyError) as e: excel.write_data('register', case_info['case_id'] + 1, 8, '不通过') logger.error('第 {} 条用例不通过'.format(case_info['case_id'])) raise e
def get_random_phone(): while True: phone = '1' + random.choice(['3', '8']) for i in range(0, 9): phone += str(random.randint(0, 9)) db = Handler.db_class() sql = "SELECT * FROM futureloan.member WHERE mobile_phone={};".format( phone) sql_res = db.query(sql) if not sql_res: db.close() return phone db.close()
def add_projects(login): headers = {"Authorization":login["token"]} data = {"name":"#project_name#","leader":"yuze","tester":"zc","programmer":"keyou","publish_app":"huawei","desc":"desc"} data = str(data) if "#project_name#" in data: project_name = Handler.generate_random_str(6) data = data.replace('#project_name#',project_name) res = requests.request(method='POST', url=Handler.yaml_config['host'] + "/projects/", headers=headers, json=eval(data)) res_body = json.loads(res.text) project_id = jsonpath(res_body,'$..id')[0] return {"project_id":project_id}
def test_login(info): if "*username*" in info['json']: username = Handler.generate_random_str(6) info['json'] = info['json'].replace('*username*', username) if "#username#" in info['json']: username = Handler.user_config['user']['login_user'] info['json'] = info['json'].replace('#username#', username) if "#pwd#" in info['json']: pwd = Handler.user_config['user']['password'] info['json'] = info['json'].replace('#pwd#', pwd) res = requests.request(method=info['method'], url=Handler.yaml_config['host'] + info['url'], json=json.loads(info['json'])) assert res.status_code == info['expected']