def register(reg_name='linux超', pwd='123456'): """注册帐号""" do_mysql = HandleMysql() request = HttpRequests() register_url = do_conf('URL', 'Host_Url') + '/member/register' while 1: phone = do_mysql.get_not_exist_phone() request_data = {"mobilephone": phone, "pwd": pwd, "regname": reg_name} request(method='post', url=register_url, data=request_data ) sql = 'select Id from member where MobilePhone=%s;' member = do_mysql(sql=sql, args=(phone,)) if member: member_id = member['Id'] break user_dic = { reg_name: { 'MemberId': member_id, 'pwd': pwd, 'MobilePhone': phone, 'RegName': reg_name } } do_mysql.close() request.close_session() log.info('注册{}帐号成功\n帐号信息-userId{},userName{},mobilePhone{}'. format(reg_name, member_id, reg_name, phone)) return user_dic
def setUp(self): # 投资人登录充值 login.login_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={"mobilephone": str(do_user('Invest', 'mobilephone')), "pwd": (do_user('Invest', 'pwd'))} )
def test_recharge(self, value): row = value.CaseId + 1 # 用例ID所在行号 precondition = value.Precondition # excel用例的前置条件 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_value = value.Data # 请求参数 request_method = value.Method # 请求方法 select_sql = value.Sql # 查询充值结果的sql语句 replace_sql = recharge_parameters(select_sql) recharge_expected = HandleJson.json_to_python(value.Expected) # 期望结果 log.info('执行充值-测试用例"{}"开始'.format(title)) request_value = recharge_parameters(request_value) before_amount = self.mysql(sql=replace_sql)['LeaveAmount'] # 充值前的金额 # 切换会话 if precondition == '用户未登录': response = self.request(request_method, url=url, data=request_value) else: response = request(request_method, url=url, data=request_value) after_amount = self.mysql(sql=replace_sql)['LeaveAmount'] # 充值后的金额 actual_amount = str(after_amount - before_amount) # 实际金额 actual_code = response.json()['code'] # 实际code # 构造个实际结果的字典 actual_result = dict(leaveamount=actual_amount, code=actual_code) do_excel.write_cell( do_conf('SheetName', 'Recharge'), row, do_conf('ExcelNum', 'Actual_Column'), HandleJson.python_to_json(actual_result) ) try: self.assertEqual(recharge_expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell( do_conf('SheetName', 'Recharge'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format(inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell( do_conf('SheetName', 'Recharge'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行登录-测试用例"{}"结束'.format(title))
def setUpClass(cls): cls.mysql = HandleMysql() # 管理人员登录 login.login_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={ "mobilephone": str(do_user('Admin', 'mobilephone')), "pwd": (do_user('Admin', 'pwd')) }) # 管理人加标 add.add_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/add', data={ "memberId": str(do_user('Invest', 'memberid')), "title": "超哥专属标的", "amount": 1000000, "loanRate": 10, "loanTerm": 3, "loanDateType": 0, "repaymemtWay": 4, "biddingDays": 5 }) sql = 'SELECT Id FROM loan WHERE MemberID={0} ORDER BY CreateTime DESC LIMIT 1;'.format( str(do_user('Invest', 'memberid'))) loan_id = str(cls.mysql(sql=sql)['Id']) setattr(DataReplace, 'loan_id', loan_id) # 管理人审核 audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/audit', data={ "id": loan_id, "status": 4 }) # 投资人登录 login.login_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={ "mobilephone": str(do_user('Invest', 'mobilephone')), "pwd": (('Invest', 'pwd')) })
def replace_remain_amount(cls, data): if hasattr(DataReplace, 'remain_amount'): # 总金额-已投金额 = 需要满标时的投资金额 amount = str( float(do_conf('add_loan_api', 'amount')) - getattr(DataReplace, 'remain_amount')) data = cls.re_replace(cls.pattern_amount_remain_amount, amount, data) else: data = cls.re_replace(cls.pattern_amount_remain_amount, '', data) return data
def test_add(self, value): row = value.CaseId + 1 # 用例ID所在行号 precondition = value.Precondition # excel用例的前置条件 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_method = value.Method # 请求方法 request_value = value.Data # 请求参数 select_sql = value.Sql # 查询数据库中不存在的member id add_expected = HandleJson.json_to_python(value.Expected) # 期望结果 if precondition == '借款人用户ID不存在': not_exist_loan_member_id = str( int(self.mysql(select_sql)['Id']) - 1) request_value = add_parameters(not_exist_loan_member_id, request_value) else: request_value = add_parameters('', request_value) log.info('执行加标-测试用例"{}"开始'.format(title)) response = request(request_method, url=url, data=request_value) actual_result = response.json() do_excel.write_cell(do_conf('SheetName', 'Add'), row, do_conf('ExcelNum', 'Actual_Column'), response.text) try: self.assertEqual(add_expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell(do_conf('SheetName', 'Add'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format( inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell(do_conf('SheetName', 'Add'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行加标-测试用例"{}"结束'.format(title))
def test_register(self, value): row = value.CaseId + 1 # 用例ID所在行号 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_value = value.Data # 请求参数 request_method = value.Method # 请求方法 log.info('开始执行注册-"{}"测试用例'.format(title)) # 转json的目的是防止期望结果和实际结果的字符串形式匹配不上(excel 存储的期望结果有空格) expected = HandleJson.json_to_python(value.Expected) # 期望结果 not_exist_phone = self.mysql.get_not_exist_phone() # 正向用例的注册账号 request_value = register_login_parameters(not_exist_phone, request_value) response = self.request(request_method, url=url, data=request_value) actual_result = response.json() do_excel.write_cell(do_conf('SheetName', 'Register'), row, do_conf('ExcelNum', 'Actual_Column'), response.text) try: self.assertEqual(expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell(do_conf('SheetName', 'Register'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format( inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell(do_conf('SheetName', 'Register'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行注册-测试用例"{}"结束'.format(title))
class TestLoginApi(Base): """登录接口""" test_data = do_excel.get_name_tuple_all_value(do_conf( 'SheetName', 'Login')) @data(*test_data) def test_login(self, value): row = value.CaseId + 1 # 用例ID所在行号 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_value = value.Data # 请求参数 request_method = value.Method # 请求方法 expected = HandleJson.json_to_python(value.Expected) # 期望结果 not_exist_phone = self.mysql.get_not_exist_phone() # 逆向用例登录账号 log.info('开始执行登录-"{}"测试用例'.format(title)) request_value = register_login_parameters(not_exist_phone, request_value) response = self.request(request_method, url=url, data=request_value) actual_result = response.json() do_excel.write_cell(do_conf('SheetName', 'Login'), row, do_conf('ExcelNum', 'Actual_Column'), response.text) try: self.assertEqual(expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell(do_conf('SheetName', 'Login'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format( inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell(do_conf('SheetName', 'Login'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行登录-测试用例"{}"结束'.format(title))
def __init__(self): log.info('初始化数据库...') try: log.info('start connecting MySQL...') self._conn = pymysql.connect( host=do_conf('MySQL', 'Host'), user=do_conf('MySQL', 'User'), password=do_conf('MySQL', 'PassWord'), db=do_conf('MySQL', 'Db'), port=do_conf('MySQL', 'Port'), charset=do_conf('MySQL', 'Charset'), cursorclass=pymysql.cursors.DictCursor) except Exception as e: log.error('连接数据库失败\n错误信息如下\n'.format(e)) else: log.info('连接数据库成功') self._cursor = self._conn.cursor()
def replace_amount_not_enough(cls, data): amount = str(do_conf('add_loan_api', 'amount')) data = cls.re_replace(cls.pattern_amount_not_enough, amount, data) return data
class DataReplace(object): pattern_not_exist_phone = re.compile( do_conf('Expression', 'Non_exist_phone')) pattern_exist_phone = re.compile(do_conf('Expression', 'Existed_phone')) pattern_invest_phone = re.compile(do_conf('Expression', 'Invest_phone')) pattern_no_login_phone = re.compile(do_conf('Expression', 'NoLogin_phone')) # add by linux超 at 2019.06.06 pattern_exist_loan_member_id = re.compile( do_conf('Expression', 'Existed_member_id')) pattern_not_exist_loan_member_id = re.compile( do_conf('Expression', 'Non_existed_member_id')) # add by linux超 at 2019.06.06 pattern_exist_invest_member_id = re.compile( do_conf('Expression', 'Exist_invest_member_id')) pattern_not_exist_invest_member_id = re.compile( do_conf('Expression', 'Non_exist_invest_member_id')) pattern_exist_loan_id = re.compile(do_conf('Expression', 'Exist_loan_id')) pattern_not_exist_loan_id = re.compile( do_conf('Expression', 'Non_exist_loan_id')) pattern_amount = re.compile(do_conf('Expression', 'Amount')) pattern_password = re.compile(do_conf('Expression', 'Password')) pattern_amount_not_enough = re.compile( do_conf('Expression', 'Amount_not_enough')) # 标的金额不足 pattern_amount_remain_amount = re.compile( do_conf('Expression', 'Remain_amount')) # 标的剩余金额(用来测试满标) def __init__(self): pass @staticmethod def re_replace(re_expression, data, source): """ 替换指定字符串 :param re_expression: 正则表达式 :param data: 被替换字符串如手机号,密码等 :param source: 目标源字符串 :return: """ if isinstance(data, str): pattern = re.compile(re_expression) if re.search(pattern, source): source = re.sub(pattern, data, source) log.info("测试数据{}通过正则匹配为: {}".format(source, source)) return source else: log.error("正则匹配测试数据失败: data '{}' must be string".format(data)) raise TypeError("data '{}' must be string".format(data)) # --------注册与登录接口参数化-------- @classmethod def replace_not_exist_phone(cls, not_exist_phone, data): """替换未注册的手机号""" data = cls.re_replace(cls.pattern_not_exist_phone, not_exist_phone, data) return data @classmethod def replace_exist_phone(cls, data): """替换已经注册的手机号码""" exist_phone = str(do_user('Invest', 'MobilePhone')) data = cls.re_replace(cls.pattern_exist_phone, exist_phone, data) return data # -----------充值接口参数化----------- @classmethod def replace_invest_phone(cls, data): """充值接口替换登录的角色帐号""" login_phone = str(do_user('Loan', 'MobilePhone')) data = cls.re_replace(cls.pattern_invest_phone, login_phone, data) return data @classmethod def replace_no_login_phone(cls, data): """充值接口替换未登录的角色帐号""" no_login_phone = str(do_user('Loan', 'MobilePhone')) data = cls.re_replace(cls.pattern_no_login_phone, no_login_phone, data) return data # ----------加标接口参数化------------- # add by linux超 at 2019.06.06 @classmethod def replace_loan_member_id(cls, data): """替换借款人的member id""" loan_member_id = str(do_user('Loan', 'memberid')) data = cls.re_replace(cls.pattern_exist_loan_member_id, loan_member_id, data) return data # add by linux超 at 2019.06.06 @classmethod def replace_no_exist_loan_member_id(cls, not_exist_loan_member_id, data): """替换不存在的loan member id""" data = cls.re_replace(cls.pattern_not_exist_loan_member_id, not_exist_loan_member_id, data) return data # -----------竞标接口参数化----------- @classmethod def replace_exist_invest_id(cls, data): invest_member_id = str(do_user('Invest', 'memberid')) data = cls.re_replace(cls.pattern_exist_invest_member_id, invest_member_id, data) return data @classmethod def replace_exist_loan_id(cls, data): exist_loan_id = getattr(DataReplace, 'loan_id') data = cls.re_replace(cls.pattern_exist_loan_id, exist_loan_id, data) return data @classmethod def replace_not_exist_invest_id(cls, data): if hasattr(DataReplace, 'non_exist_member_id'): not_exist_invest_id = getattr(DataReplace, 'non_exist_member_id') data = cls.re_replace(cls.pattern_not_exist_invest_member_id, not_exist_invest_id, data) else: data = cls.re_replace(cls.pattern_not_exist_invest_member_id, '', data) return data @classmethod def replace_not_exist_loan_id(cls, data): if hasattr(DataReplace, 'non_exist_loan_id'): not_exist_loan_id = getattr(DataReplace, 'non_exist_loan_id') data = cls.re_replace(cls.pattern_not_exist_loan_id, not_exist_loan_id, data) else: data = cls.re_replace(cls.pattern_not_exist_loan_id, '', data) return data @classmethod def replace_password(cls, data): pwd = str(do_user('Invest', 'pwd')) data = cls.re_replace(cls.pattern_password, pwd, data) return data @classmethod def replace_amount(cls, data): amount = '2000' data = cls.re_replace(cls.pattern_amount, amount, data) return data @classmethod def replace_amount_not_enough(cls, data): amount = str(do_conf('add_loan_api', 'amount')) data = cls.re_replace(cls.pattern_amount_not_enough, amount, data) return data @classmethod def replace_remain_amount(cls, data): if hasattr(DataReplace, 'remain_amount'): # 总金额-已投金额 = 需要满标时的投资金额 amount = str( float(do_conf('add_loan_api', 'amount')) - getattr(DataReplace, 'remain_amount')) data = cls.re_replace(cls.pattern_amount_remain_amount, amount, data) else: data = cls.re_replace(cls.pattern_amount_remain_amount, '', data) return data @classmethod def register_login_parameters_data(cls, not_exist_phone, data): """注册与登录参数化""" data = cls.replace_not_exist_phone(not_exist_phone, data) data = cls.replace_exist_phone(data) return data @classmethod def recharge_parameters_data(cls, data): """充值的参数化""" data = cls.replace_invest_phone(data) data = cls.replace_no_login_phone(data) return data # add by linux超 at 2019.06.06 @classmethod def add_parameters_data(cls, not_exist_loan_member_id, data): """加标的参数化""" data = cls.replace_loan_member_id(data) data = cls.replace_no_exist_loan_member_id(not_exist_loan_member_id, data) return data @classmethod def invest_parameters_data(cls, data): """竞标接口的参数化(投资人已经登录标的存在且为竞标状态)""" data = cls.replace_exist_invest_id(data) data = cls.replace_exist_loan_id(data) data = cls.replace_not_exist_invest_id(data) data = cls.replace_password(data) data = cls.replace_amount(data) data = cls.replace_not_exist_loan_id(data) data = cls.replace_amount_not_enough(data) data = cls.replace_remain_amount(data) return data
from common.SendRequests import request from common.ParseConfig import do_conf from common.RecordLog import log # 审核标的 class AuditLoanApi(object): request = request # 登录时的会话 def audit_loan_api(self, method, url, data): response = self.request(method=method, url=url, data=data) return response def close(self): log.info('关闭添加标的请求...') self.request.close_session() audit = AuditLoanApi() if __name__ == '__main__': audit = AuditLoanApi() audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={ "mobilephone": "18987560249", "pwd": "123457" }) audit.request.close_session()
class TestAddApi(Base): """加标接口""" test_data = do_excel.get_name_tuple_all_value(do_conf('SheetName', 'add')) def setUp(self): # 管理员登录加标 login.login_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={ "mobilephone": str(do_user('Admin', 'mobilephone')), "pwd": (do_user('Admin', 'pwd')) }) @data(*test_data) def test_add(self, value): row = value.CaseId + 1 # 用例ID所在行号 precondition = value.Precondition # excel用例的前置条件 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_method = value.Method # 请求方法 request_value = value.Data # 请求参数 select_sql = value.Sql # 查询数据库中不存在的member id add_expected = HandleJson.json_to_python(value.Expected) # 期望结果 if precondition == '借款人用户ID不存在': not_exist_loan_member_id = str( int(self.mysql(select_sql)['Id']) - 1) request_value = add_parameters(not_exist_loan_member_id, request_value) else: request_value = add_parameters('', request_value) log.info('执行加标-测试用例"{}"开始'.format(title)) response = request(request_method, url=url, data=request_value) actual_result = response.json() do_excel.write_cell(do_conf('SheetName', 'Add'), row, do_conf('ExcelNum', 'Actual_Column'), response.text) try: self.assertEqual(add_expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell(do_conf('SheetName', 'Add'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format( inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell(do_conf('SheetName', 'Add'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行加标-测试用例"{}"结束'.format(title)) def tearDown(self): login.close()
from config.config import (ENVIRONMENT, USER_PATH, REPORT_DIR, CASE_DIR) from business.CreateUser import register from common.ParseConfig import do_conf from common.CreatePath import ModelsClass def create_user_info_config_file(filename): """创建3个角色用户配置文件""" if not os.path.exists(filename): register.create_uer_info() def tc_suite(): """测试套件""" discover = unittest.defaultTestLoader.discover(CASE_DIR, 'test_*.py') return discover if __name__ == '__main__': create_user_info_config_file(USER_PATH) report_dir = ModelsClass.create_dir(REPORT_DIR) report_file_name = ModelsClass.file_name('html') with open(report_dir + '/' + report_file_name, 'wb') as f: runner = HTMLTestRunnerNew.HTMLTestRunner(stream=f, description=ENVIRONMENT, title=do_conf('Project', 'PRO_NAME'), tester=do_conf('Project', 'Tester'), verbosity=2) runner.run(tc_suite())
def test_bid_loan(self, value): row = value.CaseId + 1 # 用例ID所在行号 precondition = value.Precondition # excel用例的前置条件 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_method = value.Method # 请求方法 request_value = value.Data # 请求参数 select_sql = value.Sql audit_expected = HandleJson.json_to_python(value.Expected) # 期望结果 if precondition == '投资人不存在': not_exist_member_id = str(int(self.mysql(select_sql)['Id']) - 1) setattr(DataReplace, 'non_exist_member_id', not_exist_member_id) request_value = invest_parameters(request_value) elif precondition == '标的不存在': not_exist_loan_id = str(int(self.mysql(select_sql)['Id']) - 1) setattr(DataReplace, 'non_exist_loan_id', not_exist_loan_id) request_value = invest_parameters(request_value) elif precondition == '标的非竞标状态': # 设置标的为非竞标状态 audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/audit', data={ "id": getattr(DataReplace, 'loan_id'), "status": 1 }) request_value = invest_parameters(request_value) elif precondition == '标的金额不足': audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/audit', data={ "id": getattr(DataReplace, 'loan_id'), "status": 4 }) request_value = invest_parameters(request_value) elif precondition == '标的满标': # 这里不确定测试的对不对 sql = invest_parameters(select_sql) remain_amount = float( self.mysql(sql=sql)["invest_amount"]) # 标的剩余金额 setattr(DataReplace, 'remain_amount', remain_amount) # 给DataReplace添加一个剩余金额类属性 request_value = invest_parameters(request_value) request(request_method, url=url, data=request_value) else: request_value = invest_parameters(request_value) log.info('执行竞标-测试用例"{}"开始'.format(title)) response = request(request_method, url=url, data=request_value) actual_result = response.json() do_excel.write_cell(do_conf('SheetName', 'invest'), row, do_conf('ExcelNum', 'Actual_Column'), response.text) try: self.assertEqual(audit_expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell(do_conf('SheetName', 'invest'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format( inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell(do_conf('SheetName', 'invest'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行竞标-测试用例"{}"结束'.format(title))
class TestBidLoanApi(Base): """竞标接口""" test_data = do_excel.get_name_tuple_all_value( do_conf('SheetName', 'invest')) @classmethod def setUpClass(cls): cls.mysql = HandleMysql() # 管理人员登录 login.login_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={ "mobilephone": str(do_user('Admin', 'mobilephone')), "pwd": (do_user('Admin', 'pwd')) }) # 管理人加标 add.add_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/add', data={ "memberId": str(do_user('Invest', 'memberid')), "title": "超哥专属标的", "amount": 1000000, "loanRate": 10, "loanTerm": 3, "loanDateType": 0, "repaymemtWay": 4, "biddingDays": 5 }) sql = 'SELECT Id FROM loan WHERE MemberID={0} ORDER BY CreateTime DESC LIMIT 1;'.format( str(do_user('Invest', 'memberid'))) loan_id = str(cls.mysql(sql=sql)['Id']) setattr(DataReplace, 'loan_id', loan_id) # 管理人审核 audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/audit', data={ "id": loan_id, "status": 4 }) # 投资人登录 login.login_api(method='post', url=do_conf('URL', 'Host_Url') + '/member/login', data={ "mobilephone": str(do_user('Invest', 'mobilephone')), "pwd": (('Invest', 'pwd')) }) @data(*test_data) def test_bid_loan(self, value): row = value.CaseId + 1 # 用例ID所在行号 precondition = value.Precondition # excel用例的前置条件 title = value.Title # 用例标题 url = do_conf('URL', 'Host_Url') + value.URL # 用例url request_method = value.Method # 请求方法 request_value = value.Data # 请求参数 select_sql = value.Sql audit_expected = HandleJson.json_to_python(value.Expected) # 期望结果 if precondition == '投资人不存在': not_exist_member_id = str(int(self.mysql(select_sql)['Id']) - 1) setattr(DataReplace, 'non_exist_member_id', not_exist_member_id) request_value = invest_parameters(request_value) elif precondition == '标的不存在': not_exist_loan_id = str(int(self.mysql(select_sql)['Id']) - 1) setattr(DataReplace, 'non_exist_loan_id', not_exist_loan_id) request_value = invest_parameters(request_value) elif precondition == '标的非竞标状态': # 设置标的为非竞标状态 audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/audit', data={ "id": getattr(DataReplace, 'loan_id'), "status": 1 }) request_value = invest_parameters(request_value) elif precondition == '标的金额不足': audit.audit_loan_api(method='post', url=do_conf('URL', 'Host_Url') + '/loan/audit', data={ "id": getattr(DataReplace, 'loan_id'), "status": 4 }) request_value = invest_parameters(request_value) elif precondition == '标的满标': # 这里不确定测试的对不对 sql = invest_parameters(select_sql) remain_amount = float( self.mysql(sql=sql)["invest_amount"]) # 标的剩余金额 setattr(DataReplace, 'remain_amount', remain_amount) # 给DataReplace添加一个剩余金额类属性 request_value = invest_parameters(request_value) request(request_method, url=url, data=request_value) else: request_value = invest_parameters(request_value) log.info('执行竞标-测试用例"{}"开始'.format(title)) response = request(request_method, url=url, data=request_value) actual_result = response.json() do_excel.write_cell(do_conf('SheetName', 'invest'), row, do_conf('ExcelNum', 'Actual_Column'), response.text) try: self.assertEqual(audit_expected, actual_result, msg='测试{}失败'.format(title)) except AssertionError as e: do_excel.write_cell(do_conf('SheetName', 'invest'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Fail'), color=RED) log.error('{}-测试[{}] :Failed\nDetails:\n{}'.format( inspect.stack()[0][3], title, e)) raise e else: do_excel.write_cell(do_conf('SheetName', 'invest'), row, do_conf('ExcelNum', 'Result_Column'), do_conf('Result', 'Pass'), color=GREEN) log.info('{}-测试[{}] :Passed'.format(inspect.stack()[0][3], title)) log.info('执行竞标-测试用例"{}"结束'.format(title)) @classmethod def tearDownClass(cls): login.close() cls.mysql.close()