Django文档(http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests)说你可以通过指定来运行单独的测试用例:

$ ./manage.py test animals.AnimalTestCase

这里假设你在Django应用程序的tests.py文件中有测试。如果这是真的,那么这个命令就像预期的那样工作。

我在tests目录下有一个Django应用程序的测试:

my_project/apps/my_app/
├── __init__.py
├── tests
│   ├── __init__.py
│   ├── field_tests.py
│   ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py

tests/__init__.py文件有一个suite()函数:

import unittest

from my_project.apps.my_app.tests import field_tests, storage_tests

def suite():
    tests_loader = unittest.TestLoader().loadTestsFromModule
    test_suites = []
    test_suites.append(tests_loader(field_tests))
    test_suites.append(tests_loader(storage_tests))
    return unittest.TestSuite(test_suites)

要运行我所做的测试:

$ ./manage.py test my_app

试图指定一个单独的测试用例会引发一个异常:

$ ./manage.py test my_app.tests.storage_tests.StorageTestCase
...
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method

我试图做异常消息说:

$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test

当我的测试在多个文件中时,如何指定单个测试用例?


看看django-nose。这允许您指定要运行的测试,如:

python manage.py test another.test:TestCase.test_method

或者如注释中所述,使用以下语法:

python manage.py test another.test.TestCase.test_method

我自己也有这个问题,然后发现了这个问题,以防其他人遇到这个问题,这是我挖出来的。DjangoTestSuiteRuner使用一个叫做build_test(label)的方法,它根据标签找出要运行的测试用例。查看这个方法,发现他们在“models”或“test”模块上执行getattr()。这意味着如果您返回一个套件,测试运行器不会在该套件中查找您的测试用例,它只会在其中一个模块中查找。

一个快速的解决方法是使用__init__.py直接导入测试,而不是定义一个套件。使它们成为“test”模块的一部分,因此build_test(label)可以找到它们。

对于上面的例子,tests/__init__.py应该简单地包含:

from field_tests import *
from storage_tests import *

这不是很优雅,当然,如果你试图在你的套件中做一些更复杂的事情,那么这是行不通的,但在这种情况下是可以的。


我也遇到了这个问题,我没有使用django-nose,而是使用了这个链接:http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/。您需要打开init.py并导入您的测试。

从unique_test_file导入*


将这段代码放在__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__)

类似地,对于您的测试套件,您可以简单地使用:

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

现在,对于新的测试,您所要做的就是编写它们,并确保它们位于tests文件夹中。不再需要对导入进行繁琐的维护!


从Django 1.6开始,你可以运行一个完整的测试用例,或者单个测试,对你想要运行的元素使用完整的点符号。

自动测试发现现在将在工作目录下以test开头的任何文件中找到测试,因此解决您必须重命名文件的问题,但是您现在可以将它们保存在您想要的目录中。如果你想使用自定义文件名,你可以用选项标志——pattern="my_pattern_*.py"指定一个模式(默认的Django测试运行器)。

因此,如果你在manage.py目录下,想要在app/模块示例下的tests.py文件中的TestCase子类A中运行测试test_a,你会这样做:

python manage.py test example.tests.A.test_a

如果你在Django 1.6或更高版本中不想包含依赖项,你可以这样做。

有关更多信息,请参阅Django文档


〇应该可以

python manage.py test my_app.tests.storage_tests

如果要运行路径为<module_name>/tests/test_views.py的测试用例类,可以运行python manage.py test <module_name>.tests.test_views.<test_case_name>。


使用-k标志按名称运行特定的测试,而不指定整个路径:

./manage.py test animals.AnimalTestCase -k my_test_name

或者只是

./manage.py test -k my_test_name

(我知道这不是确切的问题,但当我试图弄清楚这个问题时,这个页面在谷歌搜索中排名很高)