Python接口自动化测试 —— logging日志

news2025/1/11 9:47:55

logging模块的日志级别:日志级别一共有5个从低到高如下, 作用是在当你给python函数赋予日志器时, 需要自己标记日志级别(后面会用到)

debug(调试级别):严重程度最低级别,详细程度最高的日志信息,常用于问题诊断

info(轻微级别):严重程度仅次于DEBUG,信息详细程度也仅次于DEBUG,通常只记录关键节点信息,用于确认一切是否按照我们预期的那样进行工作

warning(警告级别):当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的

error(错误级别):由于一个更严重的问题导致某些功能不能正常运行时记录的信息

critical(严重错误级别):当发生严重错误,导致应用程序不能继续运行时记录的信息

python-logging四大组件:

logger:日志器, 提供应用程序代码直接使用的接口

handler:处理器,用于将日志记录发送到指定的目的位置

formater:格式器, 用于定义日志信息的输出格式

filter:过滤器, 过滤日志内容

编写第一个日志器:

import logging

# 创建日志器: logging_name(日志器名,可以随便写),一个日志器可以有多个处理器, 并且每个处理器都可以有自己不同的格式器及过滤器
logger = logging.getLogger('logging_name')

# 设置日志输出等级,如果不设置则默认warning级别,也就是只有日志级别为warning或则以上时,才会打印日志,否则不会打印,一般来说需要设置成 debug 打印全部级别
logger.setLevel(logging.DEBUG)

# 创建处理器:
sh = logging.StreamHandler()

# 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
                           'message)s\n', datefmt='%Y年%m月%d日 %X')

# 在日志器中添加处理器
logger.addHandler(sh)

# 将设置好的格式器添加到处理器中
sh.setFormatter(ft)

# 输出日志信息,事件内容需要自己写,这条代码放在哪个文件, 错误定位就会显示在哪个文件
logger.debug('事件内容')

执行结果>>>
日志时间: 2023年02月05日 17:52:25
文件名: test_003.py 在第23行
日志级别: DEBUG
事件内容: 事件内容

上面说明了日志器的简单创建, 下面演示如何将日志器融入到自动化中

首先得将上面这个“线形日志器”封装一下,如下, 我将它封装到一个类中,然后将输出日志那行代码拿掉, 否则错误就会永远定位在日志函数文件。

import logging


class Log:
    def getlog(self):

        # 创建日志器: logging_name(日志器名,可以随便写),一个日志器可以有多个处理器, 并且每个处理器都可以有自己不同的格式器及过滤器
        logger = logging.getLogger('logging_name')

        # 设置日志输出等级,如果不设置则默认warning级别,也就是只有日志级别为warning或则以上时,才会打印日志,否则不会打印,一般来说需要设置成 debug 打印全部级别
        logger.setLevel(logging.DEBUG)

        # 创建处理器:
        sh = logging.StreamHandler()

        # 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
        ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
                                   'message)s\n', datefmt='%Y年%m月%d日 %X')

        # 在日志器中添加处理器
        logger.addHandler(sh)

        # 将设置好的格式器添加到处理器中
        sh.setFormatter(ft)

        return logger

如下, 我又定义了一个测试用例和一个公用函数 

def comparison(da):
    if da in '中文':
        return '函数执行成功,是中文'

# 测试模块
class TestC:
    # 测试用例
    def test001(self):
        print(comparison(1))

TestC().test001()

comparison ,公用函数的功能就是输入“中文”就可以执行成功, 输入数字就会报错

def comparison(da):
    if da in '中文':
        return '函数执行成功,是中文'

# 测试模块
class TestC:
    # 测试用例
    def test001(self):
        print(comparison(1))

TestC().test001()

我的想法很简单,就是想把日志器加入到 comparison 函数中,如果报错了,我希望知道它的报错时间、报错文件、报错所在行,报错级别、报错内容。成功的话我也需要知道它的时间、文件、行、级别、内容。如何实现?很简单,将公用函数改造一下即可,如下

# 首先将日志类函数导入
from test_001 import Log

def comparison(da):

    try:
        if da in '中文':
            # 成功的情况
            Log().getlog().info(f'正在执行 comparison 函数,暂无错误,对比值为{da}:中文')
            return '函数执行成功,是中文'
    except Exception:
        # 报错的情况
        Log().getlog().error(f'正在执行 comparison 函数,类型对比错误,对比值为{da}:中文')

# 测试模块
class TestC:
    # 测试用例
    def test001(self):
        comparison(1)


TestC().test001()


执行结果>>>
日志时间: 2023年02月05日 17:49:29
文件名: test_002.py 在第13行
日志级别: ERROR
事件内容: 正在执行 comparison 函数,类型对比错误,对比值为1:中文

logging-日志写入txt文件

如下,唯一变动的是标记橙色那一块代码

import logging


class Log:
    # 日志器
    def getlog(self, log_path):
        """
        :param log_path: 日志输入文件所在路径,建议文件以txt格式,如果文件不存在则自动新建
        :return:
        """

        # 创建日志器: logging_name(日志器名,可以随便写)
        logger = logging.getLogger('logging_name')

        # 过滤器:设置日志输出等级
        logger.setLevel(logging.DEBUG)

        # 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
        ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
                                   'message)s\n', datefmt='%Y年%m月%d日 %X')

        # 设置文件格式
        handler = logging.FileHandler(log_path, encoding='UTF-8')
        handler.setFormatter(ft)

        # 在日志器中添加处理器
        logger.addHandler(handler)

        # 将日志输出器返回。logger日志器、log_level日志级别、content日志内容
        return logger

怎么使用呢?如下,橙色变动部分

# 首先将日志类函数导入
from test_001 import Log


def comparison(da):
    try:
        if da in '中文':
            # log.txt:日志文件的路径,如果过没有该文件则自动新增
            Log().getlog('log.txt').debug(f'正在执行 comparison 函数,暂无错误,对比值为{da}:中文')
            return '函数执行成功,是中文'
    except Exception:
        # log.txt:日志文件的路径,如果过没有该文件则自动新增
        Log().getlog('log.txt').debug(f'正在执行 comparison 函数,类型错误,对比值为{da}:中文')


# 测试模块
class TestC:
    # 测试用例
    def test001(self):
        comparison(1)


TestC().test001()

执行之后, 控制台是没有日志输出内容的,内容被输出到了log.txt文件中,如下。

总结:

以上就是对日志模块- logging 的使用说明, 日志模块难点不是在代码, 而是日志设置点, 也就是在哪里将日志植入才是最好的, 日志器的植入函数最好是公用的,以及最容易报错的地方,就像监控摄像头安装最容易出事的地方,出现问题后才能最快去定位。

其实我在项目中,日志写入文件这个功能一般不用,直接在控制台输入显示就行了,如果有某条用例执行失败,我们一般都是先看测试报告,然后再单独执行失败的用例, 在去调试。因为测试框架是自己设置的,一报错看控制台就知道是哪里的原因。那什么情况下会用到日志呢? 当你的框架有很多人使用时,或者有不太熟悉接口框架的同事用的时候, 报错他们一般不知道是哪里报错,这时他们就会看日志报告,但是前提下你的日志得完善很好才行,不然他们也不知道哪里有问题

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

资料获取方式 :

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.6 PE结构:导出表详细解析

导出表(Export Table)是Windows可执行文件中的一个结构,记录了可执行文件中某些函数或变量的名称和地址,这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入&…

三显智能氮气柜温度、湿度和氧含量控制介绍

三显智能氮气柜是用来存放易氧化物料,利用氮气达到防潮防氧化目的的柜体,通过多种技术实现温度、湿度和氧含量的显示和控制。 一、温度控制:智能氮气柜一般配备温度传感器和恒温控制装置。温度传感器会实时监测柜内温度,并将数据反…

【Spring AOP】

目录 🥗1 AOP 的思想 🍚2 AOP 的组成 🥚2.1 切面 🍙3 AOP 的实现 🍤3.1 添加 Spring AOP 依赖 🥫3.2 定义切面 🍣3.3 定义切点 🍳3.4 实现通知 🍔4 AOP 实现的一个例子 1…

算法通关村第十七关:白银挑战-贪心高频问题

白银挑战-贪心高频问题 1. 区间问题 所有的区间问题,参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间 将区…

报错解决:RuntimeError: expected scalar type Long but found Float

文章目录 报错信息原因代码示例错误版改正 报错信息 RuntimeError: expected scalar type Long but found Float原因 nn.Linear需要作用于浮点数,这里可能输入了整数类型的张量作为参数。 代码示例 错误版 import torch import torch.nn as nn a torch.tensor…

53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面

基于注解开发 WebSocket –注解就是: OnOpen、 OnClose 、 OnMessage 、OnError这些 ★ WebSocket的两种开发方式 ▲ Spring Boot为WebSocket提供了两种开发方式: 基于spring-boot-starter-websocket.jar开发WebSocket 基于Spring WebFlux开发WebSoc…

常用消息中间件有哪些

RocketMQ 阿里开源,阿里参照kafka设计的,Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现,非常重量级,更适…

只依赖OPENCV的工作服安全帽检测YOLOV8S

工地安全帽工作服检测Y8S,采用YOLOV8S训练模型,然后使用OPENCV的DNN调用,彻底拜托PYTORCH依赖,可以在C,PYTHON,ANDROID上跑。附件是C生成的效果测试(只需解压将图片或者视频放入VIDEOS文件夹,文件夹没图片或…

宝宝餐椅儿童商品认证和ASTM F404检测标准的重要性

大家都知道儿童餐椅是宝宝饮食的重要伙伴。它们为宝宝提供了一个舒适的环境,让宝宝在吃饭的时候更愉快,更健康。然而,许多家长可能不知道,亚马逊美国站售卖的儿童餐椅需要进行一系列严格的认证,以保护我们宝贝们的安全…

平板触控笔哪款好用?好用的第三方apple pencil

而对于那些把ipad当做学习工具的人而言,苹果Pencil就成了必备品。但因为苹果Pencil太贵了,不少的学生们买不起。因此,最佳的选择还是平替电容笔,今天在这里整理了一些高性价比的电容笔! 一、挑选电容笔的要点&#xf…

视频云存储/安防监控/AI分析/视频AI智能分析网关:占道经营算法

在国家倡导“地摊经济”的发展下,越来越多的人们投身于摆摊大潮,街道上都是随处可见的流动摊贩。虽然“地摊经济”有利于个人的经济增长,但有很多流动摊贩无视法规,随意摆摊或占道经营,这种行为不仅影响城市容貌&#…

Excel怎么批量生成文件夹

Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

提升网络安全防御能力的几个方面

提升网络安全防御能力对于个人和组织来说都至关重要。网络安全是一个全面的概念,包括保护个人信息、防止恶意攻击和确保网络资源的安全。在这篇文章中,我将介绍几个方面来提高网络安全防御能力其中包括IP地址查询。 首先,IP地址查询是一种网…

Uniapp中使用uQRCode二维码跳转小程序页面

下载插件 uQRCode官网地址 引入插件 文件如下 //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode = {};(functio…

colab使用(基础入门)——随手记

挂载到google drive 挂载目录/content/drive from google.colab import drive drive.mount(/content/drive) 图解colab读取Google Drive 文件 - 知乎 下载文件 !curl -L https://dl.fbaipublicfiles.com/imagebind/imagebind_huge.pth -o imagebind_ckpt参数:[-…

案例精选|菏泽公共交通集团日志审计系统建设方案

菏泽公共交通集团有限公司成立于1977年,是市属国有大型公益性企业。随着公交优先政策的出台和企业内部改革的不断深化,菏泽公交集团事业有了飞速发展。 随着5G、大数据、人工智能等数字化技术不断深化应用,近年来菏泽公交集团持续推进智慧公…

简述视频智能分析EasyCVR视频汇聚平台如何通过“AI+视频融合”技术规避八大特殊作业风险

视频智能分析EasyCVR视频汇聚平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、录…

动态内存申请

动态内存申请 静态分配 1、 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区,一般以数组的形式。 4、 按计划分配 动态分配 1、在程序运行过程中&#xff0c…

十八、MySQL添加外键?

1、外键 外键是用来让两张表的数据之间建立联系,从而保证数据的一致性和完整性。 注意,主表被关联的字段类型,必须和副表被关联的字段类型一致。 2、实际操作 (1)初始化两张表格: (2&#x…

线程、并发相关---第六篇

系列文章目录 文章目录 系列文章目录一、为什么用线程池?解释下线程池参数?二、简述线程池处理流程一、为什么用线程池?解释下线程池参数? 1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。 2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线…