python+pytest+loguru+allure日志封装

news/2025/3/31 10:29:16/文章来源:https://www.cnblogs.com/kobeBryant-8/p/18797751

一、日志类封装

from io import StringIO
import sys
import os
from loguru import logger
sys.path.append((os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))))
project_path = os.path.dirname(os.path.join(os.path.dirname(__file__)))
log_path = os.path.join(project_path, r'common\logger_info')class Logconfig:def __init__(self, log_file_dir='logger_info',log_name='case_log_info.log',level='DEBUG',rotation="10 MB", retention="7 days"):"""log日志封装:param log_file_dir: 日志路径:param log_name: 日志名称:param level: 日志输出等级:param rotation: 日志保存大小:param retention: 日志保存时间"""# 创建日志输出路径self.log_file_dir = log_file_dirif not os.path.exists(self.log_file_dir):os.makedirs(self.log_file_dir)# 配置日志self.level = levelself.rotation = rotationself.retention = retention# 配置日志写入文件路径self.log_file_dir = os.path.join(self.log_file_dir, log_name)print('日志写入路径:',self.log_file_dir)# 创建一个缓冲区用于捕获日志self.log_capture = StringIO()# 调用日志配置方法self.logconfig()def logconfig(self):# 清除默认配置logger.remove()# 配置日志输出到控制台logger.add(sink=sys.stdout,format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> |{module}.{function}() at line {line}-{message}",level=self.level)# 配置日志输出到文件logger.add(sink=self.log_file_dir,format = "{time:YYYY-MM-DD HH:mm:ss} |{level: <8}  | {module}.{function}() at line {line}-{message}",level = self.level,rotation = self.rotation,retention = self.retention,encoding = "utf-8",colorize=True)# 配置日志输出到缓冲区logger.add(sink=self.log_capture,format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {module}.{function}() at line {line}-{message}",level=self.level)# 获取捕获的日志内容def get_captured_logs(self):self.log_capture.seek(0)return self.log_capture.getvalue()# 获取logger实例def get_logger(self):return loggerif __name__ == '__main__':loggerconfig_info = Logconfig(log_file_dir=log_path, log_name='case_log_info.log', level='DEBUG')logger = loggerconfig_info.get_logger()logger.debug('调试日志')logger.info('普通日志')logger.warning('告警日志')logger.error('错误日志')# 将捕获的日志附加到 Allure 报告# captured_logs = loggerconfig_info.get_captured_logs()# allure.attach(captured_logs, name="Test Logs", attachment_type=allure.attachment_type.TEXT)


测试用例调用:
方法一:
用例中实例化logger
from common.log_info import Logconfig,log_path
logger = Logconfig(log_file_dir=log_path).get_logger()
@pytest.mark.parametrize('a,b,c', [(1, 2, 3), (4, 5, 6)])
def test_01(a, b,c):
with allure.step('test01'):
logger.info('测试case01')
print(f"传入的参数分别是:{a},{b},{c}")

方法二:
将封装好的Logconfig类在conftest中写成fixture自动执行
import allure
from common.log_info import log_path,Logconfig
@pytest.fixture(scope="function",autouse=True)
def log_test_infooo():
logger_config = Logconfig(log_file_dir=log_path, log_name='case_log_info.log', level='DEBUG')
logger = logger_config.get_logger()

yield logger

captured_logs = logger_config.get_captured_logs()
allure.attach(captured_logs, name="Test Logs", attachment_type=allure.attachment_type.TEXT)

scope="function"   作用域测试函数
autouse=True 自动执行不需要在用例中显式调用
from loguru import logger
@pytest.mark.parametrize('a,b,c', [(1, 2, 3), (4, 5, 6)])
def test_01(a, b,c):with allure.step('test01'):logger.info('测试case01')print(f"传入的参数分别是:{a},{b},{c}")



二、conftest中通过fixture输出日志

 1 import os
 2 from loguru import logger
 3 @pytest.fixture(scope="function",autouse=True)   
 4 def configure_logger():
 5     # 配置 loguru 输出到文件
 6     log_dir = "logs"
 7     if not os.path.exists(log_dir):
 8         os.makedirs(log_dir)
 9     log_file = os.path.join(log_dir, "test.log")
10     logger.add(log_file, format="{time} {level} {module}.{function}() at line {line}-{message}", level="DEBUG",encoding="utf-8")
11    12     yield
13     # 测试结束后,将日志文件附加到 Allure 报告中
14     with open(log_file, "r", encoding="utf-8") as f:
15         allure.attach(f.read(), name="Test Logs", attachment_type=allure.attachment_type.TEXT)

scope="function" 作用域测试函数
autouse=True 自动执行不需要在用例中显式调用

# 用例调用
from loguru import logger
@pytest.mark.parametrize('a,b,c', [(1, 2, 3), (4, 5, 6)])
def test_01(a, b,c):with allure.step('test01'):logger.info('测试case01')print(f"传入的参数分别是:{a},{b},{c}")执行后日志文件写入:
2025-03-28T10:36:32.414692+0800 INFO test_sz.test_01() at line 35-测试case01
2025-03-28T10:36:32.424637+0800 INFO test_sz.test_01() at line 35-测试case01
2025-03-28T10:36:32.424637+0800 INFO test_sz.test_01() at line 35-测试case01终端日志打印:
testcase/test_sz.py::test_01[1-2-3] 2025-03-28 10:38:09.512 | INFO     | testcase.test_sz:test_01:35 - 测试case01
传入的参数分别是:1,2,3
PASSED
testcase/test_sz.py::test_01[4-5-6] 2025-03-28 10:38:09.519 | INFO     | testcase.test_sz:test_01:35 - 测试case01
传入的参数分别是:4,5,6
PASSED

allure报告中附件日志信息:

 

如果想每个case日志在allure报告中单独展示,修改fixture方法:

@pytest.fixture(scope="function", autouse=True)
def configure_logger(request):log_dir = "logs"if not os.path.exists(log_dir):os.makedirs(log_dir)log_file = os.path.join(log_dir, f"{request.node.name}.log")  # 使用测试名称作为日志文件名
    logger.remove()logger.add(log_file, format="{time} {level} {module}.{function}() at line {line}-{message}", level="DEBUG", encoding="utf-8")yieldwith open(log_file, "r", encoding="utf-8") as f:allure.attach(f.read(), name="Test Logs", attachment_type=allure.attachment_type.TEXT)

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞芯微嵌入式方案概述

瑞芯微(Rockchip)是一家专注于高性能、低功耗芯片设计的中国半导体公司,其嵌入式解决方案广泛应用于智能终端、物联网、工业控制、多媒体处理等领域。以下是瑞芯微嵌入式方案的核心特点、典型应用及开发资源的总结: 一、瑞芯微嵌入式处理器系列 瑞芯微的芯片基于ARM架构,覆…

ggplot2中绘制渐变色的散点图

001、library(ggplot2)data <- data.frame(x = rnorm(100), y = rnorm(100) )ggplot(data, aes(x = x, y = y, color = y)) +geom_point(size = 3) +scale_color_gradient(low = "blue", high = "red") 。

raid级别、存储连接方式

硬盘越大,一搬转速越慢。还有看高速缓存 磁盘阵列能够容纳多少块硬盘 绝对磁盘存储柜的最大存储空间 raid提高吞吐量,保护数据 磁盘阵列柜支持哪些raid级别 raid卡上有缓存 数据先写到磁盘阵列的控制卡,再写到硬盘上 所以如果磁盘阵列卡如果断掉会导致数据丢失,一般磁盘阵列…

根据 2025 年全国青少年信息素养大赛官方通知:算法创意实践挑战赛(C++ 语言)小学组

根据 2025 年全国青少年信息素养大赛官方通知,算法创意实践挑战赛(C++ 语言)小学组的报名时间和考试时间安排如下: 报名时间 2025 年 1 月 10 日至 2025 年 4 月 22 日(具体截止时间以官方报名平台显示为准)。 考试时间初赛:2025 年 5 月(具体日期待定,需关注赛前通知…

众为兴机器人常用技巧

管理员密码 26722719 干涉空间信号设置系统信号配置

R语言中ggplot绘图去除灰色背景并保留外围框线

001、R语言中ggplot绘图去除灰色背景并保留外围框线library(ggplot2)data <- data.frame(x = rnorm(10),y = rnorm(10) )ggplot(data, aes(x = x, y = y)) +geom_point() +theme(panel.background = element_blank(), ## 去除灰色背景axis.line = element_line(colou…

机器学习优化算法

优化算法——SGD、Momentum、Adagrad、RMSprop、Adam、AdamW统一数学表达:设损失函数为$\mathcal{L}(\theta) $,学习率为$\eta$。每次迭代仅使用一个随机小批量(mini-batch)数据计算梯度。 从训练集中采样包含小批量$m$个样本${x{(1)},\cdots,x{(m)}}$,其对应的目标为${y{…

数码管静态显示

前言 目标 控制LED数码管,静态显示数字 原理 51 单片机的 LED 数码管有8个 每个数码管又由 8 个数码段组成选择要点亮的 LED 数码管的位置, 一共8个位置点亮特定 LED 数码管的数码段, 通过不同的组合,从而显示出想要的字符效果图参考资料 [4-1]静态数码管显示 位码 一共是8个…

上线Steam好评如潮!《刺客信条:影》真被玩家骂到逆袭了?

发售前被喷成筛子,上线后直接真香? 最近Steam玩家圈被《刺客信条:影》彻底刷屏了!虽然预告片公布时因为黑人武士主角、历史细节争议被疯狂吐槽,但游戏上线后却上演大型打脸现场——Steam好评率飙到77%,首周销量直接冲进全球热销榜TOP3,连日本玩家都直呼“忍者跑图太带感…