繁体   English   中英

在 PyCharm 中进行单元测试时如何查看日志消息?

[英]How can I see log messages when unit testing in PyCharm?

我确定这是一个简单的修复,但我想在运行单元测试时在 PyCharm 控制台中查看日志消息。 我正在测试的模块有自己的记录器,通常我会设置一个根记录器来捕获某个级别的调试消息,并将其他日志通过管道传输到一个文件。 但我无法弄清楚这如何与单元测试配合使用。

我正在使用 unittest2 模块,并使用 PyCharm 的自动测试发现(这可能基于鼻子,但我不知道)。

我试过欺骗运行配置,但似乎没有一种直接的方法来做到这一点。

PyCharm 文档在这里也不是特别有用,如果你们在那里工作的话。


在编辑中:似乎控制台捕获了关键级别的日志消息。 我想知道是否有办法对其进行配置以捕获调试级别的消息。


这篇文章( Pycharm 单元测试交互式调试命令行不起作用)建议将-s选项添加到构建配置中,这不会产生所需的结果。

我找到的唯一解决方案是在文件顶部进行正常的日志记录设置,其中包含测试(假设您只运行一个测试或测试类): logging.basicConfig(level=logging.DEBUG) 确保将其放在大多数 import 语句之前,或者已经设置了这些模块的默认日志记录(这很难弄清楚!)。

我还需要在 pycharm 2016.3.2 中将选项 --nologcapture 添加到鼻子测试作为参数

运行>编辑配置>默认值> Python测试> Nosetests:激活检查Prams选项并添加--nologcapture

在编辑配置中:

  • 删除旧配置
  • 转到默认值/Python 测试/NoseTests
  • 将 --nologcapture 添加到“附加参数”

在 pyCharm 2017.2.3 中对我来说就像一个“魅力”

谢谢博特

我的问题很相似,在 PyCharm 中运行测试时,我只看到级别为 WARNING 或更高级别的消息。 一位同事建议在我的测试目录中的__init__.py配置记录器。

# in tests/__init__.py
import logging
import sys

# Reconfiguring the logger here will also affect test running in the PyCharm IDE
log_format = '%(asctime)s %(levelname)s %(filename)s:%(lineno)d %(message)s'
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format=log_format)

然后我可以简单地登录测试代码,如:

import logging
logging.info('whatever')

更新 Pycharm 后,我突然遇到了这个问题。 我一直在用Unittest runner 运行我的测试,突然之间 Pycharm 决定默认应该是pytest runner。 当我将默认的测试运行程序改回Unittest ,日志会按照我的预期出现。
您可以在 Project Settings/Preferences >> Tools >> Python Integrated Tools 中更改默认测试运行程序

我假设添加其他答案中提到的-nologcapture标志可能也适用于我的情况,但我更喜欢由 IDE 公开的解决方案,而不是手动覆盖。

顺便说一句,选择Unittest还解决了我在尝试运行测试时遇到的另一个错误 -没有名为“nose”的模块

添加一个流处理程序,如果 doctest 或 pytest 正在运行,则指向 sys.stdout:

    import logging
    import sys
    logger = logging.getLogger()

    def setup_doctest_logger(log_level:int=logging.DEBUG):
        """

        :param log_level:
        :return:

        >>> logger.info('test')     # there is no output in pycharm by default
        >>> setup_doctest_logger()
        >>> logger.info('test')     # now we have the output we want
        test

        """
        if is_pycharm_running():
            logger_add_streamhandler_to_sys_stdout()
        logger.setLevel(log_level)

    def is_pycharm_running()->bool:
        if ('docrunner.py' in sys.argv[0]) or ('pytest_runner.py' in sys.argv[0]):
            return True
        else:
            return False

    def logger_add_streamhandler_to_sys_stdout():
        stream_handler=logging.StreamHandler(stream=sys.stdout)
        logger.addHandler(stream_handler)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM