• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python接口自动化浅析logging封装及实战操作

    在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging日志原理及模块操作流程,主要介绍日志相关概念及logging日志模块的操作流程。

    而在此之前介绍过yaml封装,数据驱动、配置文件、日志文件等独立的功能,我们将这些串联起来,形成一个完整的接口测试流程。

    以下主要介绍将logging常用配置放入yaml配置文件、logging日志封装及结合登录用例讲解日志如何在接口测试中运用。

    一、yaml配置文件

    将日志中的常用配置,比如日志器名称、日志器等级及格式化放在配置文件中,在配置文件config.yaml中添加:

    logger:
      name: ITester
      level: DEBUG
      format: '%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s'

    封装logging类,读取yaml中的日志配置。

    二、读取yaml

    之前读写yaml配置文件的类已经封装好,愉快的拿来用即可,读取yaml配置文件中的日志配置。

    yaml_handler.py

    import yaml
    class YamlHandler:
        def __init__(self, file):
            self.file = file
        def read_yaml(self, encoding='utf-8'):
            """读取yaml数据"""
            with open(self.file, encoding=encoding) as f:
                return yaml.load(f.read(), Loader=yaml.FullLoader)
        def write_yaml(self, data, encoding='utf-8'):
            """向yaml文件写入数据"""
            with open(self.file, encoding=encoding, mode='w') as f:
                return yaml.dump(data, stream=f, allow_unicode=True)
    yaml_data = YamlHandler('../config/config.yaml').read_yaml()

    三、封装logging类

    在common目录下新建文件logger_handler.py,用于存放封装的logging类。

    封装思路:

    这里截取logging模块中Logger类的部分源码。

    class Logger(Filterer):
        """
        Instances of the Logger class represent a single logging channel. A
        "logging channel" indicates an area of an application. Exactly how an
        "area" is defined is up to the application developer. Since an
        application can have any number of areas, logging channels are identified
        by a unique string. Application areas can be nested (e.g. an area
        of "input processing" might include sub-areas "read CSV files", "read
        XLS files" and "read Gnumeric files"). To cater for this natural nesting,
        channel names are organized into a namespace hierarchy where levels are
        separated by periods, much like the Java or Python package namespace. So
        in the instance given above, channel names might be "input" for the upper
        level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
        There is no arbitrary limit to the depth of nesting.
        """
        def __init__(self, name, level=NOTSET):
            """
            Initialize the logger with a name and an optional level.
            """
            Filterer.__init__(self)
            self.name = name
            self.level = _checkLevel(level)
            self.parent = None
            self.propagate = True
            self.handlers = []
            self.disabled = False
        def setLevel(self, level):
            """
            Set the logging level of this logger.  level must be an int or a str.
            """
            self.level = _checkLevel(level)

    接下来,我们开始封装logging类。

    logger_handler.py

    import logging
    from common.yaml_handler import yaml_data
    class LoggerHandler(logging.Logger):
        # 继承Logger类
        def __init__(self,
                     name='root',
                     level='DEBUG',
                     file=None,
                     format=None
                     ):
            # 设置收集器
            super().__init__(name)
            # 设置收集器级别
            self.setLevel(level)
            # 设置日志格式
            fmt = logging.Formatter(format)
            # 如果存在文件,就设置文件处理器,日志输出到文件
            if file:
                file_handler = logging.FileHandler(file,encoding='utf-8')
                file_handler.setLevel(level)
                file_handler.setFormatter(fmt)
                self.addHandler(file_handler)
            # 设置StreamHandler,输出日志到控制台
            stream_handler = logging.StreamHandler()
            stream_handler.setLevel(level)
            stream_handler.setFormatter(fmt)
            self.addHandler(stream_handler)
    # 从yaml配置文件中读取logging相关配置
    logger = LoggerHandler(name=yaml_data['logger']['name'],
                           level=yaml_data['logger']['level'],
                           file='../log/log.txt',
                           format=yaml_data['logger']['format'])

    四、logging实战

    在登录用例中运用日志模块,到底在登录代码的哪里使用日志?

    接下来直接上代码,在登录用例中添加日志。

    test_login.py

    import unittest
    from common.requests_handler import RequestsHandler
    from common.excel_handler import ExcelHandler
    import ddt
    import json
    from common.logger_handler import logger
    @ddt.ddt
    class TestLogin(unittest.TestCase):
        # 读取excel中的数据
        excel = ExcelHandler('../data/cases.xlsx')
        case_data = excel.read_excel('login')
        print(case_data)
        def setUp(self):
            # 请求类实例化
            self.req = RequestsHandler()
        def tearDown(self):
            # 关闭session管理器
            self.req.close_session()
        @ddt.data(*case_data)
        def test_login_success(self,items):
            logger.info('*'*88)
            logger.info('当前是第{}条用例:{}'.format(items['case_id'],items['case_title']))
            logger.info('当前用例的测试数据:{}'.format(items))
            # 请求接口
            res = self.req.visit(method=items['method'],url=items['url'],json=json.loads(items['payload']),
                                 headers=json.loads(items['headers']))
            try:
                # 断言:预期结果与实际结果对比
                self.assertEqual(res['code'], items['expected_result'])
                logger.info(res)
                result = 'Pass'
            except AssertionError as e:
                logger.error('用例执行失败:{}'.format(e))
                result = 'Fail'
                raise e
            finally:
                # 将响应的状态码,写到excel的第9列,即写入返回的状态码
                TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 9, res['code'])
                # 如果断言成功,则在第10行(测试结果)写入Pass,否则,写入Fail
                TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 10, result)
    if __name__ == '__main__':
        unittest.main()

    控制台日志输出部分截图:

    日志文件输出部分截图:

    以上就是Python接口自动化浅析logging封装及实战操作的详细内容,更多关于Python接口自动化logging封装的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • Python日志模块logging简介
    • Python基础之logging模块知识总结
    • Python 解决logging功能使用过程中遇到的一个问题
    • Python的logging模块基本用法
    • Python logging简介详解
    上一篇:python读取和保存mat文件的方法
    下一篇:关于使用OpenCsv导入大数据量报错的问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python接口自动化浅析logging封装及实战操作 Python,接口,自动化,浅析,