代码之家  ›  专栏  ›  技术社区  ›  mkerins

在unittest期间禁用python日志记录

  •  0
  • mkerins  · 技术社区  · 8 年前

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

    单元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 回复  |  直到 8 年前
        1
  •  1
  •   Nathan Villaescusa    7 年前

    这是一个 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()
    
        2
  •  0
  •   Josh Karpel    8 年前

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

    首先,从中的记录器中删除处理程序 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) .

        3
  •  0
  •   vadimhmyrov    8 年前

    这应该可以做到:

    logging.getLogger(__name__).disabled = True