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

时间:2014-06-28 19:12:36

标签: python pycharm

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

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

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

如果你们中的任何人在那里工作,那么PyCharm文档在这里也没有特别的帮助。


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


这篇文章(Pycharm unit test interactive debug command line doesn't work)建议在构建配置中添加-s选项,这不会产生所需的结果。

6 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:3)

我还需要在pycharm 2016.3.2

中添加选项--nologcapture to nosetests as param

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

答案 2 :(得分:1)

在编辑配置中:

  • 删除旧配置
  • 转到Defaults / Python tests / NoseTests
  • 将--nologcapture添加到"其他参数"

像一个"魅力"对于我在pyCharm 2017.2.3

感谢bott

答案 3 :(得分: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')

答案 4 :(得分:0)

在更新Pycharm之后,我突然遇到了这个问题。我一直在用Unittest运行程序进行测试,Pycharm突然决定默认值应该是pytest运行程序。当我将默认测试运行器重新更改为Unittest时,日志便按照我的预期显示了。
您可以在项目设置/首选项>>工具>> Python集成工具

中更改默认测试运行器

我假设添加-nologcapture标志(如其他答案中所述)也可能适用于我的情况,但是我更喜欢IDE公开的解决方案,而不是手动替代。

顺便说一句,选择Unittest还能解决我尝试运行测试时遇到的另一个错误-No module named 'nose'

答案 5 :(得分:-2)

添加一个流处理程序,如果正在运行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)