组织Django单元测试

59

现在我的Django单元测试存放在mcif/tests.py。我更喜欢像mcif/tests/foo_test.pymcif/tests/bar_test.py等这样的结构,但是如果我以这种方式组织我的测试,Django就会出问题。

有没有办法实现我想要的东西,或者我必须将所有测试都放在一个文件中?


4
可能是如何将Django单元测试分散到多个文件中?的重复问题。 - Ciro Santilli OurBigBook.com
5个回答

145

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

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

您还可以创建一个名为app/tests/test.py的文件,并从那里包含其他文件。问题在于运行程序将查找与模式test*.py匹配的文件并执行它们。


12
支持Django 1.6。此外,“init.py”中的导入不再起作用。 - davekr
2
补充一下。创建 tests/ 文件夹 添加 init.py(无导入) 创建 tests/tests.py(并将导入放在其中)这样,您可以省略每个测试文件的测试前缀。如果更喜欢这种方式。 - McP
3
请确保在使用测试包时移除 tests.py 文件。 - f3r3nc
6
我需要在 tests/ 文件夹中创建一个(空的)__init__.py 文件,以便 Pylint 不会显示无法解析视图的错误。 - David Dahan
3
参考:Django文档 https://docs.djangoproject.com/en/1.8/topics/testing/overview/#running-tests - Wtower
显示剩余2条评论

17

注意:此文描述的是 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 的说明]


5
从Django 1.6开始不再有效,请参见我下面的回复。 - Artur Soler

3

补充一下Artur Soler的出色的答案...

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

例如,如果你的测试文件命名为foo_test.pybar_test.py等类似的名称,你可以使用以下命令:

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

2
在你的 __init__.py 文件中添加类似以下内容的代码:
from foo_test import *
from bar_test import *

这个包必须在settings.py中注册吗? - Darwin Tech
1
当你有一个名为__init__.py的文件时,该文件夹将作为一个模块。只要该文件夹的父级在Python的sys.path中,就不需要在settings.py中进行额外的“注册”,只需导入并使用即可。 - Evgeny
我在我的应用程序中设置了一个测试包,并在__init__.py中导入了两个模块 - tests.pyselenium_tests.py。但是,我该如何选择仅运行selenium测试?我尝试过./manage.py test myapp.selenium_tests./manage.py test myapp.tests.slenium_tests,但它们都无法识别。 - Darwin Tech
你可能不需要添加myapp.,并且通常需要检查语法错误。 - Evgeny
我认为myapp很有必要,因为在其他应用中有selenium_tests.py。那么,您有任何想法如何只选定特定应用程序的selenium_tests吗? - Darwin Tech
为了像这样运行它 ./manage.py test myapp.tests.selenium_tests,我认为你需要创建一个 selenium_tests 包而不是文件... - ilovett

0

正如@artur-soler所解释的那样,

假设您有一个名为“AppName”的应用程序:

AppName tests

你在测试文件夹中的__init__.py应该包含类似以下内容的代码 -

from AppName.tests import *

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接