python自动化测试通过日志3分钟定位bug


Posted in Python onNovember 20, 2021

一、简单使用

入门小案例

import logging
logging.basicConfig(level=logging.DEBUG,  #设置级别,根据等级显示
    format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s')  # 设置输出格式
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')

日志级别

根据不同情况设置了五种日志等级,不同情况输出不同等级的日志。

python自动化测试通过日志3分钟定位bug

日志器设置的级别会过滤掉低于这个级别的日志

import logging
logging.basicConfig(level=logging.WARNING,  #设置级别,根据等级显示
    format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s')  # 设置输出格式
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')

2020-09-11 17:39:26,667-WARNING-This is a warning log

2020-09-11 17:39:26,669-ERROR-This is a error log

2020-09-11 17:39:26,669-CRITICAL-This is a critical log

配置

basicConfig 方法支持一下关键字参数进行配置。

python自动化测试通过日志3分钟定位bug

格式化规则

日志的输出格式可以通过下面格式自由组合输出

python自动化测试通过日志3分钟定位bug

常用格式:%(asctime)s-[%(filename)s?>line:%(lineno)d]-%(levelname)s:% (message)s

import logging
logging.basicConfig(level=logging.DEBUG,  #设置级别,根据等级显示
    format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s')  # 设置输出格式
logging.debug('This is a debug log')

[DEBUG]-2020-09-11 17:36:50,125?4:This is a debug log

日志写到文件

只需要配置 filename 参数即可

import logging
logging.basicConfig(
    level=logging.WARNING,  #设置级别,根据等级显示
    filename='example.log'
    format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s')  # 设置输出格式
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')

注意,配置了 fielname 后,日志将不会输出在控制台。

二、高级用法

简单的代码通过 logging 直接使用即可,如果要深入使用需要按照面向对象的方式使用 logging。

日志组件

logging 模块包含一下几个组件。

python自动化测试通过日志3分钟定位bug

步骤

 1创建日志记录器

import logging
#  第一步创建一个logger,用来产生日志
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.DEBUG)  # 设置日志等级

通过 getLogger 这个方法可以创建一个日志记录器,注意要给名字否则返回根日志记录器。

通过 setLevel 设置日志记录器的等级。

2创建日志处理器

# 创建一个文本处理器用来将日志写入到文件
file_handler = logging.FileHandler(filename='py34.log',encoding='utf-8')
file_handler.setLevel('WARNING')  # 设置处理器的日志等级
# 创建一个控制台处理器用来将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel('INFO')  # 设置控制台处理器的日志等级

日志处理器就是将日志发送到指定的位置

FileHandler 将日志发送到文件

StreaHandler 将它可将日志记录输出发送到数据流例如 sys.stdout, sys.stderr 或任何文件类对象默认sys.stdout 即控制台。

RotatingFileHandler 支持根据日志文件大小进行轮转

TimedRotatingFileHandler 支持根据时间进行轮转日志文件

更多详情见官方文档

https://docs.python.org/zh-cn/3/library/logging.handlers.html?utm_source=testingpai.com#module-logging.handlers

 3创建格式化器

formatter = logging.Formatter(fmt='%(levelname)s %(asctime)s [%(filename)s-->line:%(lineno)d]:%(message)s')

格式化器需要设置到处理器上

file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

4创建过滤器

过滤器用来过滤指定日志。具体使用略,一般用不到。

详情见官方文档

https://docs.python.org/zh-cn/3/howto/logging-cookbook.html?utm_source=testingpai.com#filters-contextual

5 将处理器添加到记录器上

logger.addHandler(file_handler)
logger.addHandler(console_handler)

6 记录日志

logger.info('This is a info')

2020-09-11 22:22:44,095-[?>line:1]-INFO:This is a info

logger.warning('This is a warning')

2020-09-11 22:23:20,337-[?>line:1]-WARNING:This is a warning

三、日志模块封装

功能分析

  • 能够自定义日志器名
  • 能够自定义日志文件名和路径
  • 能够自定义日志文件编码方式
  • 能够自定义日志格式
  • 使用时间轮转处理器,并能够配置

封装成函数

在 common 目录下创建模块 log_handler.py 在其中创建如下函数。

import logging
from logging.handlers import TimedRotatingFileHandler
def get_logger(name, filename, encoding='utf-8', fmt=None, when='d', interval=1, backup_count=7, debug=False):
    """
    :param name: 日志器的名字
    :param filename: 日志文件名(包含路径)
    :param encoding: 字符编码
    :param fmt: 日志格式
    :param when: 日志轮转时间单位
    :param interval: 间隔
    :param backup_count: 日志文件个数
    :param debug: 调试模式
    :return:
    """
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    # 文件处理器的等级一般情况一定比控制台要高
    if debug:
        file_level = logging.DEBUG
        console_level = logging.DEBUG
    else:
        file_level = logging.WARNING
        console_level = logging.INFO
    if fmt is None:
        fmt = '%(levelname)s %(asctime)s [%(filename)s-->line:%(lineno)d]:%(message)s'
    file_handler = TimedRotatingFileHandler(
        filename=filename, when=when, interval=interval, backupCount=backup_count, encoding=encoding)
    file_handler.setLevel(file_level)
    console_handler = logging.StreamHandler()
    console_handler.setLevel(console_level)
    formatter = logging.Formatter(fmt=fmt)
    file_handler.setFormatter(formatter)
    console_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    return logger
if __name__ == '__main__':
    log = get_logger(name='py41', filename='py41.log', debug=True, when='s')
    log.info('我是普通信息')
    import time
    time.sleep(3)
    log.warning('我是警告信息')

四、应用到项目中

导入

日志器生成函数的导入不能像 Excel 数据读取函数一样,每个用例模块里都导入一遍。因为它返回一个日志器对象,当多次调用日志器生成函数,且日志器名称相同时,会给同一个日志器添加多个日志处理器,从而出现重复记录日志器的问题。

为了解决上面的问题,在 common 文件夹下创建一个名为 init.py 的文件,在 common 模块被导入时会自动执行这个文件里的代码,且只会执行一次。

init.py 文件编写如下代码:

from .log_handler import get_logger
logger = get_logger('py41', 'py38.log')

那么在项目中的其他模块中就可以通过如下代码导入

from common import logger

从而可以保证在项目执行过程中,get_logger 方法只会执行一遍。

记录日志

日志的作用是记录程序的运行状态和当程序出现问题时能提供定位分析错误的依据。

什么时候需要记录日志,记录什么日志,根据每个人对程序的理解,以及经验。

我们的项目中,在用例执行的过程是核心,所以我们的日志也是围绕着用例的执行。

使用日志记录每个用例的测试数据,和测试结果,代码如下:

...
@list_data(*cases)
    def test_login(self, case):
        """
        登陆测试
        """
        logger.info('测试用例【{}】开始测试'.format(case['title']))
        # 1. 测试数据
        # 传入进来的case参数
        logger.info('测试用例【{}】的测试数据是:{}'.format(case['title'], case))
        # 2. 测试步骤
        res = login_check(case['username'], case['password'])
        logger.info('测试用例【{}】的测试结果是:{}'.format(case['title'], res))
        # 3. 断言
        try:
            self.assertEqual(res, case['expect'])
        except AssertionError as e:
            logger.error('测试用例【{}】断言失败'.format(case['title']))
            raise e
        else:
            logger.info('测试用例【{}】断言成功'.format(case['title']))
        finally:
            logger.info('测试用例【{}】测试结束')

以上就是python自动化测试通过日志3分钟定位bug的详细内容,更多关于日志定位bug的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
使用pandas模块实现数据的标准化操作
May 14 Python
Python实现位图分割的效果
python脚本框架webpy模板赋值实现
python脚本框架webpy模板控制结构
Nov 20 #Python
python脚本框架webpy的url映射详解
Nov 20 #Python
Pygame Time时间控制的具体使用详解
Nov 17 #Python
Pygame如何使用精灵和碰撞检测
Pygame Event事件模块的详细示例
Nov 17 #Python
You might like
php下的权限算法的实现
2007/04/28 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
JavaScript触发器详解
2007/03/10 Javascript
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
js 操作符实例代码
2009/10/24 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
Python实现的最近最少使用算法
2015/07/10 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
python实现无边框进度条的实例代码
2020/12/30 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
绿化工程实施方案
2014/03/17 职场文书
历史学专业求职信
2014/06/19 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
2015年采购工作总结
2015/04/10 职场文书
2015小学师德工作总结
2015/07/21 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电