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,路径,等等直接写自己需要使用的内容即可