在unittest期间禁用python日志记录

在unittest期间禁用python日志记录,python,python-2.7,python-unittest,Python,Python 2.7,Python Unittest,我正在处理一个项目,该项目每次运行时都会创建一个不同的日志文件。我有一些单元测试来测试我的代码,但在这个过程中也会创建日志文件。我的应用程序代码如下所示: import unittest from module import TestRun class TestModule(unittest.TestCase): def test_function(self): tr = TestRun() tr.prep_test_run() 模块.py impor

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

import unittest
from module import TestRun

class TestModule(unittest.TestCase):
    def test_function(self):
        tr = TestRun()
        tr.prep_test_run()
模块.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()
我的测试代码如下所示:

import unittest
from module import TestRun

class TestModule(unittest.TestCase):
    def test_function(self):
        tr = TestRun()
        tr.prep_test_run()

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

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

首先,在
test\u function
中从记录器中删除处理程序:

def test_function(self):
    tr = TestRun()
    tr.logger.handlers = []
这是一种非常残酷的力量(它删除了所有日志处理程序,所以请小心使用),但它应该可以解决问题

第二种方法是通过向
TestRun添加关键字参数来控制是否首先生成日志

class TestRun:
    def __init__(self, file_logs = True):
        self.test_run_id = str(uuid4())
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.INFO)
        if file_logs:
            handler = logging.FileHandler('{}.log'.format(self.test_run_id))
            self.logger.addHandler(handler)
然后,当您在测试中创建一个实例时,执行
tr=TestRun(file\u logs=False)


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

这应该可以做到:

logging.getLogger(\uuuuu name\uuuuu).disabled=True

在导入后立即添加这一行。

以下是一个将禁用特定记录器的部分代码:

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
然后您可以这样使用它:

class MyTest(unittest.TestCase):

   def test_do_something(self):
      with disable_logger('mypackage.mymodule'):
          mymodule.do_something()

我不确定测试到底在测试什么,但您可以这样做:在写入文件后清理文件,或者将标志传递到类的一个或两个方法中,如
test=1
,在这些情况下,您可以创建if语句来跳过代码中的步骤,这些步骤会生成您不想要的日志文件。请注意,如
setUp
,单元测试支持一个
tearDown()
方法来处理类似的事情。这不会得到错误的记录器实例吗<代码>\uuuu name\uuuu
在测试代码中与定义了
TestRun
的地方不同。我选择这一点作为最佳答案,因为如果需要,我仍然可以获得
记录器
对象,而不必将其写入文件。