忽略 python 单元测试用例中的记录器功能

Ignore logger function in python unit test case

我正在为几个 python 程序编写测试用例。我使用了自定义记录器功能。

logger.info("Some text")
logger.error("some text")

现在记录器是从其他程序创建的对象。我有一个程序 "logger_1.py",我正在我当前的程序中导入该程序以创建一个记录器对象。

from logger_1 import getlogger

global logger
logger = getlogger("addaccess", "_log)

在我的单元测试用例中,我得到的记录器未定义。

如何跳过经过单元测试的函数中以 logger 开头的语句,或者我可以通过任何其他方式模拟或修补程序函数中的所有 logger 语句?

我看到了三个选项:

  1. 不要改变任何东西。让记录器记录并忽略它产生的任何输出。 Development/Testing/Staging 环境无论如何都应该记录到非生产系统,因此输出应该能够不加思索地丢弃。为了完整起见,我主要包括这个选项,但对于小型或不重要的系统,这是一个有效的解决方案。在您的情况下,这也不起作用,因为 logger_1.py 在测试期间似乎不可用。

  2. 更改创建记录器的代码,或者在本例中从另一个地方导入它,以便它使用不同的、特定于测试的记录器和输出位置。不过,捕获该执行环境(命令行、导入等)可能有点棘手。例如在我们的系统中我们通常包括一个

    if __name__ == "__main__":
        #do something with logger
    

    块,这样如果文件是从命令行调用的,而不是导入到测试套件中,那么记录器会指向其他地方。

  3. 您可以使用虚拟记录器模拟每个测试方法的记录器:

    from unittest import mock, TestCase
    
    create_dummy_logger():
        #create and return a dummy logger
        pass
    
    SomethingTests(TestCase):
        @mock.patch("getlogger", create_dummy_logger)
        test_method_that_logs_something(self):
            pass