class WithdrawTestCase(unittest.TestCase): filename = os.path.join(DATA_DIR, 'cases.xlsx') excel = Handler_Excel(filename, 'withdraw') cases = excel.read_data() db = HandlerMysql() @classmethod def setUpClass(cls): LoginBase.login() @data(*cases) def test_withdraw(self, case): url = conf.get('env', 'base_url') + case['url'] method = case['method'] # case['data']=case['data'].replace('#member_id#',self.member_id) # data=eval() data = eval(replace_data(case['data'])) headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') expected = eval(case['expected']) row = case['case_id'] + 1 if case['check_sql']: case['check_sql'] = replace_data(case['check_sql']) res_before = self.db.find_one(case['check_sql']) money_before = res_before['leave_amount'] print('提现前金额', money_before) response1 = request(method=method, url=url, headers=headers, json=data) res1 = response1.json() print('预期结果', expected) print('实际结果', res1) if case['check_sql']: case['check_sql'] = replace_data(case['check_sql']) res_before = self.db.find_one(case['check_sql']) money_after = res_before['leave_amount'] print('提现后金额', money_after) try: self.assertEqual(expected['code'], res1['code']) self.assertEqual(expected['msg'], res1['msg']) if case['check_sql']: self.assertEqual(decimal.Decimal(str(data['amount'])), money_before - money_after) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) self.excel.write_data(row=row, column=8, value='fail') log.debug('预期结果', expected) log.debug('实际结果', res1) raise e else: log.info('用例----{}----执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='pass')
class LoginTestCase(unittest.TestCase): excel=Handler_Excel(filename,'login') cases=excel.read_data() @data(*cases) def test_login(self,case): method=case['method'] url=conf.get('env','base_url')+(case['url']) headers=eval(conf.get('env','headers')) data=eval(case['data']) expected=eval(case['expected']) row=case['case_id']+1 response=request(method=method,url=url,headers=headers,json=data) res=response.json() # print(res) print('预期结果',expected) print('实际结果',res) try: self.assertEqual(res['code'],expected['code']) self.assertEqual(res['msg'],expected['msg']) except AssertionError as e: log.error('用例--{}--执行不通过'.format(case['title'])) log.exception(e) log.debug('预期结果:{}'.format(expected)) log.debug('实际结果:{}'.format(res)) self.excel.write_data(row=row,column=8,value='fail') raise e else: self.excel.write_data(row=row, column=8, value='pass') log.info('用例--{}--执行通过'.format(case['title']))
class UpdateTestCase(unittest.TestCase): excel = Handler_Excel(os.path.join(DATA_DIR, 'cases.xlsx'), 'update') cases = excel.read_data() db = HandlerMysql() @classmethod def setUpClass(cls): LoginBase.login() # url=conf.get('env','base_url')+'/member/login' # headers=eval(conf.get('env','headers')) # data1={'mobile_phone':eval(conf.get('test_data','phone')), # 'pwd':conf.get('test_data','pwd') # } # # response1=request(method='POST',json=data1,url=url,headers=headers) # res1=response1.json() # cls.member_id=str(jsonpath(res1,'$..id')[0]) # cls.token='Bearer' + ' ' +jsonpath(res1,'$..token')[0] # print(member_id) # print(token) @data(*cases) def test_update(self, case): method = case['method'] url = conf.get('env', 'base_url') + case['url'] headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') expected = eval(case['expected']) row = case['case_id'] + 1 if '#member_id#' in case['data']: # case['data']=case['data'].replace('#member_id#',self.member_id) data = eval(replace_data(case['data'])) response2 = request(method=method, json=data, url=url, headers=headers) res2 = response2.json() print('预期结果', expected) print('实际结果', res2) # # try: self.assertEqual(res2['code'], expected['code']) self.assertEqual(res2['msg'], expected['msg']) if case['check_sql']: sql = replace_data(case['check_sql']) reg_name1 = self.db.find_one(sql)['reg_name'] self.assertEqual(reg_name1, data['reg_name']) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) self.excel.write_data(row=row, column=8, value='不通过') log.debug('预期结果', expected) log.debug('实际结果', res2) raise e else: log.info('测试用例----{}——----'.format(case['title'])) self.excel.write_data(row=row, column=8, value='通过')
class LoansTestCase(unittest.TestCase): excel = Handler_Excel(filename, 'loans') cases = excel.read_data() # @classmethod # def setUpClass(cls): # LoginBase.login() @data(*cases) def test_loans(self, case): url = conf.get('env', 'base_url') + case['url'] method = case['method'] headers = eval(conf.get('env', 'headers')) # headers['Authrization']=getattr(EnvData,'token') data = eval(case['data']) expected = eval(case['expected']) row = case['case_id'] + 1 response2 = request(method=method, params=data, url=url, headers=headers) res2 = response2.json() print('预期结果:', expected) print('实际结果:', res2) try: self.assertEqual(expected['code'], res2['code']) self.assertEqual(expected['msg'], res2['msg']) # 可以进行返回数据条数的校验 self.assertEqual(expected['len'], len(res2['data'])) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) log.debug('预期结果', expected) log.debug('实际结果', res2) self.excel.write_data(row=row, column=8, value='不通过') raise e else: log.info('用例----{}----执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='通过')
class InfoTestCase(unittest.TestCase): excel = Handler_Excel(os.path.join(DATA_DIR, 'cases.xlsx'), 'info') cases = excel.read_data() db = HandlerMysql() @classmethod def setUpClass(cls): LoginBase.login() @data(*cases) def test_info(self, case): pass method = case['method'] headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') if '#member_id#' in case['url']: case['url'] = replace_data(case['url']) url = conf.get('env', 'base_url') + case['url'] expected = eval(case['expected']) row = case['case_id'] + 1 response2 = request(method=method, headers=headers, url=url) res2 = response2.json() print('预期结果', expected) print('实际结果', res2) try: self.assertEqual(expected['code'], res2['code']) self.assertEqual(expected['msg'], res2['msg']) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) log.debug('预期结果', expected) log.debug('实际结果', res2) self.excel.write_data(row=row, column=8, value='不通过') raise e else: log.info('用例----{}----执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='通过')
class AddTestCase(unittest.TestCase): filename = os.path.join(DATA_DIR, 'cases.xlsx') excel = Handler_Excel(filename, 'add') cases = excel.read_data() db = HandlerMysql() @classmethod def setUpClass(cls): LoginBase.login() # headers=eval(conf.get('env','headers')) # url=conf.get('env','base_url')+'/member/login' # data={'mobile_phone':conf.get('test_data','phone'), # 'pwd':conf.get('test_data','pwd')} # response1=request(method='post',headers=headers,json=data,url=url) # res1=response1.json() # member_id=str(jsonpath(res1,'$..id')[0]) # token='Bearer'+' '+jsonpath(res1,'$..token')[0] # #将提取出来的数据保存为EnvData的类属性(环境变量) # setattr(EnvData,'member_id',member_id) # setattr(EnvData,'token',token) # print(token) # print(member_id) # @data(*cases) def test_add(self, case): url = conf.get('env', 'base_url') + case['url'] method = case['method'] headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') # 替换用例中的member_Id # case['data']=case['data'].replace('#member_id#',self.member_id) data = eval(replace_data(case['data'])) expected = eval(case['expected']) row = case['case_id'] + 1 # 加标之前查询该用户对应的标数量 if case['check_sql']: # sql = case['check_sql'].replace('#member_id#', self.member_id) sql = replace_data(case['check_sql']) start_count = self.db.find_count(sql) response2 = request(method=method, headers=headers, json=data, url=url) res2 = response2.json() print('预期结果', expected) print('实际结果', res2) try: self.assertEqual(expected['code'], res2['code']) self.assertEqual(expected['msg'], res2['msg']) # 加标之后 if case['check_sql']: sql = replace_data(case['check_sql']) end_count = self.db.find_count(sql) print(end_count - start_count) # self.assertEqual(1,end_count-start_count) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) self.excel.write_data(row=row, column=8, value='不通过') log.debug(expected) log.debug(res2) raise e else: log.info('用例----{}----执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='通过')
class RegisterTestCase(unittest.TestCase): excel = Handler_Excel(filename, 'register') cases = excel.read_data() db = HandlerMysql() @data(*cases) def test_register(self, case): # 第一步:准备用例数据 # 请求方法 method = case['method'] # 请求地址 url = conf.get('env', 'base_url') + case['url'] # 请求参数 # 判断是否有手机号码需要替换 if '#phone#' in case['data']: # 随机生成一个手机号码 phone = self.random_phone() # 将参数中的#phone#替换成随机生成的手机号 case['data'] = case['data'].replace('#phone#', phone) data = eval(case['data']) # 请求头 配置文件的请求头不能换行 headers = eval(conf.get('env', 'headers')) expected = eval(case['expected']) row = case['case_id'] + 1 # 第二步:发送请求,获取实际结果 response = request(method=method, url=url, json=data, headers=headers) res = response.json() # print('实际结果:',res) # print(expected['code']) # 用print可以显示详细信息在报告上 print('预期结果', expected) print('实际结果', res) # 第三步:断言 try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) # 判断是否需要sql校验 if case['check_sql']: sql = case['check_sql'].replace('#phone#', data['mobile_phone']) # 方法1:是否可以找到数据 # res=self.db.find_one(sql) # self.assertTrue(res) #none为false?? # 方法2:是否可以找到一条数据 res = self.db.find_count(sql) self.assertEqual(1, res) except AssertionError as e: log.error('用例--{}--执行不通过'.format(case['title'])) log.exception(e) log.debug('预期结果:{}'.format(expected)) log.debug('实际结果:{}'.format(res)) self.excel.write_data(row=row, column=8, value='fail') raise e else: # log.info('用例--{}--执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='pass') @classmethod def random_phone(cls): '''生成一个数据库里未注册的手机号码''' while True: phone = '137' for i in range(8): r = random.randint(0, 9) phone += str(r) sql = 'select * from futureloan.member where mobile_phone={};'.format( phone) res = cls.db.find_count(sql) if res == 0: return phone
class AuditTestCase(unittest.TestCase): filename = os.path.join(DATA_DIR, 'cases.xlsx') excel = Handler_Excel(filename, 'audit') cases = excel.read_data() db = HandlerMysql() @classmethod def setUpClass(cls): # 所有用例执行前的前置条件:管理员登录、普通用户登录 LoginBase.login() LoginBase.admin_login() # url = conf.get('env', 'base_url') + '/member/login' # headers = eval(conf.get('env', 'headers')) # # 1、管理员登录 # admin_data={'mobile_phone':conf.get('test_data','admin_phone'), # 'pwd':conf.get('test_data','admin_pwd')} # # # 2.普通用户登录 # user_data = {'mobile_phone':conf.get('test_data','phone'), # 'pwd':conf.get('test_data','pwd')} # # response1=request(method='post',url=url,json=admin_data,headers=headers) # res1=response1.json() # cls.admin_token='Bearer' + ' ' +jsonpath(res1,'$..token')[0] # # # response2=request(method='post',url=url,json=user_data,headers=headers) # res2=response2.json() # cls.user_token = 'Bearer' + ' ' + jsonpath(res2, '$..token')[0] # cls.user_member_id = str(jsonpath(res2, '$..id')[0]) # def setUp(self): # 每条用例执行的前置条件:添加一个新的项目 url = conf.get('env', 'base_url') + '/loan/add' headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') data = { "member_id": getattr(EnvData, 'member_id'), "title": "贷款买楼666", "amount": 1000, "loan_rate": 1, "loan_term": 1, "loan_date_type": 1, "bidding_days": 1 } # 发送请求,添加项目 response = request(method='post', url=url, json=data, headers=headers) res = response.json() loan_id = str(jsonpath(res, '$..id')[0]) setattr(EnvData, 'loan_id', loan_id) # print('项目id', self.loan_id) @data(*cases) def test_audit(self, case): # 1.准备数据 url = conf.get('env', 'base_url') + case['url'] if '#pass_loan_id#' in case['data']: data = eval(replace_data(case['data'])) # data = eval(case['data'].replace('#loan_id#', self.loan_id)) data = eval(replace_data(case['data'])) headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'admin_token') if case['title'] == '普通用户审核': headers['Authorization'] = getattr(EnvData, 'token') method = case['method'] expected = eval(case['expected']) row = case['case_id'] + 1 response = request(method=method, url=url, json=data, headers=headers) res = response.json() print(res) print(expected) if case['title'] == '审核通过' and case['case_id'] == 1: AuditTestCase.pass_loan_id = data['loan_id'] # 3.断言 try: self.assertEqual(res['code'], expected['code']) self.assertEqual(res['msg'], expected['msg']) if case['check_sql']: # 原方法 # case['check_sql'] = case['check_sql'].replace('#loan_id#',self.loan_id) # res = self.db.find_one(case['check_sql']) # res2 = res['status'] # self.assertEqual(res2, expected['status']) # 新方法 sql = replace_data(case['check_sql']) # case['check_sql'].replace('#loan_id#',self.loan_id) status = self.db.find_one(sql)['status'] self.assertEqual(status, expected['status']) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) self.excel.write_data(row=row, column=8, value='fail') log.debug('预期结果', expected) log.debug('实际结果', res) raise e else: log.info('用例----{}----执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='pass')
class TestRecharge(unittest.TestCase, LoginBase): excel = Handler_Excel(filename, 'recharge') cases = excel.read_data() db = HandlerMysql() @classmethod def setUpClass(cls): LoginBase.login() @data(*cases) def test_recharge(self, case): # pass url = conf.get('env', 'base_url') + case['url'] method = case['method'] # 1.准备用例数据 # 替换用户id,转换为字典 data = eval(replace_data(case['data'])) # 2.准备请求头 headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') expected = eval(case['expected']) row = case['case_id'] + 1 # 判断该用例是否需要数据库校验 if case['check_sql']: sql = replace_data(case['check_sql']) res_db = self.db.find_one(sql) start_money = res_db['leave_amount'] print('充值前金额:', start_money) # 2.发送请求,获取实际结果 response = request(method=method, url=url, headers=headers, json=data) res = response.json() print('预期结果', expected) print('实际结果', res) # 获取充值之后的账户余额 if case['check_sql']: sql = replace_data(case['check_sql']) res_db = self.db.find_one(sql) end_money = res_db['leave_amount'] print('充值后金额:', end_money) # # 3.断言预期结果和实际结果 try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) if case['check_sql']: # 将充值金额转换为decimal类型,因为数据库是decimal类型的 recharge_money = decimal.Decimal(str(data['amount'])) self.assertEqual(recharge_money, end_money - start_money) except AssertionError as e: log.error('用例--{}--执行不通过'.format(case['title'])) log.exception(e) log.debug('预期结果:{}'.format(expected)) log.debug('实际结果:{}'.format(res)) self.excel.write_data(row=row, column=8, value='fail') raise e else: log.info('用例--{}--执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='pass')
class InvestTestCase(unittest.TestCase): excel = Handler_Excel(filename, 'invest') cases = excel.read_data() sql = HandlerMysql() @data(*cases) def test_invest(self, case): # 1.准备数据 url = conf.get('env', 'base_url') + case['url'] method = case['method'] headers = eval(conf.get('env', 'headers')) if case['interface'] != 'login': # 如果不是登陆接口,则添加一个token headers['Authorization'] = getattr(EnvData, 'token') data = eval(replace_data(case['data'])) expected = eval(case['expected']) row = case['case_id'] + 1 # 获取需要sql校验的数据: if case['check_sql']: sql1 = 'select leave_amount from futureloan.member where member_id = #member_id#'.replace( '#member_id#', getattr(EnvData, 'member_id')) sql2 = 'select * from futureloan.invest where member_id= #member_id#;'.replace( '#member_id#', getattr(EnvData, 'member_id')) sql3 = 'select * from futureloan.financelog where pay_member_id= #member_id#;'.replace( getattr(EnvData, 'member_id')) start_amount = self.sql.find_one(sql1) start_invest_num = self.sql.find_count(sql2) start_financelog_num = self.sql.find_count(sql3) # 2.发送请求,获取实际结果 response = request(url=url, json=data, method=method, headers=headers) res = response.json() # 登录需要提取Id和token # 加标需要提取标id if case['interface'] == 'login': # 如果是登录接口,需要提取member_id member_id = str(jsonpath(res, '$..id')[0]) token = 'Bearer' + ' ' + jsonpath(res, '$..token')[0] setattr(EnvData, 'member_id', member_id) setattr(EnvData, 'token', token) if case['interface'] == 'add': # 如果是加标接口,则提取loan_id loan_id = str(jsonpath(res, '$..id')[0]) setattr(EnvData, 'loan_id', loan_id) # 3.断言 try: self.assertEqual(res['code'], expected['code']) self.assertEqual(res['msg'], expected['msg']) if case['check_sql']: sql1 = 'select leave_amount from futureloan.member where member_id = #member_id#'.replace( '#member_id#', getattr(EnvData, 'member_id')) sql2 = 'select * from futureloan.invest where member_id= #member_id#;'.replace( '#member_id#', getattr(EnvData, 'member_id')) sql3 = 'select * from futureloan.financelog where pay_member_id= #member_id#;'.replace( '#member_id#', getattr(EnvData, 'member_id')) after_amount = self.sql.find_one(sql1) self.assertEqual(after_amount - start_amount, Decimal(str(data['amount']))) after_invest_num = self.sql.find_count(sql2) self.assertEqual(after_invest_num - start_invest_num, 1) after_financelog_num = self.sql.find_count(sql3) self.assertEqual( after_financelog_num - start_financelog_num, 1) if '满标' in case['title']: sql4 = 'select id from futureloan.invest where loan_id= {};'.format( getattr(EnvData, 'loan_id')) invest_ids = self.sql.find_all(sql4) for i in invest_ids: sql5 = 'select * from futureloan.repayment where invest_id= {};'.format( i) repayment_num = self.sql.find_count(sql5) self.assertTrue(repayment_num) # if case['check_sql']: # # sql = case['check_sql'].replace('#loan_id#', self.loan_id) # status = self.db.find_one(sql)['status'] # self.assertEqual(status, expected['status']) except AssertionError as e: log.error('用例----{}----执行不通过'.format(case['title'])) log.exception(e) self.excel.write_data(row=row, column=8, value='fail') log.debug('预期结果', expected) log.debug('实际结果', res) raise e else: log.info('用例----{}----执行通过'.format(case['title'])) self.excel.write_data(row=row, column=8, value='pass')