在unittes期间禁用python日志记录

2024-05-15 22:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个项目,每次运行时都会创建一个不同的日志文件。我有一些单元测试来测试我的代码,但是在这个过程中也会导致日志文件被创建。我的应用程序代码如下:

在模块.py在

import logging
from uuid import uuid4

class TestRun:

    def __init__(self):
        self.test_run_id = str(uuid4())
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.INFO)
        handler = logging.FileHandler('{}.log'.format(self.test_run_id))
        self.logger.addHandler(handler)

    def prep_test_run(self):
        self.logger.info('Starting prep')

if __name__ == '__main__':
    tr = TestRun()
    tr.prep_test_run()

我的测试代码是这样的:

^{pr2}$

每次我运行单元测试文件都会被创建。在运行单元测试时有没有一种方法可以禁用它。我试图在def setUp(self)中设置日志级别,但没有成功。在


Tags: 文件runnametestimportselfidlogging
3条回答

这应该可以做到:

logging.getLogger(__name__).disabled = True

在导入后添加这行。在

我看到了两种处理方法:要么删除处理程序,要么根本就不创建它。在

首先,从test_function中的记录器中删除处理程序:

def test_function(self):
    tr = TestRun()
    tr.logger.handlers = []

这是非常暴力的(它删除了所有的日志处理程序,因此请谨慎使用),但它应该可以解决问题。在

第二种方法是通过向TestRun.__init__添加关键字参数来控制是否首先生成日志,类似于:

^{pr2}$

然后,当您在测试中创建一个实例时,执行tr = TestRun(file_logs = False)。在

另一方面,正如在评论中指出的,最好是按常规创建日志,然后在测试完成后删除它们。在

下面是一个context manager,它将为部分代码禁用特定的记录器:

from contextlib import contextmanager

@contextmanager
def disable_logger(name):
    """Temporarily disable a specific logger."""
    logger = logging.getLogger(name)
    old_value = logger.disabled
    logger.disabled = True
    try:
        yield
    finally:
        logger.disabled = old_value

然后您可以这样使用它:

^{pr2}$

相关问题 更多 >