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

Posted

技术标签:

【中文标题】如何查看在 Django 的 manage.py test 命令期间运行了哪些测试【英文标题】:How to see which tests were run during Django's manage.py test command 【发布时间】:2014-02-25 08:16:53 【问题描述】:

使用 Django 的 manage.py test 命令完成测试执行后,只有通过的测试数量会打印到控制台。

(virtualenv) G:\Project\>python manage.py test
Creating test database for alias 'default'...
True
..
----------------------------------------------------------------------
Ran 2 tests in 0.017s

OK
Destroying test database for alias 'default'...

有什么办法可以看到:

    实际执行了哪些测试 来自哪个模块 按什么顺序

我在文档中没有找到任何解决方案。

【问题讨论】:

【参考方案1】:

您可以将-v 2 传递给test 命令:

python manage.py test -v 2

运行此命令后,您将得到类似的结果(我使用的是 django 2,请随意忽略迁移/数据库的内容):

Creating test database for alias 'default' ('file:memorydb_default?mode=memory&cache=shared')...
Operations to perform:
  Synchronize unmigrated apps: messages, staticfiles
  Apply all migrations: admin, auth, contenttypes, sessions
Synchronizing apps without migrations:
  Creating tables...
   Running deferred SQL...
Running migrations:
  Applying contenttypes.0001_initial... OK
  ...
  Applying sessions.0001_initial... OK
System check identified no issues (0 silenced).
test_equal_hard (polls.tests.TestHard) ... ok      <--------+
test_equal_simple (polls.tests.TestSimple) ... ok  <--------+
                                                            |
                                                            |
           That's your tests!  >----------------------------+

顺便说一句,v 代表冗长(你也可以使用--verbosity=2):

python manage.py test --verbosity=2

这是python manage.py test --help的摘录:

-v 0,1,2,3, --verbosity 0,1,2,3

详细程度; 0=最小输出,1=正常输出, 2=详细输出,3=非常详细的输出

【讨论】:

我尝试了所有详细级别,但找不到显示没有迁移/数据库输出的单元测试的级别。如果没有 3rd 方库,这真的不可能吗? 要隐藏迁移日志,您可以执行类似python manage.py test -v 2 | grep test*【参考方案2】:

奈杰尔的回答很棒,而且绝对是入门门槛最低的选择。但是,您可以使用django_nose 获得更好的反馈(而且设置起来并不困难;)。

以下来自:BDD with Python

首先:安装一些要求:

pip install nose pinocchio django_nose

然后将以下内容添加到settings.py

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = ['--with-spec', '--spec-color']

然后正常运行测试:

python manage.py test

输出应该是这样的:

注意:您所测试的 cmets 可用于提供比名称更好的输出。

例如:

def test_something(self):
    """Something should happen"""
    ...

运行测试时会输出“Something should occur”。

加分项:您还可以生成/输出您的代码覆盖率:

pip install coverage

在 settings.py 中将以下内容添加到您的 NOSE_ARGS:'--with-coverage', '--cover-html', '--cover-package=.', '--cover-html-dir=reports/cover'

例如:

NOSE_ARGS = ['--with-spec', '--spec-color', 
         '--with-coverage', '--cover-html', 
         '--cover-package=.', '--cover-html-dir=reports/cover']

然后,当您运行 python manage.py test 时,您将获得一个很好的代码覆盖率摘要,以及在 reports/cover 中的一个简洁的 html 报告

【讨论】:

嗨@toast38coza。这很整洁。我是 Python 新手,很高兴看到格式良好的测试输出。我正在寻找 NOSE_ARGS 的文档,但我发现的内容都没有显示 --With-spec 和类似的。你能指点我吗?我基本上是想防止鼻子重复“类似于 TransactionTestCase,但使用transaction.atomic() 来实现测试隔离......nTestCase 可能是必要的(例如测试一些事务行为)。” @MacarioTala --with-spec 参数来自pinocchio 插件(你可以 pip install )。看看上面说的:“首先安装一些要求”。 是的。我已经安装好了。让我试着找到有关木偶奇遇记的文档。谢谢! 为了分享,我换掉了匹诺曹,因为它有点太冗长了,而不是分叉,我发现了这个:gfxmonk.net/dist/0install/rednose.xml,你可能也会喜欢它。

以上是关于如何查看在 Django 的 manage.py test 命令期间运行了哪些测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 中的 manage.py CLI 从数据库中删除所有表?

如何解决在 Django 中执行 manage.py runserver 命令时的错误原因?

如何直接从测试驱动程序调用自定义 Django manage.py 命令?

如何仅使用 django manage.py makemessages 创建 .pot 文件

Django如何自定义manage.py命令? 达到启动后台进程的目的?

Heroku 上的 Django manage.py 自定义命令