def login(): """登录,返回token 和member_id,访问登陆接口""" req = RequestHandler() res = req.visit(method="post", url=config.host + "/member/login", json=yaml_data["login"], headers={"X-Lemonban-Media-Type": "lemonban.v2"}) return res
def setUp(self) -> None: # 实例化 self.req = RequestHandler() # 一次操作用的是一个db对象,所以放前置条件当中 self.db = DBhandler(host=yaml_data["database"]["host"], port=yaml_data["database"]["port"], password=yaml_data["database"]["password"], user=yaml_data["database"]["user"], charset=yaml_data["database"]["charset"], database=yaml_data["database"]["database"])
class TestInvest(unittest.TestCase): # 读取Excel里数据 excel_handler = ExcelHandler(config.data_path) data = excel_handler.total_test("invest") logger = LoggerHandler( name=yaml_data["logger"]["name"], level=yaml_data["logger"]["level"], file=yaml_data["logger"]["file"], ) def setUp(self) -> None: # 实例化 self.req = RequestHandler() # 一次操作用的是一个db对象,所以放前置条件当中 self.db = DBhandler(host=yaml_data["database"]["host"], port=yaml_data["database"]["port"], password=yaml_data["database"]["password"], user=yaml_data["database"]["user"], charset=yaml_data["database"]["charset"], database=yaml_data["database"]["database"]) # 登录 # save_token() # self.token=Context.token # self.member_id=Context.member_id def tearDown(self) -> None: # 关闭浏览器 self.req.close_session() self.db.close() @ddt.data(*data) def test_invest(self, test_data): # 获取member_id token loan_id member_id = Context().member_id token = Context().token loan_id = Context().loan_id # 从数据库中查找id用户的原可用余额 sql = "select * from member where id=%s;" user = self.db.query(sql, args=[member_id]) before_money = user["leave_amount"] # 替换,把Excel里#member_id# #loan_id# 替换成对应的id test_data["json"] = replace_label(test_data["json"]) print(test_data) # if "%amount%" in test_data["json"]: # test_data["json"]=test_data["json"].replace("%amount%",str(before_money+Decimal(100))) # # if "*amount*" in test_data["json"]: # test_data["json"]=test_data["json"].replace("*amount*",str(before_money+Decimal(100))) if "*other_loan_id*" in test_data["json"]: oth_loan = self.db.query( "select * from loan where id=%s limit 100;", args=[1]) test_data["json"] = test_data["json"].replace( "*other_loan_id*", str(oth_loan)) headers = json.loads(test_data["headers"]) headers["Authorization"] = token res = self.req.visit(test_data["method"], config.host + test_data["url"], json=json.loads(test_data["json"]), headers=headers) print(res) try: self.assertEqual(test_data["expected"], res["code"]) # 数据库断言 if res["code"] == 0: money = json.loads(test_data["json"])["amount"] sql = "select * from member where id=%s;" after_user = self.db.query(sql, args=[member_id]) after_money = after_user["leave_amount"] self.assertEqual(before_money - Decimal(money), after_money) # 写入Excel 中实际结果 self.excel_handler.write_cell("invest", config.data_path, test_data["case_id"] + 1, 9, "用例通过") except AssertionError as e: # 记录logger self.logger.error("测试用例失败".format(e)) # 手动抛出异常,否则测试用例会自动通过,写入Excel self.excel_handler.write_cell("invest", config.data_path, test_data["case_id"] + 1, 9, "用例失败") raise e
class TestRecharge(unittest.TestCase): # def setUp(self) -> None: # 读取Excel里数据 excel_handler = ExcelHandler(config.data_path) data = excel_handler.total_test("recharge") # 读取yaml里的数据 # yaml_data =YamlHandler(config.yaml_config_path).yaml_read() logger = LoggerHandler( name=yaml_data["logger"]["name"], level=yaml_data["logger"]["level"], file=yaml_data["logger"]["file"], ) def setUp(self) -> None: # 实例化 self.req = RequestHandler() # 一次操作用的是一个db对象,所以放前置条件当中 self.db = DBhandler(host=yaml_data["database"]["host"], port=yaml_data["database"]["port"], password=yaml_data["database"]["password"], user=yaml_data["database"]["user"], charset=yaml_data["database"]["charset"], database=yaml_data["database"]["database"]) # 登录 # save_token() # self.token=Context.token # self.member_id=Context.member_id def tearDown(self) -> None: # 关闭浏览器 self.req.close_session() self.db.close() @ddt.data(*data) def test_recharge(self, test_data): """充值接口 1、替换json数据当中member_id 2、访问接口,得到实际结果 3、断言实际结果,同时需要查数据库里面充值金额是否正确""" # 进行充值时候member_id是动态变化的,amount是规定好的可以写死,headers里需要用登陆时候返回的token: # 处理token第一种:在Excel里的headers里,用## 动态生成,然后用replace替换;第二种是在前置条件登陆中拿到token,然后再发送requests请求中的headers上拼接上token # 充值之前,查询数据库,获取充值之前的余额 member_id = Context().member_id token = Context().token sql = "select * from member where id=%s;" user = self.db.query(sql, args=[member_id]) before_money = user["leave_amount"] if "#member_id#" in test_data["json"]: test_data["json"] = test_data["json"].replace( "#member_id#", str(member_id)) # 错误的用户名用例,只要不要等于当前登录的id就行,可以id+1 +2 都行 if "#other_id#" in test_data["json"]: test_data["json"] = test_data["json"].replace( "#other_id#", str(member_id + 1)) # 读取Excel中headers,这个得到的是字典 headers = json.loads(test_data["headers"]) # 得到Authorization信息头 headers["Authorization"] = token res = self.req.visit(test_data["method"], config.host + test_data["url"], json=json.loads(test_data["json"]), headers=headers) print(res) # 获得expected,然后断言 try: self.assertEqual(test_data["expected"], res["code"]) # 第二次断言,充值成功的用例需要进行数据库校验,金额 # 判断是否为成功用例,通过返回码判断,如果没有code可以用msg 或者在Excel新增一列tag ,success if res["code"] == 0: # 查看数据库结果,充值之前的金额+ 充值的金额=充值后的金额 money = json.loads(test_data["json"])["amount"] # 获取充值之前的金额:第一种办法是通过save_token返回的leave_amount,这个方法如果是多次充值的时候,会获取失败,为此应该把save_token()放前置条件中,保证每次用例之前都获取一次 sql = "select * from member where id=%s;" after_user = self.db.query(sql, args=[member_id]) after_money = after_user["leave_amount"] self.assertEqual(before_money + Decimal(money), after_money) # 写入Excel 中实际结果 self.excel_handler.write_cell("recharge", config.data_path, test_data["case_id"] + 1, 9, "用例通过") except AssertionError as e: # 记录logger self.logger.error("测试用例失败".format(e)) # 手动抛出异常,否则测试用例会自动通过,写入Excel self.excel_handler.write_cell("recharge", config.data_path, test_data["case_id"] + 1, 9, "用例失败") raise e
class TestRegister(unittest.TestCase): # def setUp(self) -> None: # 读取Excel里数据 excel_handler = ExcelHandler(config.data_path) data = excel_handler.total_test("register") # 读取yaml里的数据 logger = LoggerHandler( name=yaml_data["logger"]["name"], level=yaml_data["logger"]["level"], file=yaml_data["logger"]["file"], ) def setUp(self) -> None: # 实例化 self.req = RequestHandler() # 一次操作用的是一个db对象,所以放前置条件当中 self.db = DBhandler(host=yaml_data["database"]["host"], port=yaml_data["database"]["port"], password=yaml_data["database"]["password"], user=yaml_data["database"]["user"], charset=yaml_data["database"]["charset"], database=yaml_data["database"]["database"]) def tearDown(self) -> None: # 关闭浏览器 self.req.close_session() self.db.close() @ddt.data(*data) def test_register(self, test_data): print(test_data) # 先判断test_data["json"]里如果出现了#exist# 就使用get_mobile随机生成手机号码 # 查询数据库,如果数据库存在该号码,就使用整个号码,但是整个存在的概率很低,查询不到这个号码,那么Excel中这个用例就有问题 # 所以先不生成手机号码,先随机从数据库中拿一个已经存在的号码,直接使用该号码替换 # 然后再用replace替换"#exist#" if "#exist#" in test_data["json"]: mobile = self.db.query("select * from member limit 1 ;") # 判断:如果从数据库中能查到一条记录就替换,如果数据库是空数据库就会执行else # 上面的mobile得到的是一个字典,我们需要的是字典里的mobile_phone值 if mobile: # 注意replace替换的一定是一个字符串,如果是数字需要转化 test_data["json"] = test_data["json"].replace( "#exist#", mobile["mobile_phone"]) else: # 随机生成一个 13311112222,如果在库中还是不存在这条用例就会不通过 # 解决办法:写个注册成功步骤,放到help函数当中,直接调用对应的方法进行注册 # 先随机生成一个手机号码然后去用request发送注册成功的请求,或者通过db对象往数据库中插入一个手机号码也行,但是不提倡 pass if "#new#" in test_data["json"]: # 先判断test_data["json"]里如果出现了#new# 就使用get_mobile随机生成手机号码 # 查询数据库,如果数据库存在该号码,就再随机生成一个新号码,直到数据库中不存在为止 while True: mobilephone = get_mobile() mobile = self.db.query( "select * from member where mobile_phone=%s;", args=[mobilephone]) # 判断:如果随机生成的号码在数据库中就再次循环随机生成一个号码,如果随机生成的号码不在数据库就跳出循环,执行后面的替换语句 if not mobile: break test_data["json"] = test_data["json"].replace("#new#", mobilephone) # 访问接口,得到实际结果,res返回的是字典类型,Python里字典,json在Python里是字符串的形式 res = self.req.visit(test_data["method"], config.host + test_data["url"], json=json.loads(test_data["json"]), headers=json.loads(test_data["headers"])) # 获得expected,然后断言 try: self.assertEqual(test_data["expected"], res["code"]) # 写入Excel 中实际结果 a = self.excel_handler.write_cell("register", config.data_path, test_data["case_id"] + 1, 9, "用例通过") print(a) except AssertionError as e: # 记录logger self.logger.error("测试用例失败".format(e)) # 手动抛出异常,否则测试用例会自动通过,写入Excel self.excel_handler.write_cell("register", config.data_path, test_data["case_id"] + 1, 9, "用例失败") raise e
class TestLogin(unittest.TestCase): # def setUp(self) -> None: # 读取Excel里数据 excel_handler=ExcelHandler(config.data_path) data=excel_handler.total_test("login") # 读取yaml里的数据 # yaml_data =YamlHandler(config.yaml_config_path).yaml_read() logger=LoggerHandler(name=yaml_data["logger"]["name"], level=yaml_data["logger"]["level"], file=yaml_data["logger"]["file"],) def setUp(self) -> None: # 实例化 self.req=RequestHandler() # 一次操作用的是一个db对象,所以放前置条件当中 self.db=DBhandler(host=yaml_data["database"]["host"], port=yaml_data["database"]["port"], password=yaml_data["database"]["password"], user=yaml_data["database"]["user"], charset=yaml_data["database"]["charset"], database=yaml_data["database"]["database"]) def tearDown(self) -> None: # 关闭浏览器 self.req.close_session() self.db.close() @ddt.data(*data) def test_login(self,test_data): print(test_data) # if "#exist#" in test_data["json"]: # # 如果是一个已经存在的手机号码,就直接拿数据库的一个号码,然后登陆成功 # mobile=self.db.query("select * from member limit 1;") # print(mobile) # test_data["json"]=test_data["json"].replace("#exist#",mobile["mobile_phone"]) # test_data["json"]=test_data["json"].replace("#existpwd#",mobile["pwd"]) # print(test_data) if "#not exist#" in test_data["json"]: while True: mobilephone = get_mobile() mobile=self.db.query("select * from member where mobile_phone=%s;",args=[mobilephone]) if not mobile: break test_data["json"]=test_data["json"].replace("#not exist#",mobilephone) res=self.req.visit(test_data["method"], config.host+test_data["url"], json=json.loads(test_data["json"]), headers=json.loads(test_data["headers"])) print(res) # 获得expected,然后断言 try: self.assertEqual(test_data["expected"],res["code"]) # 写入Excel 中实际结果 self.excel_handler.write_cell("login",config.data_path,test_data["case_id"]+1,9,"用例通过") except AssertionError as e: # 记录logger self.logger.error("测试用例失败".format(e)) # 手动抛出异常,否则测试用例会自动通过,写入Excel self.excel_handler.write_cell("login",config.data_path,test_data["case_id"]+1,9,"用例失败") raise e
class TestWithdraw(unittest.TestCase): # 读取Excel里数据 excel_handler = ExcelHandler(config.data_path) data = excel_handler.total_test("withdraw") logger = LoggerHandler( name=yaml_data["logger"]["name"], level=yaml_data["logger"]["level"], file=yaml_data["logger"]["file"], ) def setUp(self) -> None: # 实例化 self.req = RequestHandler() # 一次操作用的是一个db对象,所以放前置条件当中 self.db = DBhandler(host=yaml_data["database"]["host"], port=yaml_data["database"]["port"], password=yaml_data["database"]["password"], user=yaml_data["database"]["user"], charset=yaml_data["database"]["charset"], database=yaml_data["database"]["database"]) # # 登录 # save_token() # self.token=Context.token # self.member_id=Context.member_id def tearDown(self) -> None: # 关闭浏览器 self.req.close_session() self.db.close() @ddt.data(*data) def test_withdraw(self, test_data): """"提现接口 1、替换json数据当中member_id 2、访问接口,得到实际结果 3、断言实际结果,同时需要查数据库里面提现后金额是否正确""" member_id = Context().member_id token = Context().token sql = "select * from member where id=%s;" user = self.db.query(sql, args=[member_id]) before_money = user["leave_amount"] if "*member_id*" in test_data["json"]: test_data["json"] = test_data["json"].replace( "*member_id*", str(member_id)) if "*other_id*" in test_data["json"]: test_data["json"] = test_data["json"].replace( "*member_id*", str(member_id + 1)) if "#amount#" in test_data["json"]: test_data["json"] = test_data["json"].replace( "#amount#", str(before_money + Decimal(100))) headers = json.loads(test_data["headers"]) headers["Authorization"] = token res = self.req.visit(test_data["method"], config.host + test_data["url"], json=json.loads(test_data["json"]), headers=headers) try: self.assertEqual(test_data["expected"], res["code"]) # 数据库断言 if res["code"] == 0: money = json.loads(test_data["json"])["amount"] sql = "select * from member where id=%s;" after_user = self.db.query(sql, args=[member_id]) after_money = after_user["leave_amount"] self.assertEqual(before_money - Decimal(money), after_money) # 写入Excel 中实际结果 self.excel_handler.write_cell("withdraw", config.data_path, test_data["case_id"] + 1, 9, "用例通过") except AssertionError as e: # 记录logger self.logger.error("测试用例失败".format(e)) # 手动抛出异常,否则测试用例会自动通过,写入Excel self.excel_handler.write_cell("withdraw", config.data_path, test_data["case_id"] + 1, 9, "用例失败") raise e