【问题标题】:Change log level in unittest在 unittest 中更改日志级别
【发布时间】:2016-09-15 20:37:06
【问题描述】:

我的印象(但没有找到它的文档)unittest 将所有记录器的记录级别设置为WARNING。我想:

  • 能够从命令行(运行测试时)或从测试模块本身指定所有记录器的记录级别
  • 避免 unittest 弄乱应用程序日志记录级别:在运行测试时,我希望获得与运行应用程序时相同的日志记录输出(相同级别)

我怎样才能做到这一点?

【问题讨论】:

  • 像往常一样,您能否举一个最小但完整的示例,以及预期和实际输出?
  • 您现在有没有机会找到答案?你愿意分享吗?在我的情况下,只有INFO 日志消息出现,我也想看到DEBUG 消息。
  • @dan-j 你能提供一个最小的例子来重现你的问题吗?
  • 不,unittest 不会自动更改日志记录级别。期间。
  • 更有可能是您的生产代码运行了一段配置日志记录的代码,而您的单元测试没有运行。没有配置意味着应用默认值。这与单元测试更改配置不同。

标签: python logging python-unittest


【解决方案1】:

我不相信unittest 本身对日志记录有任何作用,除非您使用它定义的_CapturingHandler 类。这个简单的程序演示:

import logging
import unittest

logger = logging.getLogger(__name__)

class MyTestCase(unittest.TestCase):
    def test_something(self):
        logger.debug('logged from test_something')


if __name__ == '__main__':
    # DEBUG for demonstration purposes, but you could set the level from
    # cmdline args to whatever you like
    logging.basicConfig(level=logging.DEBUG, format='%(name)s %(levelname)s %(message)s')
    unittest.main()

运行时会打印

__main__ DEBUG logged from test_something
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

显示它正在记录DEBUG 级别的事件,正如预期的那样。所以这个问题很可能与其他事情有关,例如正在测试的代码,或其他更改日志配置或重定向sys.stdoutsys.stderr 的测试运行程序。您可能需要提供有关您的测试环境的更多信息,或者更好的是演示问题的最小程序(正如我上面的示例所示,unittest 本身不会导致您描述的问题)。

【讨论】:

    【解决方案2】:

    参见下面的 Python 登录示例。您也可以使用 'setLevel' 方法更改 LOG_LEVEL。

    import os
    import logging
    
    logging.basicConfig()
    logger = logging.getLogger(__name__)
    
    # Change logging level here.
    logger.setLevel(os.environ.get('LOG_LEVEL', logging.INFO))
    
    logger.info('For INFO message')
    logger.debug('For DEBUG message')
    logger.warning('For WARNING message')
    logger.error('For ERROR message')
    logger.critical('For CRITICAL message')
    

    【讨论】:

    • 这确实是python日志框架的设置方式。但是 OP 暗示这在涉及单元测试时不起作用。 unittest 显然把事情搞砸了,所以 whyhowwhat to do?
    • logger.warn() 已弃用。您现在应该使用 logger.warning()
    【解决方案3】:

    这是对@Vinay 上述回答的补充。它没有回答最初的问题。我想包括用于修改日志级别的命令行选项。目的是仅当我从命令行传递某个参数时才能获取详细的登录信息。我就是这样解决的:

    import sys
    import unittest
    import logging
    from histogram import Histogram
    class TestHistogram(unittest.TestCase):
    
    def test_case2(self):
        h = Histogram([2,1,2])
        self.assertEqual(h.calculateMaxAreaON(), 3)
    
    if __name__ == '__main__':
        argv = len(sys.argv) > 1 and sys.argv[1]
        loglevel = logging.INFO if argv == '-v' else logging.WARNING
        logging.basicConfig(level=loglevel)
        unittest.main() 
    

    目的是获得更详细的日志记录。我知道它不能回答这个问题,但我会把它留在这里,以防有人来寻找类似的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2016-07-25
      • 1970-01-01
      相关资源
      最近更新 更多