[英]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
在编辑配置中:
在 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.