在Django中,当应用有测试目录时运行特定测试用例

254 投票
8 回答
138954 浏览
提问于 2025-04-16 16:55

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

$ ./manage.py test animals.AnimalTestCase

这假设你的测试代码放在Django应用的tests.py文件里。如果是这样的话,这个命令就能正常工作。

我把Django应用的测试放在一个叫做tests的目录里:

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

那么,当我的测试分散在多个文件里时,我该如何指定一个单独的测试用例呢?

8 个回答

29

这个应该可以用-

python manage.py test my_app.tests.storage_tests
264

从Django 1.6开始,你可以通过完整的点号表示法来运行一个完整的测试用例或者单个测试。

自动测试发现功能现在会在工作目录下,任何以test开头的文件中找到测试。所以,针对这个问题,你需要重命名你的文件,但现在你可以把它们放在你想要的目录里。如果你想使用自定义的文件名,可以通过选项标志--pattern="my_pattern_*.py"来指定一个模式(这是Django测试运行器的默认设置)。

所以,如果你在manage.py所在的目录,并且想要运行在example这个应用/模块下的tests.py文件中,TestCase子类A里的测试test_a,你可以这样做:

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

如果你不想包含依赖,并且使用的是Django 1.6或更高版本,就是这样操作的。

查看Django文档以获取更多信息

193

可以看看 django-nose。这个工具让你可以指定要运行的测试,比如:

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

或者如评论中提到的,使用这样的语法:

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

撰写回答