在unittest期间禁用python日志记录

时间:2017-09-01 21:30:09

标签: python python-2.7 python-unittest

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

module.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)中设置日志级别,但它不起作用。

3 个答案:

答案 0 :(得分:1)

这是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

然后可以像这样使用它:

class MyTest(unittest.TestCase):

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

答案 1 :(得分:0)

我看到两个处理这个问题的路径:要么删除处理程序,要么从不创建它。

首先,从test_function

中的记录器中删除处理程序
def test_function(self):
    tr = TestRun()
    tr.logger.handlers = []

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

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

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_logs = False)

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

答案 2 :(得分:0)

这应该可以解决问题:

{{1}}

在导入后立即添加此行。