2017-09-01 104 views
0

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

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

我不确定测试的确切内容,但您可以:在写入文件之后清理文件,或将标记传入一个或两个类的方法(如'test = 1'),在这些情况下,您创建if语句以跳过代码中使日志文件不需要的步骤。 – JacobIRR

+0

请注意,像'setUp'一样,Unit Tests支持'tearDown()'方法来处理完全像这样的事情。 – JacobIRR

回答

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)

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

+0

我选择这个作为最好的答案,因为如果我需要的话,我仍然可以获得'logger'对象而不将它写入文件。 – mkerins

0

这应该做的伎俩:

logging.getLogger(__name__).disabled = True

您的进口之后添加此行。

+0

不会得到错误的记录器实例吗?测试代码中的'__name__'将与定义'TestRun'的地方不同。 –