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

i1icjdpr  于 2022-11-08  发布在  PyCharm
关注(0)|答案(7)|浏览(210)

我确信这是一个简单的修复,但是我想在PyCharm控制台 * 中查看日志消息,同时运行一个单元测试 *。我正在测试的模块有它们自己的日志记录器,通常我会设置一个根日志记录器来捕获某个级别的调试消息,并将其他日志传输到一个文件中。但是我不知道这是如何在单元测试中工作的。
我正在使用unittest2模块,并使用PyCharm的自动测试发现(可能是基于nose的,但我不知道)。
我试过修改运行配置,但似乎没有一种简单的方法来实现。
PyCharm文档在这里也不是特别有用,如果您在那里工作的话。
在编辑中:它确实看起来控制台捕捉到了关键级别的日志消息。我想知道是否有一种方法可以配置它来捕捉调试级别的消息。
这篇文章(Pycharm unit test interactive debug command line doesn't work)建议将-s选项添加到构建配置中,但这并没有产生预期的结果。

kxkpmulp

kxkpmulp1#

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

7y4bm7vi

7y4bm7vi2#

我还需要在pycharm 2016.3.2中添加选项--nologcapture到nosetests作为参数
运行〉编辑配置〉默认值〉Python测试〉鼻测试:激活检查Prams选项并添加--nologcapture

pxiryf3j

pxiryf3j3#

在编辑组态中:

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

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

xeufq47z

xeufq47z4#

我的问题也是类似的,我在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')
h79rfbju

h79rfbju5#

我在更新Pycharm后突然遇到了这个问题。我一直在用Unittest运行器运行我的测试,突然Pycharm决定默认使用pytest运行器。当我把默认的测试运行器改回Unittest时,日志就像我预期的那样出现了。
您可以在“项目设置/首选项”〉〉“工具”〉〉“Python集成工具”中更改默认测试运行程序
我假设添加-nologcapture标志(如其他答案中所述)可能也适用于我的情况,但我更喜欢由IDE公开的解决方案,而不是手动覆盖。
顺便说一句,选择Unittest还解决了我在尝试运行测试时遇到的一个附加错误-No module named 'nose'

k2fxgqgv

k2fxgqgv6#

在问题中提到的-s选项组合中使用stream=sys.stdout添加StreamHandler对我来说确实有效。

import logging
import sys

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

Pycharm unit test interactive debug command line doesn't work

qrjkbowd

qrjkbowd7#

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

相关问题