【发布时间】:2011-07-06 20:25:17
【问题描述】:
现在我的 Django 单元测试位于 mcif/tests.py。我更喜欢mcif/tests/foo_test.py、mcif/tests/bar_test.py 等类似的东西,但如果我以这种方式组织测试,Django 就会失败。
有没有办法做我想做的事情,还是我必须将所有测试放在一个文件中?
【问题讨论】:
标签: django unit-testing
现在我的 Django 单元测试位于 mcif/tests.py。我更喜欢mcif/tests/foo_test.py、mcif/tests/bar_test.py 等类似的东西,但如果我以这种方式组织测试,Django 就会失败。
有没有办法做我想做的事情,还是我必须将所有测试放在一个文件中?
【问题讨论】:
标签: django unit-testing
注意:这描述了 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 版的注释]
【讨论】:
在你的 __init__.py 中输入如下内容:
from foo_test import *
from bar_test import *
【讨论】:
__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 吗?
从 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 的文件并执行它们。
【讨论】:
__init__.py 中的导入不再起作用。
tests/ 文件夹中创建一个(空的)__init__.py 文件,这样 Pylint 就不会显示关于它无法解析的视图的错误。
只是为了添加到Artur Soler 的伟大answer...
您还可以使用--pattern 选项来指定测试文件的命名方式。
例如,如果您的测试文件名为foo_test.py、bar_test.py 或类似名称,您可以使用:
$ ./manage.py test --pattern="*_test.py"
【讨论】: