def test_case_audit(self, case): """审核接口用例执行的逻辑""" #准备测试用例 url = myconf.get('url', 'url') + case.url # 拼接完整的URL地址 row = case.case_id + 1 # 替换用例参数 case.data = replace(case.data) # 判断是否有*memberId*的参数需要替换 if "*loan_id*" in case.data: max_id = self.db.find_one("select max(id) from loan")[ 0] # findone()返回的是元组,要加下标才能获取到元素 loan_id = max_id + 1 # 在数据库中查找到最大的id号,加1后替换给*memberId* case.data = case.data.replace("*loan_id*", str(loan_id)) #发送请求到接口,获取结果 log.info("正在请求地址{}".format(url)) response = self.http.request(method=case.method, url=url, data=eval(case.data)) res = response.json() print(res) #判断是否是执行的加标用例 if case.interface == "加标": loan_id = self.db.find_one( "select id from loan where memberId ='{}' order by id desc". format(myconf.get("data", "memberId")))[0] #"SELECT Id FROM loan WHERE MemberId='{}' ORDER BY id DESC".format(myconf.get('data', 'memberId'))) # 将添加的标id,保存为临时变量 setattr(ConText, 'loan_id', loan_id) #对象(类)属性名 属性值
def test_case_login(self,case): """登录接口用例执行的逻辑""" #准备测试用例 url=myconf.get('url',"url")+case.url#字符串连接用+ #url=case.url #data=eval(case.data) method=case.method excepted=eval(case.excepted) row=case.case_id + 1 # 替换用例参数 # if "#phone#" in case.data: #手机号和密码都要替换,这样比较繁琐,封装正则类来替换 # case.data.replace("#phone#",myconf.get("data","phone")) data=replace(case.data) #发送请求到接口,获取结果 log.info("正在请求地址{}".format(url)) response=self.http.request(method=method,url=url,data=eval(data)) res=response.json() #对比预期结果 #self.assertEqual(excepted,res) try: self.assertEqual(excepted,res) except AssertionError as e: """测试用例未通过""" self.excel.write_data(row, 8, '未通过') log.debug("{},该条用例执行未通过".format(case.title)) log.error(e) raise e else: self.excel.write_data(row, 8, '通过') log.debug("{},该条用例执行通过".format(case.title))
class WithdrawTestCase(unittest.TestCase): """取现接口""" excel = ReadExcel(os.path.join(DATA_DIR, "cases1.xlsx"), "withdraw") cases = excel.read_data_obj() http = HTTPSession() #类属性 db = ReadSQL() #创建db对象 @data(*cases) def test_case_withdraw(self, case): """取现接口用例执行的逻辑""" #准备测试用例数据 url = myconf.get('url', "url") + case.url # 拼接完整的URL地址 data = eval(case.data) method = case.method row = case.case_id + 1 # 替换用例参数 case.data = replace(case.data) if case.check_sql: case.check_sql = replace(case.check_sql) start_money = ReadSQL().find_one(case.check_sql)[0] print('取现之前用户的余额为{}'.format(start_money)) #发送请求到接口,获取结果 log.info("正在请求地址{}".format(url)) response = self.http.request(method=method, url=url, data=eval(case.data)) res = response.json() #对比预期结果 try: # 判断是否需要进行SQL校验 if case.check_sql: # 如果此字段有数据,条件成立 # 获取取现用例执行之后的余额 end_money = self.db.find_one(case.check_sql)[0] print('取现之后用户的余额为{}'.format(end_money)) # 获取本次充值的金额 money = eval(case.data)['amount'] money = decimal.Decimal(str(money)) print('本次取现的金额{}'.format(money)) # 获取数据库变化的金额 change_money = start_money - end_money self.assertEqual(money, change_money) self.assertEqual(str(case.excepted_code), res["code"]) except AssertionError as e: """测试用例未通过""" self.excel.write_data(row, 8, '未通过') log.info("{},该条用例执行未通过".format(case.title)) log.exception(e) raise e else: self.excel.write_data(row, 8, '通过') log.info("{},该条用例执行通过".format(case.title))
class AddTestCase(unittest.TestCase): """加标接口""" excel = ReadExcel(os.path.join(DATA_DIR, "cases1.xlsx"), "add") cases = excel.read_data_obj() http = HTTPSession() #类属性 db = ReadSQL() #创建db对象 @data(*cases) def test_case_add(self, case): """加标接口用例执行的逻辑""" #准备测试用例 url = myconf.get('url', 'url') + case.url # 拼接完整的URL地址 row = case.case_id + 1 # 替换用例参数 case.data = replace(case.data) #判断是否有*memberId*的参数需要替换 if "*memberId*" in case.data: max_id = self.db.find_one("select max(id) from member")[ 0] #findone()返回的是元组,要加下标才能获取到元素 memberid = max_id + 1 #在数据库中查找到最大的id号,加1后替换给*memberId* case.data = case.data.replace( "*memberId*", str(memberid)) #字符串替换的方法,要记得转换类型为str,否则会报错 #判断是否需要SQL校验 if case.check_sql: #如果case文件里的check_sql有数据,就做替换。 case.check_sql = replace( case.check_sql) #调用封装好的替换类,把其中含有“#memberId#"的替换为从配置文件中获取的值 # 获取当前用户加标前的标数量 start_count = self.db.find_count(case.check_sql) #发送请求到接口,获取结果 log.info("正在请求地址{}".format(url)) response = self.http.request(method=case.method, url=url, data=eval(case.data)) res = response.json() #对比预期结果 try: self.assertEqual(str(case.excepted_code), res["code"]) # 判断是否需要进行SQL校验 if case.check_sql: # 获取当前用户加标后的标数量 end_count = self.db.find_count(case.check_sql) self.assertEqual(1, end_count - start_count) except AssertionError as e: """测试用例未通过""" self.excel.write_data(row, 8, '未通过') log.info("{},该条用例执行未通过".format(case.title)) log.exception(e) raise e else: self.excel.write_data(row, 8, '通过') log.info("{},该条用例执行通过".format(case.title))
def test_case_register(self, case): """登注册接口用例执行的逻辑""" #准备测试用例 url = myconf.get('url', 'url') + case.url # 拼接完整的URL地址 method = case.method excepted = eval(case.excepted) row = case.case_id + 1 # 替换用例参数 case.data = replace(case.data) #随机生成手机号码 phone = self.random_phone() print(phone) #替换动态化的参数,字符串替换方法 case.data = case.data.replace("*phone*", phone) #加星号是为了避免替换掉其他的同名字符,如mobilephone #发送请求到接口,获取结果 log.info("正在请求地址{}".format(url)) response = self.http.request(method=method, url=url, data=eval(case.data)) res = response.json() #对比预期结果 try: self.assertEqual(excepted, res) # 判断是否需要进行SQL校验 if case.check_sql: # 如果此字段有数据,条件成立 # 用随机生成的手机号替换需要校验的SQL语句中的手机号 case.check_sql = case.check_sql.replace('*phone*', phone) db_res = self.db.find_count(case.check_sql) self.assertEqual(1, db_res) except AssertionError as e: """测试用例未通过""" self.excel.write_data(row, 8, '未通过') log.info("{},该条用例执行未通过".format(case.title)) log.exception(e) raise e else: self.excel.write_data(row, 8, '通过') log.info("{},该条用例执行通过".format(case.title))
# -*- coding: utf-8 -*- # @Time : 2019/8/31 9:51 # @File : run_test.py # @Software: PyCharm #@author:liu import unittest import os import time from HTMLTestRunnerNew import HTMLTestRunner from common.my_logging import log from common.constant import CASES_DIR,REPORT_DIR log.info("正在开启测试运行程序") #创建测试套件 suite=unittest.TestSuite() #将用例添加到套件中 loader=unittest.TestLoader() suite.addTest(loader.discover(CASES_DIR)) #now=time.strftime("%Y-%m-%d %H-%M-%S") #拼接测试报告的路径 #report_file_path=os.path.join(REPORT_DIR,now+"_reports.html") report_file_path=os.path.join(REPORT_DIR,"reports.html") #执行测试用例 with open(report_file_path,"wb") as fb: runner=HTMLTestRunner(stream=fb, verbosity=2, title="21期接口项目", description="项目实战", tester="graceljh") runner.run(suite) log.info("所有用例执行完毕")