zoukankan      html  css  js  c++  java
  • 封装excel数据层代码,log模块导入

    封装excel操作代码,提高复用率

    整体封装思想阐述:

    表内用例格式构建

    表头,case_id,title,data,expected

    表体,测试用例数据

    首先获取表体第一行的数据组成的列表

    之后获取由二行开始的所有数据,

    之后逐条将表头与数据zip封包,之后转换为字典。

    注意点:

    从excel中读取的数据,除了数值,其他不管保存的时候什么格式,读取出来都是str

    解决该问参考使用eval()方法,本篇不赘述

    上代码

    class HandleExcel:
        """用来操作excel文件的类="""
    
        def __init__(self, filename, sheetname):
            """
            初始化对象属性
            :param filename: excel文件路径
            :param sheetname: 表单名
            """
            self.filename = filename
            self.sheetname = sheetname
    
        def read_data(self):
            """读取excel中的数据"""
            # 获取工作簿对象
            wb = openpyxl.load_workbook(self.filename)
            # 选择表单
            sh = wb[self.sheetname]
            # 按行获取所有的数据,转换为列表
            rows_data = list(sh.rows)
            # 创建一个空列表用来保存所有的用例数据
            cases_data = []
            # 获取表单中的表头数据,放入title这个列表中
            title = []
            for i in rows_data[0]:
                title.append(i.value)
    
            # 获取除表头之外的其他行数据
            for item in rows_data[1:]:
                # 每遍历出来一行数据,就创建一个空列表,来存放该行数据
                values = []
                for i in item:
                    values.append(i.value)
                # 将该行的数据和表头进行打包,转换为字典
                case = dict(zip(title, values))
                # 将该行数据打包的字典,放入cases_data中
                cases_data.append(case)
            # 返回读取出来的所有数据
            return cases_data
    
        def write_data(self, row, column, value):
            """
            写入数据
            :param row: 行
            :param column: 列表
            :param value: 写入的值
            :return:
            """
            # 获取工作簿对象
            wb = openpyxl.load_workbook(self.filename)
            # 选择表单
            sh = wb[self.sheetname]
            # 根据行、列去写入内容
            sh.cell(row=row, column=column, value=value)
            # 把工作簿保存为文件
            wb.save(self.filename)
    

    方法封装成类,并且通过类的init方法来实现参数化。

    调用时只需要实例化Handle类,并传入相应filename,sheetname即可实现对用例数据读取,并且可根据需要扩展写入操作。

    尝试调用

    @ddt
    class RegisterTestCase(unittest.TestCase):
        excel = HandleExcel("cases.xlsx", "register")
        cases = excel.read_data()
    
        @data(*cases)
        def test_register(self, case):
            # 1、准备用例参数
            # 2,调用被测功能函数,传参,得到实际结果
            # 3,断言

    至此,基于python操作excel整理用例数据的自动化雏形实现。

    LOG日志模块引入

    为什么引入?

    记录用例执行,抛出异常,方便测试后回溯

    简单介绍

    import logging
    
    logging.debug("这是一条debug级别的日志")
    logging.info("这是一条info级别的日志")
    logging.warning("这是一条warning级别的日志")
    logging.error("这是一条error级别的日志")
    logging.critical("这是一条critical级别的日志")

    使用步骤

    创建一个日志收集器

    名字自定义,在团队中使用个人姓名即可

    log = logging.getLogger("addicated")  # loger的名字,根据自己喜好来玩

    设置收集器手机的log等级

    log.setLevel("DEBUG")

     

    创建一个输出到文件的输出渠道及输出的log等级

    fh = logging.FileHandler("logname.log",encoding='utf-8')
    fh.setLevel('DEBUG')
    log.addHandler(fh)  # 创建输出渠道之后要将其作为参数添加到log对象中
    # 上面这步容易遗忘,

    创建一个输出到控制台的输出渠道

    sh = logging.StreamHandler()
    sh.setLevel('ERROR')  # 设置输出到控制台的输出等级
    log.addHandler(sh)  # 创建输出渠道之后要将其作为参数添加到log对象中

    设置日志的输出格式

    可在网上找一个恰当美观的格式引入。

    formats='%(asctime)s -- [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s'
    # 创建一个输出格式对象
    form = logging.Formatter(formats)
    # 将输出格式添加到输出渠道
    fh.setFormatter(form)
    sh.setFormatter(form)

    输出日志

    # 输出日志
    # 注意点:自己创建的的日志收集器收集,要使用收集器取记录,不能直接使用logging去记录
    # logging.error("----------------error----------")
    
    log.info("-------------info等级的日志-------------")
    log.error("-------------error等级的日志-------------")

    日志的轮转

    创建一个按时间进行轮转的文件输出渠道

    # fh = TimedRotatingFileHandler("user.log",encoding="utf8",when="S",interval=1,backupCount=7)
    # fh.setLevel("DEBUG")
    # log.addHandler(fh)

    或者按照文件大小进行轮转

    fh = RotatingFileHandler("musen.log",encoding="utf8",maxBytes=1024*1024*20,backupCount=7)
    fh.setLevel("DEBUG")
    log.addHandler(fh)

    和之前的用法相同,添加到llog对象中即可

    最后封装成方法,将log对象返回即可方便在其他类中调用使用。

    完整代码如下

    def create_logger():
        """
        创建日志收集器
        :return: 日志收集器
        """
        # 第一步:创建一个日志收集器
        log = logging.getLogger("addicated")
    
        # 第二步:设置收集器收集的等级
        log.setLevel("DEBUG")
    
        # 第三步:设置输出渠道以及输出渠道的等级
        fh = logging.FileHandler("mylog.log", encoding="utf8")
        fh.setLevel("DEBUG")
        log.addHandler(fh)
    
        sh = logging.StreamHandler()
        sh.setLevel("WARNING")
        log.addHandler(sh)
    
        # 第四步:设置输出格式
        formats = '%(asctime)s -- [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s'
        # 创建一个输出格式对象
        form = logging.Formatter(formats)
        # 将输出格式添加到输出渠道
        fh.setFormatter(form)
        sh.setFormatter(form)
    
        return log
    
    
    
    log = create_logger()
  • 相关阅读:
    NOI Online 2020「Prelude」
    CF704E Iron Man
    luogu P4619 [SDOI2018]旧试题
    luogu P4207 [NOI2005]月下柠檬树
    JOI2020
    luogu P3263 [JLOI2015]有意义的字符串
    p1864
    p1824
    p1836
    p1862
  • 原文地址:https://www.cnblogs.com/addicated/p/13194391.html
Copyright © 2011-2022 走看看