zoukankan      html  css  js  c++  java
  • 【python自动化框架搭建】logging模块日志模块和单元测试课程总结(第16天课堂笔记)

    一、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
        - 创建日志收集器对象
        - 设置收集等级
        - 创建日志输出渠道:
            - 输出到控制台(设置等级)
            - 输出到文件(设置等级)
        - 创建日志输出格式
            - 把输出格式添加到输出渠道上
        - 将收集器输出渠道添加到收集器上
        
    """
  • 相关阅读:
    iOS开发-类簇(Class Cluster)
    算法-有向图及可达性
    算法-无向图(连通分量,是否有环和二分图)
    算法-无向图(深度优先搜索和广度优先搜索)
    算法-无向图
    算法-散列表
    Red-Gate.NET.Reflector.v8.0.1.308(内含注册机Keygen与注册图解)
    [转]c#快捷键
    Windows常用性能计数器总结
    [转]C#程序性能优化
  • 原文地址:https://www.cnblogs.com/python-test001/p/12456995.html
Copyright © 2011-2022 走看看