简体   繁体   English

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

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

I'm sure this is a simple fix, but I'd like to view log messages in the PyCharm console while running a unit test .我确定这是一个简单的修复,但我想在运行单元测试时在 PyCharm 控制台中查看日志消息。 The modules I'm testing have their own loggers, and normally I'd set a root logger to catch the debugging messages at a certain level, and pipe the other logs to a file.我正在测试的模块有自己的记录器,通常我会设置一个根记录器来捕获某个级别的调试消息,并将其他日志通过管道传输到一个文件。 But I can't figure out how this works with unit tests.但我无法弄清楚这如何与单元测试配合使用。

I'm using the unittest2 module, and using PyCharm's automatic test discovery (which probably is based on nose, but I don't know).我正在使用 unittest2 模块,并使用 PyCharm 的自动测试发现(这可能基于鼻子,但我不知道)。

I've tried fooling with the run configurations, but there doesn't seem to be a straightforward way to do this.我试过欺骗运行配置,但似乎没有一种直接的方法来做到这一点。

The PyCharm documentation isn't particularly helpful here either, if any of you work there. PyCharm 文档在这里也不是特别有用,如果你们在那里工作的话。


In edit: It DOES appear that the console catches critical level log messages.在编辑中:似乎控制台捕获了关键级别的日志消息。 I want to know if there is a way to configure this to catch debug level messages.我想知道是否有办法对其进行配置以捕获调试级别的消息。


This post ( Pycharm unit test interactive debug command line doesn't work ) suggests adding the -s option to the build configuration, which does not produce the desired result.这篇文章( Pycharm 单元测试交互式调试命令行不起作用)建议将-s选项添加到构建配置中,这不会产生所需的结果。

The only solution I've found is to do the normal logging setup at the top of the file with tests in it (assuming you're just running one test or test class): logging.basicConfig(level=logging.DEBUG) .我找到的唯一解决方案是在文件顶部进行正常的日志记录设置,其中包含测试(假设您只运行一个测试或测试类): logging.basicConfig(level=logging.DEBUG) Make sure you put that before most import statements or the default logging for those modules will have already been set (that was a hard one to figure out!).确保将其放在大多数 import 语句之前,或者已经设置了这些模块的默认日志记录(这很难弄清楚!)。

I needed to add too the option --nologcapture to nosetests as param in pycharm 2016.3.2我还需要在 pycharm 2016.3.2 中将选项 --nologcapture 添加到鼻子测试作为参数

Run>Edit COnfigurations > Defaults > Python Tests > Nosetests : activate the check for Prams option and add --nologcapture运行>编辑配置>默认值> Python测试> Nosetests:激活检查Prams选项并添加--nologcapture

In Edit Configurations:在编辑配置中:

  • delete old configurations删除旧配置
  • go to Defaults / Python tests / NoseTests转到默认值/Python 测试/NoseTests
  • add --nologcapture to "additional Arguments"将 --nologcapture 添加到“附加参数”

worked like a "charm" for me in pyCharm 2017.2.3在 pyCharm 2017.2.3 中对我来说就像一个“魅力”

thanks bott谢谢博特

My problem was similar, I only saw messages with level WARNING or higher while running tests in PyCharm.我的问题很相似,在 PyCharm 中运行测试时,我只看到级别为 WARNING 或更高级别的消息。 A colleague suggested to configure the logger in __init__.py which is in the directory of my tests.一位同事建议在我的测试目录中的__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)

Then I can simply log in the test code like:然后我可以简单地登录测试代码,如:

import logging
logging.info('whatever')

I experienced this problem all of a sudden after updating Pycharm.更新 Pycharm 后,我突然遇到了这个问题。 I had been running my tests with the Unittest runner, and all of a sudden Pycharm decided the default should be the pytest runner.我一直在用Unittest runner 运行我的测试,突然之间 Pycharm 决定默认应该是pytest runner。 When I changed the default test runner back to Unittest the logs appeared as I expected they would.当我将默认的测试运行程序改回Unittest ,日志会按照我的预期出现。
You can change the default test runner in Project Settings/Preferences >> Tools >> Python Integrated Tools您可以在 Project Settings/Preferences >> Tools >> Python Integrated Tools 中更改默认测试运行程序

I assume adding the -nologcapture flag as noted in other answers probably would have worked in my case as well, but I prefer a solution that's exposed by the IDE rather than a manual override.我假设添加其他答案中提到的-nologcapture标志可能也适用于我的情况,但我更喜欢由 IDE 公开的解决方案,而不是手动覆盖。

BTW choosing Unittest also solves an additional error that I got once when trying to run tests - No module named 'nose'顺便说一句,选择Unittest还解决了我在尝试运行测试时遇到的另一个错误 -没有名为“nose”的模块

Add a stream handler, pointing to sys.stdout if doctest or pytest is running:添加一个流处理程序,如果 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