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

一、简单使用

入门小案例

1

2

3

4

5

6

7

8

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

日志级别

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

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

1

2

3

4

5

6

7

8

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

1

2

3

4

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 参数即可

1

2

3

4

5

6

7

8

9

10

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 创建日志记录器

1

2

3

4

import logging

#  第一步创建一个logger,用来产生日志

logger = logging.getLogger('%s_log' % __name__)

logger.setLevel(logging.DEBUG)  # 设置日志等级

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

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

2 创建日志处理器

1

2

# 创建一个文本处理器用来将日志写入到文件

file_handler = logging.FileHandler(filename='py34.log',encoding='utf-8')

1

file_handler.setLevel('WARNING'# 设置处理器的日志等级

1

2

3

# 创建一个控制台处理器用来将日志输出到控制台

console_handler = logging.StreamHandler()

console_handler.setLevel('INFO'# 设置控制台处理器的日志等级

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

FileHandler 将日志发送到文件

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

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

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

更多详情见官方文档

(logging.handlers --- 日志处理程序 — Python 3.12.0 文档)

3 创建格式化器

1

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

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

1

2

file_handler.setFormatter(formatter)

console_handler.setFormatter(formatter)

4 创建过滤器

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

详情见官方文档

(日志专题手册 — Python 3.12.0 文档 )

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

1

2

logger.addHandler(file_handler)

logger.addHandler(console_handler)

6 记录日志

1

logger.info('This is a info')

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

1

logger.warning('This is a warning')

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

三、日志模块封装

功能分析

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

封装成函数

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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 文件编写如下代码:

1

2

from .log_handler import get_logger

logger = get_logger('py41', 'py38.log')

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

1

from common import logger

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

记录日志

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

...

@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('测试用例【{}】测试结束')

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/225665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年度AI策略报告:AI浪潮扬帆起航,传媒应用百花齐放

今天分享的人工智能系列深度研究报告:《2024年度AI策略报告:AI浪潮扬帆起航,传媒应用百花齐放》。 (报告出品方:兴业证券) 报告共计:52页 1、行情回顾:板块处于较低区间&#xff0…

Java中实现HTTPS连接的最佳实践

引言 大家好!我是小黑。今天咱们来聊聊一个既热门又实用的话题:在Java中如何实现HTTPS连接。现在的网络世界,安全性是大家都非常关注的问题,特别是对于咱们这些程序员来说,更是如此。想想看,如果你的网站或…

免费文章生成器的种类,3款免费的文章生成器推荐

内容创作无疑是网络营销和品牌建设中不可或缺的一环。许多人在日常工作中可能会面临时间不足、灵感枯竭等问题,本文将深入聊聊免费文章生成器的种类,详细介绍使用方法。 1. 免费文章生成器的种类 基于模板的生成器 这类生成器通常提供一系列文章模板&…

【LeetCode】每日一题 2023_12_7 重新规划路线(DFS/BFS)

文章目录 刷题前唠嗑题目:重新规划路线题目描述代码与解题思路 刷题前唠嗑 LeetCode?启动!!! 这题好眼熟,怎么这几天都是这类问题! 题目:重新规划路线 题目链接:1466.…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关:HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关:HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

uni-app 微信小程序之好看的ui登录页面(五)

文章目录 1. 页面效果2. 页面样式代码 1. 页面效果 2. 页面样式代码 <!-- 顶部蓝色 --> <template><view class"contaier"><view class"top-bg"><view class"text-white text-bold text-xxxl">前端铺子</view…

架构师-2.数据权限

数据权限,实现指定用户可以操作指定范围的数据。例如说,针对员工信息的数据权限: 上述的这个示例,使用硬编码是可以实现的,并且也非常简单。但是,在业务快速迭代的过程中,类似这种数据需求会越来越多,如果全部采用硬编码的方式,无疑会给我们带来非常大的开发与维护成…

【银行测试】第三方支付平台业务流,功能/性能/安全测试方法...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、第三方支付平台…

K8s 多租户方案的挑战与价值

在当今企业环境中&#xff0c;随着业务的快速增长和多样化&#xff0c;服务器和云资源的管理会越来越让人头疼。K8s 虽然很强大&#xff0c;但在处理多个部门或团队的业务部署需求时&#xff0c;如果缺乏有效的多租户支持&#xff0c;在效率和资源管理方面都会不尽如人意。 本…

CLASS60 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

DOS 批处理 (一)

DOS 批处理 1. 批处理是什么&#xff1f;2. DOS和MS-DOS3. 各种操作系统shell的区别Shell 介绍图形用户界面&#xff08;GUI&#xff09;shell命令行界面&#xff08;CLI&#xff09;的 shell命令区别 1. 批处理是什么&#xff1f; 批处理(Batch)&#xff0c;也称为批处理脚本…

数据结构初阶之二叉树的详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力,共赴大厂。 目录 1.前言 2.二叉树各个…

ahk系列-windows超级运行框-表达式计算(12)—功能汇总

1、环境准备 windows 7&#xff0c;8&#xff0c;10&#xff0c;11操作系统ahk 2.x_64位翻译功能需要联网使用 2、使用方式 输入winR打开windows运行框 get/getpath 命令获取配置文件环境变量set/sets 设置 “用户/系统” 环境变量或者pathencode/decode 中文编码和解码len…

Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

一、Python安装 最新版Python下载地址&#xff1a;https://www.python.org/ 根据操作系统选择对应版本制品下载安装即可&#xff0c;本机用的是Windows x86-64 executable installer。 注意事项&#xff1a; 安装完成后检查下环境变量&#xff0c;默认会配置好&#xff0c;可…

路径规划之PRM算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之A *算法 路径规划之D *算法 路径规划之PRM算法 路径规划之PRM算法 系列文章目录前言一、前期准备1.栅格地图2.采样3.路标 二、PRM算法1.起源2.流程3. 优缺点4. 实际效果 前言 之前提到的几种…

Recyclerview属性配置记录

Recyclerview属性&#xff1a; 1、requiresFadingEdge&#xff1a;属性用来设置拉滚动条时 &#xff0c;边框渐变的方向。 none&#xff08;边框颜色不变&#xff09;horizontal&#xff08;水平方向颜色变淡&#xff09;vertical&#xff08;垂直方向颜色变淡&#xff09; …

ConcurrentHashMap实现线程安全原理

我们知道&#xff0c;在日常开发中使用的HashMap是线程不安全的&#xff0c;而线程安全类HashTable只是简单的在方法上加锁实现线程安全&#xff0c;效率低下&#xff0c;所以在线程安全的环境下我们通常会使用ConcurrentHashMap。 1. 初始化数据结构时的线程安全 HashMap的底…

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…

如何本地搭建Linux DataEase数据可视化分析工具并实现公网访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

虚拟机网络设置

虚拟机网络设置 上一篇讲了虚拟机的安装与使用 因为虚拟机默认使用的是网络地址转换和端口转发的方式&#xff0c;这种方式对于后面的开发不方便&#xff0c;所以我们需要设置虚拟机网络。 直接修改虚拟机的网卡信息 进入虚拟机并和虚拟机建立连接&#xff0c;在虚拟机内修改…