运行 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.2django-nose==1.4.5nose==1.3.7)在运行测试时添加 --nocapture 标志就足够了。这样一个简单的

./manage.py test --nocapture

足够了。

当然你有

TEST_RUNNER = "django_nose.NoseTestSuiteRunner"

在你的settings.py

【讨论】:

【参考方案5】:

您可能有一些中间测试运行程序,例如 Nose,拦截和存储标准输出。尝试直接运行 Django 测试,或者改为写入 stderr。

【讨论】:

你是对的。直接运行 django 测试是行不通的,因为自定义运行器会进行很多设置,但我能够跟踪问题并修复它。现在这是我的第一个问题,所以可以编辑问题以包含上述解决方案吗?谢谢! 最好的办法是发布你自己的答案。 情况并非总是如此,我遇到过您在没有鼻子的情况下出现这种行为的情况。我没有解决方案,但我认为这个答案不完整。

以上是关于运行 Django 测试时如何查看标准输出?的主要内容,如果未能解决你的问题,请参考以下文章

django 在运行测试时如何查看 sql 查询?

如何在 Django 中测试 send_mail?

如何通过 uwsgi 强制应用程序的标准输出日志?

如何将 Django 标准输出转发到 Elastic Beanstalk 日志?

如何在行为 (BDD) 中查看 print() 语句

如何查看在 Django 的 manage.py test 命令期间运行了哪些测试