def test_audit(self, case): # 第一步:准备用例数据 # 替换动态化的参数 url = myconf.get('url', 'url') + case.url case.data = data_replace(case.data) # 判断是否有有*loan_id*的参数要替换 if "*loan_id*" in case.data: max_id = self.db.fetchone("SELECT max(id) FROM loan")[0] loan_id = max_id + 1 case.data = case.data.replace("*loan_id*", str(loan_id)) # 第二步:读取配置文件,发送请求,将请求内容输出日志到指定目录,获取请求结果 my_log.info("请求地址:{},请求接口{},请求内容:{}".format(url, case.interface, eval(case.data))) response = self.http.request(method=case.method, url=url, data=eval(case.data)) res = response.json() # 判断是否在执行加标的测试用例 if case.interface == '加标': loan_id = self.db.fetchone( 'select id from loan where MemberID = "{}" order by id desc'. format(myconf.get('data', 'memberId'))) # 将添加的标id,保存为临时变量 setattr(ConText, 'loan_id', loan_id[0])
def __init__(self): # 建立连接 self.conn = pymysql.connect( host=myconf.get('mysql', 'host'), # 数据库地址 port=myconf.getint('mysql', 'port'), # 端口 user=myconf.get('mysql', 'user'), # 账号 password=myconf.get('mysql', 'password'), # 密码 database=myconf.get('mysql', 'database'), # 数据库名 charset='utf8' # 指定编码格式 ) # 创建一个游标 self.cur = self.conn.cursor()
class WithdrawTestCase(unittest.TestCase): '''取现接口的测试用例类''' excel = ReadExcel(data_file_path,'withdraw') cases = excel.read_cases_obj() http = HTTPSession() db = ReadSQL() @data(*cases) def test_withdraw(self,case): # 第一步:准备用例数据 # 替换动态化的参数 data = data_replace(case.data) # 获取取现之前的账户余额 if case.check_sql: # 将需要格式化的字符串提取出来,替换为格式化的参数 case.check_sql = case.check_sql.replace('#phone#', myconf.get('data', 'phone')) start_money = self.db.fetchone(case.check_sql)[0] print('提现前用户账户余额:{}'.format(start_money)) # 第二步:读取配置文件,发送请求,将请求内容输出日志到指定目录,获取请求结果 my_log.info("请求地址:{},请求接口{},请求内容:{}".format(myconf.get('url','url')+case.url,case.interface,eval(data))) response = self.http.request(method=case.method,url=myconf.get('url','url')+case.url,data=eval(data)) res = response.json() # 第三步:对比实际和预期结果 try: self.assertEqual(str(case.excepted_code),res['code']) if case.check_sql: # 将需要格式化的字符串提取出来,替换为格式化的参数 case.check_sql = case.check_sql.replace('#phone#',myconf.get('data','phone')) # 获取取现用例之后的余额 end_money = self.db.fetchone(case.check_sql)[0] print('取现后用户账户余额:{}'.format(end_money)) # 获取本次取现余额 money = eval(case.data)['amount'] # decimal.Decimal(str(money)) # 获取数据库变化的金额 change_money = start_money-end_money # 对比提现金额和数据库变化金额 self.assertEqual(money,float(change_money)) except AssertionError as error: print('测试用例不通过') print('预期响应状态码为:{}'.format(case.excepted_code)) print('实际响应状态码为:{}'.format(res['code'])) self.excel.write_data(row=case.case_id+1,column=8,value='failed') my_log.info('用例{}执行未通过'.format(case.title)) my_log.exception(error) raise error else: print('测试用例通过') print('预期响应状态码为:{}'.format(case.excepted_code)) print('实际响应状态码为:{}'.format(res['code'])) self.excel.write_data(row=case.case_id + 1, column=8, value='passed') my_log.info('用例{}执行通过'.format(case.title))
def test_case_register(self, case): '''注册模块的用例执行逻辑''' # 第一步:准备测试用例数据 # 随机生成手机号码 phone = self.random_phone() # 替换动态化的参数random_phone re_data = case.data.replace('*random_phone*', phone) # 判断替换后的数据是否还有要替换的参数,如果有就调取函数,将参数替换为配置文件中的数据内容 data = data_replace(re_data) # 第二步:读取配置文件,准备发送请求,将请求内容输出到日志文件,并获取响应结果 my_log.info('请求地址{},请求接口{},请求内容:{}'.format( case.method, myconf.get('url', 'url') + case.url, case.interface, eval(data))) response = self.http.request(case.method, myconf.get('url', 'url') + case.url, eval(data)) res = response.json() # 第三步:对比预期和实际结果 try: self.assertEqual(eval(case.excepted), res) # 判断是否要进行sql校验 if case.check_sql: # 将需要格式化的字符串提取出来,替换为格式化的参数 case.check_sql = case.check_sql.replace( '*random_phone*', phone) # 获取实际数据库查询结果 db_res = self.db.find_count(case.check_sql) # 对比预期和实际结果 self.assertEqual(1, db_res) except AssertionError as error: # 在测试报告中打印实际和预期结果 print('用例测试不通过') print('实际结果为:{}'.format(res)) print('预期结果为:{}'.format(case.excepted)) # 将测试结果写入测试数据中 self.excel.write_data(case.case_id + 1, 8, 'failed') # 输出日志到日志文件 my_log.debug('用例:{}测试不通过'.format(case.title)) raise error else: # 在测试报告中打印实际和预期结果 print('用例测试通过') print('实际结果为:{}'.format(res)) print('预期结果为:{}'.format(case.excepted)) # 将测试结果写入测试数据中 self.excel.write_data(case.case_id + 1, 8, 'passed') # 输出日志到日志文件 my_log.debug('用例:{}测试通过'.format(case.title))
def test_withdraw(self,case): # 第一步:准备用例数据 # 替换动态化的参数 data = data_replace(case.data) # 获取取现之前的账户余额 if case.check_sql: # 将需要格式化的字符串提取出来,替换为格式化的参数 case.check_sql = case.check_sql.replace('#phone#', myconf.get('data', 'phone')) start_money = self.db.fetchone(case.check_sql)[0] print('提现前用户账户余额:{}'.format(start_money))
def data_replace(data): '''动态替换用例数据''' while re.search(r'#(.+?)#', data): res = re.search(r'#(.+?)#', data) # 提取要替换的内容 re_data = res.group() # 提取要替换的字段 key = res.group(1) try: # 去配置文件中读取字段对应的数据内容 value = myconf.get('data', key) except: value = getattr(ConText, key) # 进行替换 data = re.sub(re_data, str(value), data) # # 替换 # data = re.sub(re_data,value,data) return data
def test_case_login(self,case): '''登录接口用例执行逻辑''' # 第一步:准备测试用例数据 url = myconf.get('url','url')+case.url method = case.method excepted = eval(case.excepted) # 替换要格式化的用例参数 data = data_replace(case.data) # print(data,type(data)) # 第二步:读取配置文件,发送请求,将请求内容输出日志到指定目录,获取请求结果 my_log.info('请求地址{},请求接口{},请求内容:{}'.format(url,case.interface,data)) response = self.http.request(method=method,url=url,data=eval(data)) res = response.json() # 第三步:对比实际和预期结果,断言是否测试通过 try: self.assertEqual(excepted,res) # if case.check_sql: # case.check_sql=case.check_sql.replace('#phone#',myconf.get('data','phone')) # db_res = self.db.find_count(case.check_sql) # self.assertEqual(1,db_res) except AssertionError as error: print('测试用例不通过') print('预期结果为:{}'.format(excepted)) print('实际结果为:{}'.format(res)) # 将断言结果写入测试数据中 self.excel.write_data(case.case_id+1,8,'failed') # 将执行的测试用例title输出到日志 my_log.debug('{}用例执行未通过'.format(case.title)) raise error else: print('测试用例通过') print('预期结果为:{}'.format(excepted)) print('实际结果为:{}'.format(res)) # 将断言结果写入测试数据中 self.excel.write_data(case.case_id+1,8,'passed') # 将执行的测试用例title输出到日志 my_log.debug('{}用例执行通过'.format(case.title))
import time import unittest from interface_object03.common.read_config import myconf from HTMLTestRunnerNew import HTMLTestRunner from interface_object03.common.mylog import my_log from interface_object03.common.constant import CASE_DIR,REPORT_DIR # 项目开始时输出日志 my_log.info("------开始执行测试运行程序------") # 第一步:创建测试套件 suite = unittest.TestSuite() # 第二步:将用例添加到测试套件 loader = unittest.TestLoader() suite.addTest(loader.discover(CASE_DIR)) # 第三步:执行用例,生成测试报告 # 从配置文件中读取测试报告的名称,并和路径拼接生成一个指定路径指定名称的测试报告 file_name = myconf.get('report','file_name') report = os.path.join(REPORT_DIR,file_name) with open(report,'wb') as new: runner = HTMLTestRunner( stream=new, verbosity=2, title='report01', description='接口测试报告', tester='可乐' ) runner.run(suite) # 用例执行结束输入日志 my_log.info('------用例执行结束------')
""" =============== author:Administrator time:16:06 E-mail:[email protected] =============== """ import os import logging from interface_object03.common.read_config import myconf from interface_object03.common.constant import LOG_DIR # 读取配置文件中log区域的配置内容 log_level = myconf.get('log', 'log_level') fh_level = myconf.get('log', 'fh_level') sh_level = myconf.get('log', 'sh_level') filename = myconf.get('log', 'filename') # 拼接日志文件路径 file_path = os.path.join(LOG_DIR, filename) class MyLog(object): def __new__(cls, *args, **kwargs): '''创建对象''' # 第一步:创建日志收集器,根据配置文件获取收集器设置的收集日志的等级 my_log = logging.getLogger('my_log') my_log.setLevel(log_level) # 第二步:创建日志输出渠道,根据配置文件获取渠道设置的收集日志的等级,输出到控制台 sh = logging.StreamHandler() sh.setLevel(sh_level)
=============== """ ''' 封装一个替换数据的方法: 封装的需求: 1、替换用例中的参数 2、简化替换的流程 实现思路: 1、获取用例数据 2、判断该用例数据是否有需要替换的参数 3、对数据进行替换 ''' import re from interface_object03.common.read_config import myconf s = "{'mobilephone':'#phone#','pwd':'#pwd#','regname':'LL'}" # 第一步:通过search进行匹配 # 第二步:判断是否匹配到数据 while re.search(r'#(.+?)#', s): res = re.search(r'#(.+?)#', s) # 获取匹配内容 rdata = res.group() # 提取要替换的字段 key = res.group(1) # 通过提取的字段,去配置文件中读取对应的数据内容 phone = myconf.get('data', key) # 进行替换 # print(rdata,phone) s = re.sub(rdata, phone, s) print(s)
if '*memberId*' in case.data: # 获取数据库用户表当前最大的会员id max_id = self.db.fetchone("select max(id) from member")[0] # 将要加标的新会员id memberId = max_id+1 # 替换用例数据中的会员id case.data = case.data.replace('*memberId*',str(memberId)) # 判断是否需要sql校验 if case.check_sql: case.check_sql = data_replace(case.check_sql) # 获取当前用户加标前的标数量 start_count = self.db.find_count(case.check_sql) # 第二步:读取配置文件,发送请求,将请求内容输出日志到指定目录,获取请求结果 my_log.info("请求地址:{},请求接口{},请求内容:{}".format(myconf.get('url','url')+case.url,case.interface,eval(case.data))) response = self.http.request(method=case.method,url=myconf.get('url','url')+case.url,data=eval(case.data)) res = response.json() # 第三步:对比实际和预期结果 try: self.assertEqual(str(case.excepted_code),res['code']) if case.check_sql: # 获取加标之后的当前用户的标数量 end_count = self.db.find_count(case.check_sql) self.assertEqual(1,end_count - start_count) except AssertionError as error: print('测试用例不通过') print('实际响应状态码为:{}'.format(res['code'])) print('预期响应状态码为:{}'.format(case.excepted_code)) self.excel.write_data(row=case.case_id+1,column=8,value='failed')