我确定这是一个简单的修复,但我想在运行单元测试时在PyCharm控制台中查看日志消息。我正在测试的模块有自己的记录器,通常我会设置一个根记录器来捕获某个级别的调试消息,并将其他日志传递给一个文件。但我无法弄清楚它如何与单元测试一起使用。
我正在使用unittest2模块,并使用PyCharm的自动测试发现(可能是基于鼻子,但我不知道)。
我试过愚弄运行配置,但似乎没有一种直接的方法来做到这一点。
如果你们中的任何人在那里工作,那么PyCharm文档在这里也没有特别的帮助。
在编辑中:显示控制台似乎捕获了关键级别的日志消息。我想知道是否有办法配置它以捕获调试级别消息。
这篇文章(Pycharm unit test interactive debug command line doesn't work)建议在构建配置中添加-s
选项,这不会产生所需的结果。
答案 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)
在编辑配置中:
像一个"魅力"对于我在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)