python自动化测试通过日志3分钟定位bug
作者:软件测试君 发布时间:2021-09-12 10:11:19
一、简单使用
入门小案例
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('测试用例【{}】测试结束')
来源:https://blog.csdn.net/AI_Green/article/details/121401061


猜你喜欢
- 在实际的项目中,我们一般都会建立三个环境:开发、测试和生产环境,这三种环境会使用不同的配置组合,为了能方便地切换配置,我们可以为不同的环境创
- python版本为python3.51.要求1)输入用户名密码2)认证成功后显示欢迎信息3)输错三次后锁定2.需求分析1)用户信息存储在文件
- 本人 python新手,使用的环境是python2.7,勿喷# -*- coding:utf8 -*-import random
- 前言在开发中经常需要配置提交git的忽略文件,本篇来学习下使用pycharm自动生成.ignore文件安装插件Files->setti
- 废话不多说, 先看代码创建一个钉钉机器人, 必须使用加签方式1. 安装 ding 模块包go get -u github.com
- 问题最近在工作中发现了一个问题,Python代码一直用着免费的Google翻译API插件googletrans,这两天突然就报错了:Trac
- 本文实例讲述了vue实现图片懒加载的方法。分享给大家供大家参考,具体如下:vue图片懒加载使用首先第一步,安装插件vue-lazyloadn
- 1、准备工作ide:pycharmpython:3.7三方包:pygame、pyinstaller、mutagen几首mp3格式的歌2、开始
- 事件是javascript中的核心内容之一,在对事件的应用中不可避免的要涉及到一个重要的概念,那就是事件冒泡,在介绍事件冒泡之前,先介绍一下
- 1. Python 的参数传递Python的参数传递,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;
- 从大的发展来看,网站就是一块试验田,一块在错误中成长、在错误中变强变大的试验田。这决定了互联网产品的成长路线,一定是一个反复修正和迭代的曲线
- 一、为什么要使用Python进行数据分析?python拥有一个巨大的活跃的科学计算社区,拥有不断改良的库,能够轻松的集成C,C++,Fort
- 进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,
- 假设我们有一个非常简单的Post模型,它将是一个图像及其描述,from django.db import modelsclass Post(
- 背景:Python是一种解释性的语言,执行速度相比C、C++等语言十分缓慢;因此我们需要在其它地方上下功夫来提高代码的执行速度。首先需要对代
- php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,该函数返回一个array,包含两个元素,一个是秒数,一个是小数表
- 啥也不说了,还是看代码吧! [root@yyjk DATABASE]# cat DBI.py# -*- coding: utf-8 -*-
- 好久没写了,就把上课做的一个小东西拿出来分享一下吧。百度网页截图如下 ↓↓↓程序运行输出结果截图 ↓↓↓上代码 ↓↓↓from lxml i
- 文件:.wmv;大小:19,535KB;长度:00:26:39。 下载地址:SqlFunction_udf_Week.rar以下内容于201
- python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。得到当前工作目录,即当前Python脚本工作的目录路