进行单元测试时,请阻止记录器将其打印到控制台

时间:2018-12-22 13:55:35

标签: unit-testing logging module exception-handling

我是Python的新手,但想创建一个包含以下内容的基本程序结构: -记录多个模块的日志,仅打印到一个日志文件; -跨所有模块的单元测试,忽略所有日志记录。

我的程序结构是:

Project
- Components
 |  - __init__.py
 |  - mathtoolbox.py
- Tests
 |  - __init__.py
 |  - test_mathtoolbox.py
__main__.py
- Logs
 |  - logfile.log

在mathtoolbox.py中,说我有一个函数除法,除了在ZeroDivisionError上可以尝试,当被捕获时,仅将错误打印到日志文件(没有任何日志记录将打印到控制台) 。下面提供了三个* .py文件中的代码

__ main__.py配置记录器并运行除法功能。

def main():
    X = mathtoolbox.divide(5, 0)
    print(X)


if __name__ == '__main__':
    import logging
    root_logger = logging.getLogger()
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)-8s - [%(module)-15s]: %(message)s when running %(funcName)s')
    handler = logging.FileHandler("Logs/logfile.log")
    handler.setFormatter(formatter)
    root_logger.setLevel(logging.DEBUG)
    root_logger.addHandler(handler)

    root_logger.info("Code has initiated the logger from " + __name__)

    main()

mathtoolbox.py具有:

import logging
logger = logging.getLogger(__name__)

def divide(x, y):
    logger.info("An INFO message from " + __name__)
    try:
        return x / y
    except ZeroDivisionError:
        logger.error(
            "An ERROR message from " + __name__)

和test_mathtoolbox.py具有:

import unittest
import Components.mathtoolbox as mathtoolbox


class Test(unittest.TestCase):

    def test_divide_when_zero(self):
        self.assertRaises(ZeroDivisionError, mathtoolbox.divide(5, 0))

    def test_divide(self):
        result = mathtoolbox.divide(6, 2)
        self.assertEqual(result, 3)


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

正常运行 main 时,它会完全按照我的意愿运行,控制台仅显示除法打印语句的结果,而日志文件则正确显示所有记录的内容。但是,在进行单元测试时,“ test_divide_when_zero”将在“控制台”上打印“我从Components.mathtoolbox发来的错误消息”,因为该单元测试已经断言了该异常,因此该错误消息是不必要的。我了解这是因为尚未运行 main 中的任何内容来配置记录器。那么,在进行单元测试时,有没有一种方法可以配置记录器以防止将其输出到控制台,或者有一个更聪明的框架来处理整个问题?

谢谢!

0 个答案:

没有答案