./manage.py test app
现在..
tests.py
文件变得相当大/复杂/凌乱tests.py
分成更小的测试集合...... 如何?
答案 0 :(得分:114)
请注意,此方法在Django 1.6中不再有效,请参阅此post。
您可以在tests
内创建___init___.py
文件夹(以便它成为一个包)。然后在那里添加拆分测试.py文件,并在___init___.py
中导入所有文件。
I.e:用一个看起来像文件的模块替换test.py
文件:
在相关应用
下创建tests
目录
app app\models.py app\views.py app\tests app\tests\__init__.py app\tests\bananas.py app\tests\apples.py
将子模块导入app\tests\__init__.py
:
from bananas import *
from apples import *
现在您可以使用./manage.py,就好像它们都在一个文件中一样:
./manage.py test app.some_test_in_bananas
答案 1 :(得分:39)
Django 1.6中的行为已经改变,因此不再需要创建包。只需为您的文件命名test*.py
。
运行测试时,测试实用程序的默认行为是 查找所有测试用例(即unittest.TestCase的子类) 在名称以test开头的任何文件中,自动构建测试 从这些测试用例开始,运行该套件。
测试发现基于unittest模块的内置测试 发现。默认情况下,这将在任何名为的文件中发现测试 当前工作目录下的“test * .py”。
以前的行为,from Django 1.5 documentation:
运行测试时,测试实用程序的默认行为是 查找所有测试用例(即unittest.TestCase的子类) 在models.py和tests.py中,自动构建一个测试套件 那些测试用例,并运行该套件。
为模块定义测试套件还有第二种方法:如果你 在models.py或tests.py中定义一个名为suite()的函数 Django测试运行器将使用该函数来构建测试套件 对于那个模块。这遵循建议的单位组织 试验。有关如何使用的更多详细信息,请参阅Python文档 构建一个复杂的测试套件。
答案 2 :(得分:26)
Tomasz所说的答案是正确的。但是,确保__init__.py
中的导入与您的文件结构匹配可能会变得很繁琐。
要自动检测文件夹中的所有测试,您可以在__init__.py
中添加:
import unittest
def suite():
return unittest.TestLoader().discover("appname.tests", pattern="*.py")
这将允许您运行./manage.py test appname
但不会处理运行特定测试。为此,您可以使用此代码(也在__init__.py
中):
import pkgutil
import unittest
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(module_name).load_module(module_name)
for name in dir(module):
obj = getattr(module, name)
if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
exec ('%s = obj' % obj.__name__)
现在,您可以通过manage.py test app
或特定的manage.py test app.TestApples
答案 3 :(得分:8)
只需制作如下目录结构:
myapp/
__init__.py
tests/
__init__.py
test_one.py
test_two.py
...
...
python manage.py test myapp
将按预期工作。
答案 4 :(得分:5)
http://docs.python.org/library/unittest.html#organizing-tests谈到将文件拆分为模块,正上方的部分有一个例子。
答案 5 :(得分:1)
如果你有一个更复杂的设置,或者不想使用from ... import *
- 类型语句,你可以在tests.py中定义一个名为suite
的函数(或者test / __ init__.py ),返回unittest.TestSuite
的实例。
答案 6 :(得分:1)
无需在init中编写任何代码。 只需在您的应用中创建一个子目录。只有不要将其称为测试* 例如
app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py
答案 7 :(得分:0)
我认为./manage.py test
只是运行所有测试技巧(在django> = 1.7)。
如果您的组织测试是关于分组和 cherrypicking ,并且您是nose
使用django nose的粉丝:
python manage.py test another.test:TestCase.test_method
如果你知道鼻子,那么你就知道如何在所有文件中使用“通配符”。
PS
这只是一种更好的做法。希望有所帮助。答案来自这里:Running a specific test case in Django when your app has a tests directory
答案 8 :(得分:0)
使用Django 2.2,一个简单且相当不错的解决方案是在应用程序内创建一个测试文件夹,您可以将相关的test _... py文件放入其中,只需将 init .py添加到测试文件夹。
答案 9 :(得分:0)
我有两个文件。一个是tests.py
,另一个是test_api.py
。我可以如下单独运行它们。
manage.py test companies.tests
manage.py test companies.test_api
请参阅@osa关于文件命名约定的回复。
答案 10 :(得分:0)
在 django 中你可以使用下面的命令或者可以检查 documentation。此外,使用此命令将选取具有您提供的模式的文件,而不仅仅是 test*.py
或 test_*
.py。
文档
如果您的测试文件的名称与 test*.py 模式不同,您可以使用 -p(或 --pattern)选项指定自定义文件名模式匹配:
$ ./manage.py test --pattern="tests_*.py"
答案 11 :(得分:0)
假设您有以下测试文件:
tests_admins.py
tests_staff.py
tests_others.py
# will run both test files
(venv)..yourapp$./manage.py test --keepdb -v 2 appname
答案 12 :(得分:0)
或者在 Windows 中,如果您不想创建一个包(即带有 __init__.py
的文件夹)而只想创建一个名为“Tests”的文件夹,该文件夹包含测试文件,然后在 cmd 中运行测试只需输入
python manage.py test your_app_name/Tests
由于预期路径