一、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等级的信息")
import unittest import test_cases from HTMLTestRunnerNew import HTMLTestRunner from mylogger import log # 创建测试套件 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)
import time import unittest from register import register from read_excle02 import ReadExcle from Day16_2020_03_10.project_V1.ddt import ddt, data from mylogger import log """ ddt:能够实现数据驱动:通过用例数据,自动生成测试用例 自动遍历用例数据,去生成测试用例, 没遍历出来一条用例的数据,会当成一个参数,传到生成的用例中去 """ @ddt class RegisterTestCase(unittest.TestCase): excle = ReadExcle("cases.xlsx", 'register') cases = excle.read_data_obj() @data(*cases) def test_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) except AssertionError as e: log.info("用例:{}执行未通过".format(case.title)) self.excle.write_data(row=row, column=5, value="未通过") log.error(e) raise e else: log.info("用例:{}执行通过".format(case.title)) self.excle.write_data(row=row, column=5, value="通过")
import openpyxl class CaseData: """测试用例数据类,专门用来创建对象,存放用例数据""" pass class ReadExcle(object): def __init__(self, filename, sheetname): self.filename = filename self.sheetname = sheetname def open(self): """打开工作表和表单""" self.wb = openpyxl.load_workbook(self.filename) self.sh = self.wb[self.sheetname] def read_data(self): """读取数据的方法""" # 打开工作簿和表单 self.open() # 将表单中的内容,按行获取所有的格子 rows = list(self.sh.rows) # 创建一个空列表,用例存放所有的用例数据 cases = [] # 获取表头,放到一个列表中 title = [c.value for c in rows[0]] # 获取除表头以外的其他行中的数据 for r in rows[1:]: # 每遍历一行,创建一个列表,用例存放该行的数据 data = [c.value for c in r] # 将表头和该行的数据进行聚合打包,转换字典 case_data = dict(zip(title, data)) # 将该行的用例数据加入到cases这个列表中 cases.append(case_data) # 关闭工作簿对象 self.wb.close() # 将读取好的数据返回出去 return cases def read_data_obj(self): """读取数据的方法,数据返回的是列表嵌套对象的形式""" # 打开工作簿和表单 self.open() # 将表单中的内容,按行获取所有的格子 rows = list(self.sh.rows) # 创建一个空列表,用例存放所有的用例数据 cases = [] # 通过列表推导式获取表头,放到一个列表中 title = [c.value for c in rows[0]] # 获取除表头以外的其他行中的数据 for r in rows[1:]: # 通过列表推导式,获取改行的数据,放到一个列表中 data = [c.value for c in r] # 创建一个用例数据对象 case = CaseData() # 将表头和该行的数据进行聚合打包,然后进行遍历 for i in zip(title, data): # 通过反射机制,将表头设为对象属性,对应值设为对象的属性值 setattr(case, i[0], i[1]) # 将该行的用例数据加入到cases这个列表中 cases.append(case) # 关闭工作薄 self.wb.close() # 将读取好的数据返回出去 return cases def write_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, '未通过')
封装日志类信息
import logging class MyLoger(object): # 设置类方法 @classmethod def create_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) return my_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 - 创建日志收集器对象 - 设置收集等级 - 创建日志输出渠道: - 输出到控制台(设置等级) - 输出到文件(设置等级) - 创建日志输出格式 - 把输出格式添加到输出渠道上 - 将收集器输出渠道添加到收集器上 """