在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
的地方不同。我选择这一点作为最佳答案,因为如果需要,我仍然可以获得记录器
对象,而不必将其写入文件。