如何在pytest中为每个测试用例单独存储日志文件
解决方案:自定义pytest日志存储路径与文件名
情况1:每次测试会话生成单个带时间戳的日志文件(存于results目录)
如果只是想把所有测试结果汇总到一个带时间戳的日志文件里,并且统一放在results目录下,你可以修改conftest.py的代码如下:
首先要确保results目录存在,避免运行时报错,所以需要引入os模块来创建目录:
import os from datetime import datetime def pytest_configure(config): """Create a log file in results directory with timestamp if log_file is not specified""" # 创建results目录(如果不存在则自动创建) os.makedirs('results', exist_ok=True) if not config.option.log_file: timestamp = datetime.strftime(datetime.now(), '%Y-%m-%d_%H-%M-%S') # 设置日志文件路径为results/test_run_<timestamp>.log config.option.log_file = f'results/test_run_{timestamp}.log'
这样每次运行测试时,都会在results目录下生成一个类似results/test_run_2024-05-20_14-30-00.log的日志文件,所有测试结果都会统一写入其中。
情况2:每个测试用例生成独立的带时间戳的日志文件
如果你的需求是为每个测试用例(比如test1、test2)单独生成专属日志文件,那需要用到pytest_runtest_setup钩子函数,在每个测试用例执行前配置独立的日志文件:
import os import logging from datetime import datetime def pytest_configure(config): # 提前创建results目录,确保后续日志能正常写入 os.makedirs('results', exist_ok=True) def pytest_runtest_setup(item): """为每个测试用例设置独立的日志文件""" # 获取测试用例的基础名称(处理参数化测试的情况,只保留核心测试名) test_name = item.name.split('[')[0] timestamp = datetime.strftime(datetime.now(), '%Y-%m-%d_%H-%M-%S') log_file_path = f'results/{test_name}_{timestamp}.log' # 配置日志记录器:先移除旧的文件处理器,避免重复写入 logger = logging.getLogger('pytest') for handler in logger.handlers[:]: if isinstance(handler, logging.FileHandler): logger.removeHandler(handler) # 添加新的文件处理器,指定日志格式 file_handler = logging.FileHandler(log_file_path, encoding='utf-8') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.setLevel(logging.INFO)
这样每个测试用例执行时,都会在results目录下生成对应名称的日志文件,比如results/test1_2024-05-20_14-35-00.log、results/test2_2024-05-20_14-35-05.log,每个测试的日志会单独存储,方便后续排查问题。
内容的提问来源于stack exchange,提问作者anju
相关产品推荐
相关产品推荐

