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

时间:2020-03-10
本文章向大家介绍【python自动化框架搭建】logging模块日志模块和单元测试课程总结(第16天课堂笔记),主要包括【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
    - 创建日志收集器对象
    - 设置收集等级
    - 创建日志输出渠道:
        - 输出到控制台(设置等级)
        - 输出到文件(设置等级)
    - 创建日志输出格式
        - 把输出格式添加到输出渠道上
    - 将收集器输出渠道添加到收集器上
    
"""

原文地址:https://www.cnblogs.com/python-test001/p/12456995.html