当你的应用程序有一个测试目录时,在Django中运行一个特定的测试用例

2024-06-03 02:49:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当测试位于多个文件中时,如何指定单个测试用例?


Tags: 文件djangopytestappfieldmanageinit
3条回答

我自己也有这个问题,我发现了这个问题,万一有人来,这就是我发现的。DjangoTestSuiteRuner使用了一个名为build_test(label)的方法,该方法根据标签确定要运行的测试用例。研究这个方法,结果发现他们在“models”或“test”模块上执行getattr()。这意味着,如果您返回一个套件,测试运行器不会在该套件中查找您的测试用例,它只会在其中一个模块中查找。

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

对于上面的示例,tests/__init__.py应该只包含:

from field_tests import *
from storage_tests import *

这不是很优雅,当然,如果你想用你的套房做一些更复杂的事情,那么这是行不通的,但它会在这种情况下。

结帐django-nose。它允许您指定要运行的测试,如:

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

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

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

自从Django 1.6以来,您就可以运行一个完整的测试用例,或者单个测试,对要运行的元素使用完整的点表示法。

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

因此,如果您在manage.py目录中,并希望在应用程序/模块example下的文件tests.py中的test_a子类A中运行测试,您将执行以下操作:

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

如果您不想包含依赖项,并且在Django 1.6或更高版本中,那么您就是这样做的。

See the Django documentation for more information

相关问题 更多 >