当前位置: 首页 > ops >正文

python+pytest接口自动化测试--日志记录

前言:代码可以直接复制使用

解决问题:
问题1:日志重复记录的问题,比如运行一个模块日志会记录很多遍(通过handlers是否存在解决的)
问题2:运行测试用例进行多个模块相互调用.日志记录不全的问题(通过共享公共的handlers解决问题)

首先写一个日志记录的工具

# 这个是个日志的记录工具,用于记录日志
import logging
import os
from datetime import datetime# 创建个日志的类
class LogTool:# 创建个初始化的方法,将所有的内容全部初始化def __init__(self, module_name, log_dir):# 设置初始化参数,设置日志模块的名字和日志记录的级别self.module_name = module_nameself.logger = logging.getLogger(module_name)self.logger.setLevel(logging.DEBUG)# 设置如果日志模块不存在则正常创建记录,如果存在则不创建if not os.path.exists(log_dir):os.makedirs(log_dir)# 设置日志文件名字记录的规则log_filename = f"{log_dir}/{datetime.now().strftime('%Y-%m-%d')}.log"# 防止重复添加 handler,保证处理器唯一性if not self.logger.handlers:file_handler = logging.FileHandler(log_filename, encoding="utf-8")file_handler.setLevel(logging.DEBUG)file_formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s',datefmt='%Y-%m-%d %H:%M:%S')file_handler.setFormatter(file_formatter)# #下面的的控制台记录日志的相关代码,暂时先不使用# console_handler = logging.StreamHandler()# console_handler.setLevel(logging.INFO)# console_formatter = logging.Formatter('[%(levelname)s] %(message)s')# console_handler.setFormatter(console_formatter)self.logger.addHandler(file_handler)# self.logger.addHandler(console_handler)# 创建个方法将已经初始化好的实例属性直接返回出去def get_logger(self):return self.logger# print(os.path.abspath(__file__))

然后新建个python文件,写调用记录日志的工具

# 此方法就是多个模块公用一个日志记录器,这样多个模块相互调用时,所有模块的日志都可以被记录下来
from test_script.sands_log.log_tools2 import LogTool# 初始化空字典:该字典用于缓存已创建的日志记录器实例,键为日志名称(name),值为对应的 LogTool 实例
loggers = {}def get_logger(name: str):# 仅当某个名称的日志记录器不存在时,才调用 LogTool 创建新实例并存入字典。# 复用性:后续调用直接返回缓存实例,避免重复创建相同的日志对象,节省内存和初始化时间if name not in loggers:loggers[name] = LogTool(name, "写日志文件记录的绝对路径").get_logger()return loggers[name]

最后其他模块直接调用get_logger这个工具即可

import requestsfrom test_script.sands_log.use_log_tools import get_loggerlogger = get_logger("name")session = requests.session()
data = {123}def login():# 异常处理try:url = "url"logger.info(f"累计导出的url是:{url}")headers = {"Accept": "application/json, text/plain, */*", "Content-Type": "application/json","authorization": get_token()}resp = session.post(url=url, headers=headers, json=data)logger.info(f"累计导出的接口数据是{data},导出的响应是:{resp.json()}")return respexcept Exception as e:print("数据异常:", e)logger.error(f"累计导出的出现的异常是:{e}")return {"status": "error",# 加这个return的意义是如果有程序或前端调用这个接口,真的出现了异常print的内容调用者看不到,但是return的内容可以看到"具体异常是": str(e)}if __name__ == "__main__":print(login().json())

部分数据比如url,路径,等等直接写自己需要使用的内容即可

http://www.xdnf.cn/news/4464.html

相关文章:

  • Linux cp 目录A所有内容到目录B
  • 深入探索Linux命名管道(FIFO):原理、实践与高级技巧
  • 【上位机——MFC】对话框
  • C25-数组应用及练习
  • DHCP理解
  • 在scala中,转换算子和行动算子有什么区别
  • 39.电气连接口与隔离舱设计
  • 【学习笔记】机器学习(Machine Learning) | 第五章(4)| 分类与逻辑回归
  • 在线PDF阅读方案:jQuery + PDF.js
  • K8S 基于本地存储的持久卷
  • 《Python星球日记》 第44天: 线性回归与逻辑回归
  • 猫咪如厕检测与分类识别系统系列~进阶【一】视频流推流及网页实时展示
  • 电脑桌面悬浮窗便签,好用的电脑桌面便签工具
  • Android Studio根目录下创建多个可运行的模块
  • ESP32-S3 I2S音频开发实战指南
  • Nginx性能调优与深度监控
  • html css js网页制作成品——HTML+CSS珠海网页设计网页设计(4页)附源码
  • LVGL-对象 lv_obj_t
  • FAISS(Facebook AI Similarity Search)
  • STM32基础教程——软件SPI
  • 高效C/C++之七:Coverity修复问题: 打印函数切记对应类型 和 判定非空指针变量后使用
  • eFish-SBC-RK3576工控板外部RTC测试操作指南
  • 【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)
  • vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开
  • 用 CodyBuddy 帮我写自动化运维脚本
  • 易基因:中山大学凌文华团队DNA甲基化研究揭示血管衰老与动脉粥样硬化的表观调控机制|项目文章
  • Debezium BinaryLogClient详解
  • 信息论08:从交叉熵到KL散度——信息论中的“距离“与“差异“度量指南
  • Tiny Machine Learning在人类行为分析中的全面综述
  • ICML 2025录取率公布,spotlight posters仅占2.6%