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

目录
  • 一、简单使用
    • 入门小案例
    • 日志级别
    • 配置
    • 格式化规则
    • 日志写到文件
  • 二、高级用法
    • 日志组件
    • 步骤
      • 1创建日志记录器
      • 2创建日志处理器
      • 3创建格式化器
      • 4创建过滤器
      • 5 将处理器添加到记录器上
      • 6 记录日志
  • 三、日志模块封装
    • 功能分析
    • 封装成函数
  • 四、应用到项目中
    • 导入
    • 记录日志

一、简单使用

入门小案例

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')

日志级别

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

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

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 方法支持一下关键字参数进行配置。

格式化规则

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

常用格式:%(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 模块包含一下几个组件。

步骤

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的资料请关注我们其它相关文章!

(0)

相关推荐

  • python自动化测试之异常及日志操作实例分析

    本文实例讲述了python自动化测试之异常及日志操作.分享给大家供大家参考,具体如下: 为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法. 一.日志 打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态.Python标准库提供了logging模块,切记Logger从来不直接实例化,其好处不言而喻,接下来慢慢讲解Logging模块提供了两种记录日志的方式.

  • 总结Python使用过程中的bug

    Python使用过程中的bug 问题: 在vscode中, 使用 Windows PowerShell 运行 conda activate xxx (某个环境)切换环境时报错: If using 'conda activate' from a batch script, change your invocation to 'CALL conda.bat activate'. 原因: PowerShell 有时不好使 解决方法: 改为用 cmd 运行 问题: conda install xxxx

  • python3 使用traceback定位异常实例

    1.我们使用正常的输出语句 得到的是(输出结果:division by zero)虽然得到了错误的日志输出,但是不知道为什么出错,也不能定位具体出错位置. 2.现在我们使用 traceback 就可以得到具体的错误,以及定位到出错的位置.这样就能更方便调试错误. 参考文献 traceback文档地址: https://docs.python.org/2/library/traceback.html 以下为google翻译(仅供参考,): 该模块提供了一个标准接口,用于提取,格式化和打印Pytho

  • python自动化测试实例解析

    本文实例讲述了python自动化测试的过程,分享给大家供大家参考. 具体代码如下: import unittest ######################################################################## class RomanNumeralConverter(object): """converter the Roman Number""" #-----------------------

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

    目录 一.简单使用 入门小案例 日志级别 配置 格式化规则 日志写到文件 二.高级用法 日志组件 步骤 1创建日志记录器 2创建日志处理器 3创建格式化器 4创建过滤器 5 将处理器添加到记录器上 6 记录日志 三.日志模块封装 功能分析 封装成函数 四.应用到项目中 导入 记录日志 一.简单使用 入门小案例 import logging logging.basicConfig(level=logging.DEBUG, #设置级别,根据等级显示 format='%(asctime)s-[%(fi

  • python自动化测试selenium定位frame及iframe示例

    frame标签有frameset.frame.iframe三种,frameset和其它普通标签没有区别,不会影响正常定位,而frame与iframe对selenium定位而言是一样的. Selenium有以下方法对frame进行操作. 示例网站:http://sahitest.com/demo/framesTest.htm 示例脚本: from selenium import webdriver from time import sleep class TestFrame(object): de

  • Python自动化测试框架之unittest使用详解

    目录 1 unittest框架 2 批量执行脚本 2.1 构建测试套件 2.2 用例的执行顺序 2.3 忽略用例执行 3 unittest断言 4 HTML报告生成 5 异常捕捉与错误截图 6 数据驱动 1 unittest框架 unittest 是python 的单元测试框架,它主要有以下作用: 提供用例组织与执行:当你的测试用例只有几条时,可以不必考虑用例的组织,但是,当测试用例达到成百上千条时,大量的测试用例堆砌在一起,就产生了扩展性与维护性等问题,此时需要考虑用例的规范与组织问题了.单元

  • Python中logging日志的四个等级和使用

    1. logging日志的介绍 在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录:飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序在运行时所产生的日志信息,怎么做呢? 可以使用 logging 这个包来完成 记录程序日志信息的目的是: 1. 可以很方便的了解程序的运行情况 2. 可以分析用户的操作行为.喜好等信息 3. 方便开发人员检查bug 2. logging日志级别介绍 日志等级可以分为5个,从低到高分别是: 1. DE

  • Python自动化测试PO模型封装过程详解

    在自动化中, Selenium 自动化测试中有一个名字经常被提及 PageObject( 思想与面向对象的特征相 同 ) ,通常 PO 模型可以大大提高测试用例的维护效率 优点:可重用,业务和对象分离,代码结构清晰,方便代码维护 核心要素 1. 在 PO 模式中抽离封装集成一个BasePage 类,该基类应该拥有一个只实现 webdriver 实例的属性 2. 每一个 page 都继承 BasePage ,通过 driver 来管理本 page 中元素,将 page 中的操作封装成一个个方法 3

  • Python自动化测试框架pytest的详解安装与运行

    目录 1. pytest的介绍 2. pytest的安装 1. 使用以下命令进行安装 2. 检查是否成功安装正确版本 3. pytest识别测试的条件 4. pytest的运行 4.1 Pycharm中调用 4.2 Python代码中调用 4.3 使用命令行调用 常用参数列表 参数演示示例: 1. pytest的介绍 pytest是一个非常成熟的全功能的python测试工具,它主要有以下特征: 简单灵活,容易上手: 支持简单的单元测试和复杂的功能测试 显示详细的断言失败信息 能自动识别测试模块和

  • python自动化测试selenium核心技术三种等待方式详解

    目录 1 使用python自带模块time的sleep方式 2 隐式等待(implicitly_wait) 3 显示等待(WebDriverWait) UI自动化测试过程中,可能会出现因测试环境不稳定.网络慢等情况,如果不做任何处理的话,会出现无法定位到特定元素而报错,导致自动化测试无法顺利执行. selenium官网手册:Waits | Selenium slenium自动化测试中,主要涉及三种等待方式: 1 使用python自带模块time的sleep方式 缺点:即使网络条件较好时,依旧按照

  • python自动化测试selenium操作checkbox和radiobox技术

    form表单中经常涉及复选框(checkbox)和单选框(radiobox),如用户的爱好跑步.游泳.跳舞可以使用复选框,性别男.女可以使用单选框. (1)checkbox选择或反选:使用click()方法 (2)radiobox有相同的名称,多个值,可先通过名称获得,再通过值判断,选择使用click()方法. 示例页面: 页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&

  • Python学习之日志模块详解

    目录 日志的作用 日志的等级 logging 模块的使用 logging 模块演示小案例 OK,今天我们来学习一下 python 中的日志模块,日志模块也是我们日后的开发工作中使用率很高的模块之一,接下来们就看一看今天具体要学习日志模块中的那些内容吧. 日志的作用 说到日志,我们完全可以想象为现实生活中的日记.日记是我们平时记录我们生活中点点滴滴的一种方法,而日志我们可以认为是 程序的日记 ,程序的日记是用来记录程序的行为,一般来说我们可以通过日志记录一些程序的重要信息. 比如哪里报错了?报错原

  • Python自动化测试selenium指定截图文件名方法

    目录 前言: 一.python中时间日期格式化符号 二.使用步骤 1.导入time模块,webdriver类 2.实际代码操作 总结: 前言: Selenium 支持 Web 浏览器的自动化,它提供一套测试函数,用于支持 Web 自动化测试.函数非常灵活,能够完成界面元素定位.窗口跳转.结果比较等功能.支持多种浏览器.多种编程语言(Java.C#.Python.Ruby.PHP 等).支持多种操作系统(Windows.Linux.IOS.Android 等).开源免费. 它主要由三个工具组成:W

随机推荐