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

32
我相信这是一个简单的修复,但我想在运行单元测试时在PyCharm控制台中查看日志消息。我正在测试的模块有它们自己的记录器,通常我会设置一个根记录器来捕获某个级别的调试消息,并将其他日志导入文件。但我无法弄清楚如何在单元测试中实现这一点。
我正在使用unittest2模块,并使用PyCharm的自动测试发现(可能基于nose,但我不知道)。
我尝试了运行配置,但似乎没有直接的方法来实现这一点。
如果你们中有任何人在那里工作,PyCharm文档在这方面也没有什么帮助。
在编辑中:看起来控制台能够捕获关键级别的日志消息。我想知道是否有一种配置方法可以捕获调试级别的消息。
这篇文章(Pycharm单元测试交互式调试命令行不起作用)建议在构建配置中添加-s选项,但这并不能产生期望的结果。
8个回答

23

我找到的唯一解决方案是在包含测试的文件顶部进行正常的日志设置:logging.basicConfig(level=logging.DEBUG)。确保将其放在大多数导入语句之前,否则这些模块的默认日志记录已经被设置(这是一个难以理解的问题!)。


谢谢您的建议。我已经编写了一个模块,它包装了Python的日志记录模块(我希望在大型代码库中拥有统一的日志记录配置),并且我已经在该模块中设置了基本的日志记录配置。 - BenDundee

2

我需要在Pycharm 2016.3.2中将--nologcapture选项作为参数添加到nosetests中。

运行>编辑配置 > 默认配置 > Python测试 > Nosetests: 激活参数选项,并添加--nologcapture。


5
在PyCharm 2019 2.3中运行代码时,可能会遇到以下错误信息:_pytest.config.exceptions.UsageError: usage: _jb_pytest_runner.py [options] [file_or_dir] [file_or_dir] [...] _jb_pytest_runner.py: error: unrecognized arguments: --nologcapture - Hryhorii Liashenko

2
在编辑配置中:
  • 删除旧的配置
  • 进入默认值/Python测试/NoseTests
  • 在"附加参数"中添加--nologcapture
在pyCharm 2017.2.3中,这对我非常有效。
感谢bott。

1
我在更新Pycharm后突然遇到了这个问题。我一直在使用Unittest运行器运行我的测试,但突然间Pycharm决定默认应该是pytest运行器。当我将默认的测试运行器改回Unittest时,日志会按照我预期的方式出现。
您可以在项目设置/首选项>>工具>>Python集成工具中更改默认的测试运行器。
我认为像其他答案中提到的添加-nologcapture标志可能在我的情况下也有效,但我更喜欢由IDE公开的解决方案而不是手动覆盖。
顺便说一句,选择Unittest还解决了我尝试运行测试时遇到的一个额外错误-找不到'mose'模块

1

我的问题类似,在PyCharm中运行测试时,我只看到了警告级别或更高级别的消息。一位同事建议在我的测试目录下的__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')

0

问题中提到的 -s 选项与使用 stream=sys.stdout 添加 StreamHandler 的组合对我起作用了。

enter image description here

import logging
import sys

logger = logging.getLogger('foo')
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
logger.warning('foo')

Pycharm单元测试交互式调试命令行不起作用


0
PyCharm在默认情况下通过添加--no-summary标志来抑制日志,当运行测试时。您可以通过转到文件>设置>高级设置>Python并选中选项Pytest:不要添加"--no-header --no-summary -q"来覆盖此行为。
更详细的答案请参见https://dev59.com/VsXsa4cB1Zd3GeqPXEDj#73873315

-1

如果正在运行 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)

2
请避免让"代码自己说话",并提供解释以帮助原帖作者理解为什么你的解决方案最好。 - Kasia Gogolek
1
我们是程序员。最准确的描述方式,就是代码本身。你测试它。你调试它。你逐步执行它。没有误解。(我喜欢“Bob大叔”的方法...) - bitranox
1
请提供解释。我没有时间阅读您的代码以决定它是否能解决我的问题。这会使您的贡献比可能更少有用。 - hibernado
这个答案正是我所寻找的。 - Dinis Cruz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接