【问题标题】:Organizing Django unit tests组织 Django 单元测试
【发布时间】:2011-07-06 20:25:17
【问题描述】:

现在我的 Django 单元测试位于 mcif/tests.py。我更喜欢mcif/tests/foo_test.py、mcif/tests/bar_test.py 等类似的东西,但如果我以这种方式组织测试,Django 就会失败。

有没有办法做我想做的事情,还是我必须将所有测试放在一个文件中?

【问题讨论】:

标签: django unit-testing


【解决方案1】:

注意:这描述了 Django 1.6 之前的行为。见Artur Soler's answer for Django 1.6 and later。

制作一个包:myapp/tests/

在包中,根据需要放置尽可能多的不同测试模块。在tests 内的__init__.py 中,从这些模块中导入测试。 (或者这个主题的一些变化。)

编辑:哇,没有注意到你已经提到了tests 包。

重要的是从包中获取所有可用的东西。 Django 将从包中获取测试,因此它们必须在 __init__.py 中可见。

[编辑:添加了关于 Django 1.6 版的注释]

【讨论】:

  • 从 Django 1.6 开始不再有效,请参阅下面的回复。
【解决方案2】:

在你的 __init__.py 中输入如下内容:

from foo_test import *
from bar_test import *

【讨论】:

  • 包必须注册到settings.py吗?
  • 当您有一个名为__init__.py 的文件时,该文件夹将充当一个模块。只要文件夹的父级在 python 的sys.path 中,则不需要在settings.py 中进行额外的“注册”,只需导入和使用即可。
  • 我在我的应用程序中设置了一个测试包,并在 __inti__.py 中导入了两个模块 - tests.py 和 selenium_tests.py。但是我怎样才能选择只运行硒测试呢?我尝试了./manage.py test myapp.selenium_tests 或./manage.py test myapp.tests.slenium_tests,但它无法识别它们。
  • 您可能不需要添加myapp.,并且通常重新检查您的语法是否有错误。
  • 我认为myapp 是必要的,因为我在其他应用程序中有selenium_tests.py。那么知道如何为特定应用选择 selenium_tests 吗?
【解决方案3】:

从 Django 1.6 版本开始,测试发现机制发生了变化。您不再需要从 tests/__init__.py 导入所有内容,但现在您必须确保包含测试的所有文件都与模式 test*.py 匹配。

因此,现在您应该拥有app/tests/test_models.py 和app/tests/test_views.py,而不是app/tests/models.py 和app/tests/views.py。

您还可以创建一个名为 app/tests/test.py 的文件,并从那里包含您的其他文件。问题是 runner 会寻找匹配模式 test*.py 的文件并执行它们。

【讨论】:

  • +1 用于 Django 1.6。此外,__init__.py 中的导入不再起作用。
  • 添加到这个。创建测试/文件夹添加 init.py(无导入)创建测试/测试.py(并将导入放在那里)这样您就可以离开每个测试文件的测试前缀。如果那是首选
  • 还要确保在使用测试包时删除 tests.py
  • 我需要在我的 tests/ 文件夹中创建一个(空的)__init__.py 文件,这样 Pylint 就不会显示关于它无法解析的视图的错误。
【解决方案4】:

只是为了添加到Artur Soler 的伟大answer...

您还可以使用--pattern 选项来指定测试文件的命名方式。

例如,如果您的测试文件名为foo_test.py、bar_test.py 或类似名称,您可以使用:

$ ./manage.py test --pattern="*_test.py"

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    相关资源
    最近更新 更多