def test_loan_add(self, item): rep = replace_data(TestAudit, item["params"]) print(rep) params = eval(rep) expected = eval(item["expected"]) url = conf.get("api", "baseUrl") + item["url"] headers = eval(conf.get("api", "headers")) headers["Authorization"] = self.token_result response = requests.patch(url=url, json=params, headers=headers) res = response.json() print("预期结果为{}".format(expected)) print("实际结果为{}".format(res)) try: self.assertEqual(res["code"], expected["code"]) self.assertEqual(res["msg"], expected["msg"]) # if item["check_sql"]: # loan_id = jsonpath.jsonpath(res, "$..id")[0] # sql = db.find_data(item["check_sql"].format(loan_id)) # self.assertTrue(sql) if item["check_sql"]: sql = db.find_data(item["check_sql"].format(self.loan_id))[0] self.assertEqual(2, sql["status"]) except AssertionError as e: log.error("{}用例执行失败".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行不通过") raise e else: log.info("{}用例执行通过".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行通过")
def testLogin(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) logger.info("当前测试用例为:\n {}".format(case)) # 发起请求 res = self.hr.send_requests(case["method"], case["url"], case["request_data"]) if case["expected"]: try: # 实际结果 actual = res.json() logger.info("实际结果为:{}".format(actual)) expected = eval(case["expected"]) logger.info("预期结果为:{}".format(case["expected"])) assert actual["code"] == expected["code"] assert actual["msg"] == expected["msg"] except AssertionError: logger.exception("断言失败") raise except Exception: logger.exception("除断言以外的报错") raise
def setUpClass(cls): #管理员账户登录并新增项目 url = conf.get("api", "baseUrl") + "/member/login" params = { "mobile_phone": conf.get("testdata", "admin_mobile"), "pwd": conf.get("testdata", "admin_pwd") } headers = eval(conf.get("api", "headers")) response = requests.post(url=url, json=params, headers=headers) res = response.text token = jsonpath.jsonpath(eval(res), "$..token")[0] cls.token_result = "Bearer" + " " + token cls.invest_member_id = jsonpath.jsonpath(eval(res), "$..id")[0] add_loan_url = conf.get("api", "baseUrl") + "/loan/add" params = { "member_id": cls.invest_member_id, "title": "按月借贷项目", "amount": 1100000, "loan_rate": 16.5, "loan_term": 10, "loan_date_type": 1, "bidding_days": 8 } headers["Authorization"] = cls.token_result response = requests.post(url=add_loan_url, json=params, headers=headers) cls.loan_id = jsonpath.jsonpath(response.json(), "$..id")[0] cls.pass_loan_id = cls.loan_id
class TestLogin(unittest.TestCase): excel = ExcelHandle(os.path.join(DATA_DIR, 'apicases.xlsx'), 'login') cases = excel.read_data() base_url = conf.get('env', 'base_url') headers = eval(conf.get('env', 'headers')) @list_data(cases) def test_login(self, item): url = self.base_url + item['url'] item['data'] = replace_data(item['data'], TestLogin) params = eval(item['data']) method = item['method'].lower() expected = eval(item['expected']) response = requests.request(method, url, json=params, headers=self.headers) res = response.json() try: # self.assertEqual(expected['code'], res['code']) # self.assertEqual(expected['msg'], res['msg']) self.assertDictIn(expected, res) except AssertionError as e: my_log.error('用例---【{}】---执行失败'.format(item['title'])) # my_log.exception(e) raise e else: my_log.info('用例---【{}】---执行通过'.format(item['title'])) def assertDictIn(self, expected, res): for k, v in expected.items(): if res.get(k) == v: pass else: raise AssertionError('{}[k,v] not in{}'.format(expected, res))
def login(): #第二步登录并充值 login_url=conf.get("api","baseUrl")+"/member/login" login_params={ "mobile_phone":conf.get("testdata","mobile_phone"), "pwd":conf.get("testdata","pwd") } response=requests.post(url=login_url,json=login_params,headers=headers) if response.json()["code"]==0: print("登录初始成功") token=jsonpath.jsonpath(response.json(),"$..token")[0] member_id=jsonpath.jsonpath(response.json(),"$..id")[0] #充值500000 recharge_url=conf.get("api","baseUrl")+"/member/recharge" headers["Authorization"]=token recharge_params={ "member_id":member_id, "amount":500000 } response=requests.post(url=recharge_url,params=recharge_params,headers=headers) if response.json()["code"]==0: print("==================充值500000成功==================") sql = "SELECT * FROM futureloan.member WHERE id={}" leave_amount = db.find_data(sql.format(member_id))[0]["leave_amount"] print("用户当前余额为{}".format(leave_amount)) else: raise ValueError("普通用户初始化充值失败") else: raise ValueError("普通账号初始化登录异常")
def test_register(self, item): if "#mobile_phone#" in item["params"]: self.mobile_id = self.random_phone() item["params"] = item["params"].replace("#mobile_phone#", str(self.mobile_id)) params = eval(item["params"]) url = conf.get("api", "baseUrl") + item["url"] expected = eval(item["expected"]) headers = eval(conf.get("api", "headers")) resp = requests.post(url=url, json=params, headers=headers) res1 = json.loads(resp.text) print(type(res1)) print("预期结果为{}".format(expected)) print("实际结果为{}".format(res1)) try: self.assertEqual(res1["code"], expected["code"]) self.assertEqual(res1["msg"], expected["msg"]) except AssertionError as e: log.error("{}用例不通过".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行不通过") raise e else: log.info("{}用例通过".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行通过")
def create_logger(): """创建日志收集器""" # 1、创建一个收集器 log = logging.getLogger("lemon") log.setLevel(conf.get("logging", 'level')) # 设置收集日志的等级---------- # log.setLevel("DEBUG") # 2、创建一个输出到文件的输出渠道(按时间轮转), fh = TimedRotatingFileHandler(file_path, when='d', interval=1, backupCount=7, encoding="utf-8") fh.setLevel(conf.get("logging", 'fh_level')) # 设置输出等级---------- # fh.setLevel("DEBUG") log.addHandler(fh) # 添加到收集器中 # 3、创建一个输出到控制台的输出渠道 sh = logging.StreamHandler() sh.setLevel(conf.get('logging', 'sh_level')) # 设置输出等级---------- # sh.setLevel("DEBUG") log.addHandler(sh) # 添加到收集器中 # 4、设置日志输出格式 formatter = "%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s" mate = logging.Formatter(formatter) fh.setFormatter(mate) sh.setFormatter(mate) return log
class TestRegister(unittest.TestCase): excel = ExcelHandle(os.path.join(DATA_DIR, 'apicases.xlsx'), 'register') cases = excel.read_data() base_url = conf.get('env', 'base_url') print(base_url) headers = eval(conf.get('env', 'headers')) db = HandleDB() @list_data(cases) def test_register(self, item): # 第一步准备用例数据 # 接口地址 url = self.base_url + item['url'] # phone = self.random_mobile() # item['data'] = item['data'].replace('#mobile#', phone) # # 接口请求参数 # 判斷是否有手机号需要替换 if '#mobile#' in item['data']: # phone = self.random_mobile() setattr(TestRegister,'mobile',self.random_mobile()) item['data'] = replace_data( item['data'], TestRegister) params = eval(item['data']) # 请求头 # 获取请求方法并转换为小写 method = item['method'].lower() # 用例预期结果 expected = eval(item['expected']) # 第二步请求接口,获取实际结果 # requests.post(url=url,json=params,headers=self.headers) response = requests.request(method, url, json=params, headers=self.headers) res = response.json() # 查询该数据库中该手机号对应的账户数量 sql = 'select * FROM futureloan.member WHERE mobile_phone="{}"'.format(params.get('mobile_phone', "")) count = self.db.find_count(sql) # 第三步 断言 print('预期结果', expected) print('实际结果', res) try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) if item['check_sql']: print('数据库中查询的数量为:', count) self.assertEqual(1, count) except AssertionError as e: my_log.error('用例---【{}】---执行失败'.format(item['title'])) my_log.exception(e) # my_log.error(e) # 回写结果到Excel raise e else: my_log.info('用例---【{}】---执行通过'.format(item['title'])) def random_mobile(self): """随机生成手机号""" phone = str(random.randint(18800000000, 18899999999)) return phone
def __init__(self): self.con = pymysql.connect(host=conf.get('mysql', 'host'), port=conf.getint('mysql', 'port'), user=conf.get('mysql', 'user'), password=conf.get('mysql', 'password'), charset='utf8' # cursorclass=pymysql.cursors.DictCursor )
def setUpClass(cls): url = conf.get("api", "baseUrl") + "/member/login" params = { "mobile_phone": conf.get("testdata", "mobile_phone"), "pwd": conf.get("testdata", "pwd") } headers = eval(conf.get("api", "headers")) response = requests.post(url=url, json=params, headers=headers) res = response.text token = jsonpath.jsonpath(eval(res), "$..token")[0] cls.token_result = "Bearer" + " " + token cls.member_id = jsonpath.jsonpath(eval(res), "$..id")[0]
def setUpClass(cls) -> None: #1、准备登录数据 url=conf.get("env","base_url")+"/auth/login" params={"username":conf.get("test_data","username"), "password":conf.get("test_data","password")} #2、请求登录接口 response=requests.post(url=url,json=params) res=response.json() #3、提取token,放到请求头中,给后面的用例使用 token=jsonpath(res,"$..token")[0] headers={"token":""} headers['token']=token cls.token=headers
def setUpClass(cls) -> None: url = conf.get('env', 'base_url') + '/member/login' params = { 'mobile_phone': conf.get('test_data', 'mobile'), 'pwd': conf.get('test_data', 'pwd') } headers = eval(conf.get('env', 'headers')) response = requests.post(url=url, json=params, headers=headers) res = response.json() token = jsonpath(res, '$..token')[0] headers['Authorization'] = 'Bearer ' + token cls.headers = headers cls.member_id = jsonpath(res, '$..id')
def admin_login(cls): # ------管理员登录—————— url = conf.get('env', 'base_url') + '/member/login' params = { 'mobile_phone': conf.get('test_data', 'admin_mobile'), 'pwd': conf.get('test_data', 'admin_pwd') } headers = eval(conf.get('env', 'headers')) response = requests.post(url=url, json=params, headers=headers) res = response.json() admin_token = jsonpath(res, '$..token')[0] headers['Authorization'] = 'Bearer ' + admin_token cls.admin_headers = headers # 提取用户ID cls.admin_member_id = jsonpath(res, '$..id')[0]
def test_audit(self, item): url = conf.get('env', 'base_url') + item['url'] item['data'] = replace_data(item['data'], TestAudit) params = eval(item['data']) method = item['method'] expected = eval(item['expected']) response = requests.request(method=method, url=url, json=params, headers=self.admin_headers) res = response.json() # 判断是否审核通过的用例,且审核成功,如果是则保存项目ID为审核通过的项目ID # if res['msg']=='OK' and params['approved_or_not']=='True': if res['msg'] == 'OK' and item['title'] == '审核通过': TestAudit.pass_loan_id = params['loan_id'] # 第三步:断言 print("预期结果:", expected) print("实际结果:", res) try: # 断言code和msg字段是否一致 self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) if item['check_sql']: sql = item['check_sql'].format(self.loan_id) status = self.db.find_one(sql)[0] print('数据库中的状态', status) self.assertEqual(expected['status'], status) except AssertionError as e: # 记录日志 my_log.error("用例--【{}】---执行失败".format(item['title'])) my_log.exception(e) raise e else: my_log.info("用例--【{}】---执行通过".format(item['title']))
def test_add(self, item): # 准备数据 url = conf.get('env', 'base_url') + item['url'] item['data'] = replace_data(item['data'], TestAdd) params = eval(item['data']) expected = eval(item['expected']) method = item['method'] sql = 'select * from futureloan.loan where member_id={}'.format( self.member_id) start_count = self.db.find_count(sql) print('调用之前项目个数', start_count) response = requests.request(method=method, url=url, json=params, headers=self.headers) res = response.json() end_count = self.db.find_count(sql) print('调用之后项目个数', end_count) try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) #根据添加项目是否成功,来对数据库进行分别校验 if res['msg'] == 'OK': self.assertEqual(end_count - start_count, 1) else: self.assertEqual(end_count - start_count, 0) except AssertionError as e: my_log.error('用例--【{}】---执行失败'.format(item['title'])) my_log.exception(e) raise e else: my_log.info('用例--【{}】---执行成功'.format(item['title']))
def test_login(self, item): # 1. 准备测试数据 url = conf.get("env", "base_url") + item["url"] method = item["method"] params = eval(item["data"]) expected = eval(item["expected"]) # 2. 请求接口,获取实际结果 res = requests.request(method, url, json=params).json() print("-------当前执行的用例是:{}----------".format(item["title"])) print("请求参数:", params) print("预期结果:", expected) print("实际结果:", res) print("===============执行结束===============\n") # 3. 断言 try: assert_dict_item(expected, res) except AssertionError as e: log.exception(e) log.error("--测试用例:{}--执行失败".format(item["title"])) raise e else: log.info("--测试用例:{}--执行通过".format(item["title"]))
def __init__(self): try: self.conn = pymysql.connect(host=conf.get('mysql', 'host'), user=conf.get('mysql', 'user'), password=conf.get('mysql', 'password'), database=conf.get('mysql', 'db'), port=conf.getint('mysql', 'port'), charset='utf8', cursorclass=pymysql.cursors.DictCursor) # 建立游标 self.cur = self.conn.cursor() except: print("连接数据库失败!") raise
def __deal_url(self, url): if url.startswith("http://") or url.startswith("https://"): self.url = url else: # 从配置文件读取url地址,excel中以/结尾 base_url = conf.get("server", "baseurl") self.url = base_url + url logger.info("请求url为:\n {}".format(self.url))
def test_withdraw(self, item): # 第一步准备数据 url = conf.get('env', 'base_url') + item['url'] # *******************************动态替换参数*************************************** # 动态处理需要替换的参数 # item['data'] = item['data'].replace('#menber_id#', str(self.member_id)) # print(item['data']) item['data'] = replace_data(item['data'], TestWithdraw) params = eval(item['data']) # ******************************************************************************* expected = eval(item['expected']) method = item['method'].lower() # &&&&&&&&&&&&&&取现接口之前查询用户的余额&&&&&&&&&&&&&&&&&&&& sql = 'select leave_amount FROM futureloan.member WHERE mobile_phone="{}"'.format( conf.get('test_data', 'mobile')) start_amount = self.db.find_one(sql)[0] print('用例执行前的余额', start_amount) # 第二步发送请求,获取接口的实际返回结果 response = requests.request(method=method, url=url, json=params, headers=self.headers) res = response.json() print("预期结果:", expected) print("实际结果:", res) # &&&&&&&&&&&&&&取现之后查询用户的余额&&&&&&&&&&&&&& end_amount = self.db.find_one(sql)[0] print('用例执行后的余额', end_amount) # 第三步断言 try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) if item['check_sql']: self.assertEqual(params['amount'], float(start_amount - end_amount)) except AssertionError as e: my_log.error('用例--【{}】--失败'.format('title')) my_log.exception(e) raise e else: my_log.info('用例--【{}】--成功'.format('title'))
def test_recharge(self, item): # 第一步准备数据 url = conf.get('env', 'base_url') + item['url'] # *******************************动态替换参数*************************************** # 动态处理需要替换的参数 # item['data'] = item['data'].replace('#member_id#', str(self.member_id)) # print(item['data']) item['data'] = replace_data(item['data'], TestRecharge) params = eval(item['data']) # ******************************************************************************* expected = eval(item['expected']) method = item['method'].lower() # 第二步发送请求,获取接口的实际返回结果 # &&&&&&&&&&&&&&请求接口之前查询用户的余额&&&&&&&&&&&&&&&&&&&& sql = 'select leave_amount FROM futureloan.member WHERE mobile_phone="{}"'.format( conf.get('test_data', 'mobile')) start_amount = self.db.find_one(sql)[0] print('用例执行前的余额', start_amount) response = requests.request(method=method, url=url, json=params, headers=self.headers) res = response.json() print('预期结果', expected) print('实际结果', res) # &&&&&&&&&&&&&&请求接口之后查询用户的余额&&&&&&&&&&&&&& end_amount = self.db.find_one(sql)[0] print('用例执行后的余额', end_amount) # 第三步断言 try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) # &&&&&&&&&&&&&&校验数据库中用户金额的变化是否等于充值金额&&&&&&&&&&&&&&# if res['msg'] == 'OK': # 充值成功,用户余额的变化为充值金额 self.assertEqual(float(end_amount - start_amount), params['amount']) else: # 充值失败用户余额变化为0 self.assertEqual(float(end_amount - start_amount), 0) except AssertionError as e: my_log.error('用例--【{}】--失败'.format('title')) my_log.exception(e) raise e else: my_log.info('用例--【{}】--成功'.format('title'))
def test_login(self, item): url = conf.get("api", "baseUrl") + item["url"] params = eval(item["params"]) expected = eval(item["expected"]) headers = eval(conf.get("api", "headers")) response = requests.post(url=url, json=params, headers=headers) res = json.loads(response.text) print("预期结果为{}".format(expected)) print("实际结果为{}".format(res)) try: self.assertEqual(res["code"], expected["code"]) self.assertEqual(res["msg"], expected["msg"]) except AssertionError as e: log.error("{}用例执行失败".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行不通过") raise e else: log.info("{}用例执行通过".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行通过")
def test_recharge(self, item): if "#member_id#" in item["params"]: item["params"] = item["params"].replace("#member_id#", str(self.member_id)) params = eval(item["params"]) expected = eval(item["expected"]) # if "#member_id#" in item["check_sql"]: # item["check_sql"]=item["check_sql"].replace("#member_id#",str(self.mobile_id)) url = conf.get("api", "baseUrl") + item["url"] headers = eval(conf.get("api", "headers")) headers["Authorization"] = self.token_result check_sql = item["check_sql"] if check_sql: check_sql_before = db.find_data(check_sql.format(self.member_id)) print(check_sql_before, type(check_sql_before), check_sql_before[0]) leave_amount_before = check_sql_before[0]["leave_amount"] response = requests.post(url=url, json=params, headers=headers) res = response.json() if check_sql: check_sql_after = db.find_data(check_sql.format(self.member_id)) leave_amount_after = check_sql_after[0]["leave_amount"] # print(leave_amount_before,leave_amount_after,type(leave_amount_before),type(leave_amount_after)) res2 = {} res2["code"] = res["code"] res2["msg"] = res["msg"] print("预期结果为{}".format(expected)) print("实际结果为{}".format(res2)) try: self.assertEqual(res2, expected) if item["check_sql"]: self.assertEqual( float(leave_amount_after - leave_amount_before), float(params["amount"])) except AssertionError as e: log.error("{}用例执行失败".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行不通过") raise e else: log.info("{}用例执行通过".format(item["title"])) sh.write_excel(item["case_id"] + 1, 8, "执行通过")
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 __init__(self): super().__init__(conf.get('log', 'name')) self.setLevel(conf.get('log', 'level')) # 设置日志输出格式 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s [第%(lineno)d行] %(message)s" formatter = logging.Formatter(fmt) # 设置日志输出格式-控制台 handle1 = logging.StreamHandler() handle1.setFormatter(formatter) # 设置日志输出格式-文件 log_path = os.path.join(log_dir, conf.get('log', 'file')) handle2 = logging.FileHandler(log_path, encoding="utf-8") handle2.setFormatter(formatter) # 添加渠道到日志收集器中 self.addHandler(handle1) self.addHandler(handle2)
def setup_login(cls): """登录""" # 测试数据 url = conf.get("env", "base_url") + "/user/login/" method = "POST" params = {"username": "******", "password": "******"} # 请求接口 res = requests.request(method, url, json=params).json() # 提取返回的token,设置为类属性 cls.token = res["token"]
def __init__(self): super().__init__(conf.get("log", "name")) # 日志收集器名字 self.setLevel(conf.get("log", "level")) # 日志收集器级别 # 3、设置日志输出格式 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s [第%(lineno)d行] %(message)s" formatter = logging.Formatter(fmt) # 4、创建一个输出渠道到终端 handle1 = logging.StreamHandler() handle1.setFormatter(formatter) # 4、创建一个输出渠道到文件 log_time = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime()) log_name = conf.get("log", "file") + f" {log_time}.log" handle2 = logging.FileHandler(os.path.join(logdir, log_name), encoding="utf-8") handle2.setFormatter(formatter) # 5、把输出渠道添加到日志收集器对象中 self.addHandler(handle1) self.addHandler(handle2)
def register(user_conf,pwd_conf,type): """ :param user_conf:保存到配置文件的配置项的用户名称 :param pwd_conf:保存到配置文件的配置项的密码名称 :param type:注册用户的类型,0:管理员 默认1:普通用户 :return: """ #第一步,普通账号注册账户 register_url=conf.get("api","baseUrl")+"/member/register" headers=conf.get("api","headers") params={ "mobile_phone":random_phone(), "pwd":11111111, "type":type } response=requests.post(url=register_url,json=params,headers=headers) res=response.json() if res["code"]==0: print("==============初始化注册成功===============") conf.write(section="testdata",option=user_conf,value=params["mobile_phone"]) conf.write(section="testdata",option=pwd_conf,value=pwd_conf)
def replace_data(data, cls): """替换用例参数""" while re.search("#(.+?)#", data): item = re.search("#(.+?)#", data) # 需要替换的数据 rep_data = item.group() # 要替换的属性 key = item.group(1) try: value = conf.get("test_data", key) except: value = getattr(cls, key) data = data.replace(rep_data, str(value)) return data
def test_invest(self, item): url = conf.get('env', 'base_url') + item['url'] item['data'] = replace_data(item['data'], TestInvest) params = eval(item['data']) expected = eval(item['expected']) method = item['method'] # ----------------投资前查询数据库---------------------------- #查用户表的sql sql1 = 'select leave_amount FROM futureloan.member where id= "{}"'.format( self.member_id) # 查投资记录的sql sql2 = 'select id FROM futureloan.invest where member_id= "{}"'.format( self.member_id) # 查流水记录的sql sql3 = 'select id FROM futureloan.financelog where pay_member_id= "{}" '.format( self.member_id) if item['check_sql']: s_amount = self.db.find_one(sql1)[0] s_invest = self.db.find_count(sql2) s_financelog = self.db.find_count(sql3) response = requests.request(method=method, url=url, json=params, headers=self.headers) res = response.json() # --------------投资后查询数据库----------------------------- if item['check_sql']: e_amount = self.db.find_one(sql1)[0] e_invest = self.db.find_count(sql2) e_financelog = self.db.find_count(sql3) try: self.assertEqual(expected['code'], res['code']) self.assertIn(expected['msg'], res['msg']) if item['check_sql']: # 断言用户余额 self.assertEqual(params['amount'], float(s_amount - e_amount)) # 断言投资记录 self.assertEqual(1, e_invest - s_invest) # 断言流水记录 self.assertEqual(1, e_financelog - s_financelog) except AssertionError as e: my_log.error("用例--【{}】---执行失败".format(item['title'])) my_log.exception(e) raise e else: my_log.info("用例--【{}】---执行通过".format(item['title']))
def add_project(cls): url = conf.get('env', 'base_url') + '/loan/add' params = { "member_id": cls.member_id, "title": "借钱实现财富自由", "amount": 2000, "loan_term": 3, "loan_rate": 12.0, "loan_date_type": 1, "bidding_days": 5 } response = requests.post(url=url, json=params, headers=cls.headers) res = response.json() print(res) # 提取项目ID保存为类属性 cls.loan_id = jsonpath(res, '$..id')[0]