运行 Django 测试时如何查看标准输出?
Posted
技术标签:
【中文标题】运行 Django 测试时如何查看标准输出?【英文标题】:How do I see stdout when running Django tests? 【发布时间】:2010-11-17 04:51:01 【问题描述】:当我使用./manage.py test
运行测试时,我通过print
发送到标准输出的任何内容都不会显示。当测试失败时,我会在每个失败的测试中看到一个“stdout”块,所以我猜 Django 会捕获它(但在测试通过时不会显示它)。
【问题讨论】:
您应该将自己的答案标记为正确,因为它是正确的。 我的 Django 版本 1.11 打印所有内容,没有任何-s
或 --no-input
【参考方案1】:
在settings.py
中检查了TEST_RUNNER
,它使用了一个调用Nose 的项目特定的跑步者。 Nose 有 -s
选项来阻止它捕获 stdout
,但如果我运行:
./manage.py test -s
manage.py
首先捕获它并抛出“没有这样的选项”错误。 manage.py
的帮助没有提到这一点,但我发现如果我运行:
./manage.py test -- -s
它忽略了-s
,让我在自定义跑步者的一侧捕捉它,毫无问题地将它传递给鼻子。
【讨论】:
因为我使用的是 contrib.sites 框架,所以我为我的测试指定了 --settings。当我这样做时, -s 标志按预期运行,并在 -s 引发 OSError 之前传入另一个 -- (没有此类文件 -s)。 仅作记录。如果您在 INSTALLED_APPS after django_nose 中安装了 django_south,它不会让您为鼻子提供选项(如 -s)。您需要将南 before django_nose 放在 INSTALLED_APPS 中。这是我的问题 奇怪的是,print(...)
似乎对我有用,但pprint.pprint(...)
的漂亮打印输出不会显示在控制台中。
对我来说添加 -s 效果很好,因为我被建议不要使用 settings.py 文件。【参考方案2】:
是的,这个问题是由NoseTestSuiteRunner
引起的。添加-- -s
很棘手,并不是最好的解决方案。
尝试在settings.py
中添加以下行:
NOSE_ARGS = ['--nocapture',
'--nologcapture',]
这解决了我的问题。
【讨论】:
这是正确答案。-- -s
方法会导致不良副作用。【参考方案3】:
有几个级别的详细信息会影响我们看到的细节数量: 你可以试试:
python manage.py test -v 2
其他可用级别是:
-v 0
: 最少的细节
-v 1
:默认
-v 2
:更多细节,例如包括打印语句。
【讨论】:
这个比玩记录器方便多了,谢谢! aka--verbosity
(相同参数的长名称)【参考方案4】:
使用所有相关软件包的当前版本(Django==1.11.2
、django-nose==1.4.5
和 nose==1.3.7
)在运行测试时添加 --nocapture
标志就足够了。这样一个简单的
./manage.py test --nocapture
足够了。
当然你有
TEST_RUNNER = "django_nose.NoseTestSuiteRunner"
在你的settings.py
【讨论】:
【参考方案5】:您可能有一些中间测试运行程序,例如 Nose,拦截和存储标准输出。尝试直接运行 Django 测试,或者改为写入 stderr。
【讨论】:
你是对的。直接运行 django 测试是行不通的,因为自定义运行器会进行很多设置,但我能够跟踪问题并修复它。现在这是我的第一个问题,所以可以编辑问题以包含上述解决方案吗?谢谢! 最好的办法是发布你自己的答案。 情况并非总是如此,我遇到过您在没有鼻子的情况下出现这种行为的情况。我没有解决方案,但我认为这个答案不完整。以上是关于运行 Django 测试时如何查看标准输出?的主要内容,如果未能解决你的问题,请参考以下文章