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
        - 创建日志收集器对象
        - 设置收集等级
        - 创建日志输出渠道:
            - 输出到控制台(设置等级)
            - 输出到文件(设置等级)
        - 创建日志输出格式
            - 把输出格式添加到输出渠道上
        - 将收集器输出渠道添加到收集器上
        
    """
  • 相关阅读:
    随机森林算法参数调优
    BAYES和朴素BAYES
    阿里云 金融接口 token PHP
    PHP mysql 按时间分组 表格table 跨度 rowspan
    MySql按周,按月,按日分组统计数据
    PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
    thinkphp5 tp5 会话控制 session 登录 退出 检查检验登录 判断是否应该跳转到上次url
    微信 模板消息
    php 腾讯 地图 api 计算 坐标 两点 距离 微信 网页 WebService API
    php添加http头禁止浏览器缓存
  • 原文地址:https://www.cnblogs.com/python-test001/p/12456995.html
Copyright © 2011-2022 走看看