一、logging模块日志级别介绍
日志一共分成5个等级,从低到高分别是:
DEBUG 输出详细的运行情况,主要用于调试
INFO 确认一切预期运行,一般用于输出重要运行情况
WARNING 一些意想不到的事情发生了(例如:"警告内存不足"),但是这个软件还能按预期工作,在不久 将来会出现问题
ERROR 发生了错误,软件没能执行一些功能,还可以继续执行
CRITICAL 一个严重的错误,表明程序本身可能无法继续运行
这5个等级,也分别对应5种打日志的方法:debug、info、warning、error、critical,默认的是WARNING、当在WARNING或之上时才被跟踪
# 开始使用log功能
logging.debug("这是DEBUG等级的信息")
logging.info("这是INFO等级的信息")
logging.warning("这是WARNING等级的信息")
logging.error("这是ERROR等级的信息")
logging.critical("这是CRITICAL等级的信息")
importunittestimporttest_casesfrom HTMLTestRunnerNew importHTMLTestRunnerfrom mylogger importlog#创建测试套件
suite =unittest.TestSuite()
log.info("测试套件创建成功")#加载用例用例到套件
loader =unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(test_cases))
log.info("测试套件加载完毕")
with open('zy_report.html', 'wb') as fb:#创建测试运行程序
runner = HTMLTestRunner(stream=fb,
title='柠檬班测试报告',
description='这是我们21期的第一份报告作业',
tester='MuSen')#执行测试套件中的用例
runner.run(suite)
importtimeimportunittestfrom register importregisterfrom read_excle02 importReadExclefrom Day16_2020_03_10.project_V1.ddt importddt, datafrom mylogger importlog"""ddt:能够实现数据驱动:通过用例数据,自动生成测试用例
自动遍历用例数据,去生成测试用例,
没遍历出来一条用例的数据,会当成一个参数,传到生成的用例中去"""@ddtclassRegisterTestCase(unittest.TestCase):
excle= ReadExcle("cases.xlsx", 'register')
cases=excle.read_data_obj()
@data(*cases)deftest_register(self, case):#第一步 准备用例数据
#获取用例的行号
row = case.case_id + 1
#获取预期结果,eval字符串换行为列表
excepted =eval(case.excepted)#获取用例入参
data =eval(case.data)#第二步: 调用功能函数,获取实际结果
res = register(*data)#第三步:比对预期结果和实际结果
try:
self.assertEqual(excepted, res)exceptAssertionError as e:
log.info("用例:{}执行未通过".format(case.title))
self.excle.write_data(row=row, column=5, value="未通过")
log.error(e)raiseeelse:
log.info("用例:{}执行通过".format(case.title))
self.excle.write_data(row=row, column=5, value="通过")
importopenpyxlclassCaseData:"""测试用例数据类,专门用来创建对象,存放用例数据"""
pass
classReadExcle(object):def __init__(self, filename, sheetname):
self.filename=filename
self.sheetname=sheetnamedefopen(self):"""打开工作表和表单"""self.wb=openpyxl.load_workbook(self.filename)
self.sh=self.wb[self.sheetname]defread_data(self):"""读取数据的方法"""
#打开工作簿和表单
self.open()#将表单中的内容,按行获取所有的格子
rows =list(self.sh.rows)#创建一个空列表,用例存放所有的用例数据
cases =[]#获取表头,放到一个列表中
title = [c.value for c inrows[0]]#获取除表头以外的其他行中的数据
for r in rows[1:]:#每遍历一行,创建一个列表,用例存放该行的数据
data = [c.value for c inr]#将表头和该行的数据进行聚合打包,转换字典
case_data =dict(zip(title, data))#将该行的用例数据加入到cases这个列表中
cases.append(case_data)#关闭工作簿对象
self.wb.close()#将读取好的数据返回出去
returncasesdefread_data_obj(self):"""读取数据的方法,数据返回的是列表嵌套对象的形式"""
#打开工作簿和表单
self.open()#将表单中的内容,按行获取所有的格子
rows =list(self.sh.rows)#创建一个空列表,用例存放所有的用例数据
cases =[]#通过列表推导式获取表头,放到一个列表中
title = [c.value for c inrows[0]]#获取除表头以外的其他行中的数据
for r in rows[1:]:#通过列表推导式,获取改行的数据,放到一个列表中
data = [c.value for c inr]#创建一个用例数据对象
case =CaseData()#将表头和该行的数据进行聚合打包,然后进行遍历
for i inzip(title, data):#通过反射机制,将表头设为对象属性,对应值设为对象的属性值
setattr(case, i[0], i[1])#将该行的用例数据加入到cases这个列表中
cases.append(case)#关闭工作薄
self.wb.close()#将读取好的数据返回出去
returncasesdefwrite_data(self, row, column, value):"""写入数据"""
#打开工作簿和表单
self.open()#写入内容
self.sh.cell(row=row, column=column, value=value)#保存文件
self.wb.save(self.filename)#关闭工作簿
self.wb.close()if __name__ == '__main__':
read= ReadExcle('cases.xlsx', 'register')#读取
#data = read.read_data_obj()
#print(data)
#read.write_data(2, 4, '通过')
#read.write_data(3, 4, '未通过')
封装日志类信息
importloggingclassMyLoger(object):#设置类方法
@classmethoddefcreate_log(cls):"""创建日志收集器"""
#创建一个日志收集器
my_log = logging.getLogger("my_log")#设置日志收集器的收集的输入等级
my_log.setLevel("DEBUG")#设置日志输出的格式:等级,时间,模块,
formater = logging.Formatter("%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s")#日志的输出
#创建一个输出到控制台的日志输出渠道
sh =logging.StreamHandler()
sh.setLevel("DEBUG")#设置日志输出的格式输出到:控制台
sh.setFormatter(formater)#设置输出到渠道的日志格式
my_log.addHandler(sh)#创建一个输出到文件的渠道
fh = logging.FileHandler(filename="test.log", encoding="utf8")
fh.setLevel("DEBUG")#设置输出到文件的日志格式
fh.setFormatter(formater)
my_log.addHandler(fh)returnmy_log
log=MyLoger.create_log()if __name__ == "__main__":
log=MyLoger.create_log()
log.info("hello world")
"""单元测试
unittest:四大核心概念
- 测试用例
- TestCase:测试用例类
- 测试用例中test开头的方法就是一个测试用例
- 测试套件
- TestSuite:创建测试套件
- 添加用例到套件:单条 类 模块
- 测试运行程序
- HTMLTestRunnerNew:创建运行程序,可以生成测试报告
- 测试环境的初始化和恢复
- setUP:每条用例执行前执行
- TearDown:每条用例执行之后执行
## openpyxl
- load_workbook:打开一个工作薄(传入一个excel文件)
- wb[表单名]:选择表单
- 表单对象.cell(row,column)
## ddt
- ddt
- 在测试用例类上@ddt
- data
- 测试用例方法上@data(*data)
## logging
- 创建日志收集器对象
- 设置收集等级
- 创建日志输出渠道:
- 输出到控制台(设置等级)
- 输出到文件(设置等级)
- 创建日志输出格式
- 把输出格式添加到输出渠道上
- 将收集器输出渠道添加到收集器上"""