我正在开发一个项目,每次运行时都会创建一个不同的日志文件。我有一些单元测试来测试我的代码,但在此过程中也会导致创建日志文件。我的应用程序代码如下所示:
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)
中设置日志级别,但它不起作用。
答案 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}}
在导入后立即添加此行。