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

Posted

技术标签:

【中文标题】当您的应用程序具有测试目录时,在 Django 中运行特定的测试用例【英文标题】:Running a specific test case in Django when your app has a tests directory 【发布时间】:2011-08-18 00:31:14 【问题描述】:

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

$ ./manage.py test animals.AnimalTestCase

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

我在测试目录中有一个 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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

或如 cmets 中所述,使用以下语法:

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

【讨论】:

谢谢@sdolan。遇到了和hekevintran一样的问题。切换到 django-nose 并解决了这个问题,也比默认的 Django 测试运行器好得多。 这运行一个测试,但是如何运行整个TestCase? @jMyles: another.test:TestCase 注意像我这样盲目地从 *** 粘贴的人:如果没有提到的插件,这将出错,请使用在 Django 1.6+ 中有效的另一个答案中描述的语法(。而不是:)。 我否决了这个答案,因为它实际上没有回答 OP 的问题,即如何在 Django 中执行此操作。相反,它只是建议切换到 Nosetest【参考方案3】:

从 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 或更高版本中,那么您就是这样做的。

See the Django documentation for more information

【讨论】:

我根本无法让它工作:error: option --pattern not recognizedinvalid command name【参考方案4】:

这应该可行-

python manage.py test my_app.tests.storage_tests

【讨论】:

【参考方案5】:

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

init.py 中的前例:from unique_test_file import *

【讨论】:

【参考方案6】:

将此代码放入您的 __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")

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

【讨论】:

【参考方案7】:

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

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

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

from field_tests import *
from storage_tests import *

这不是很优雅,当然,如果你想用你的套件做一些更复杂的事情,那么这将不起作用,但它适用于这种情况。

【讨论】:

以上是关于当您的应用程序具有测试目录时,在 Django 中运行特定的测试用例的主要内容,如果未能解决你的问题,请参考以下文章

当您的应用程序在前台时,如何在 ios 10 中生成本地通知?当您的应用程序在前台时,它就不起作用

如何在 Django 中上传文件? [关闭]

当您的 Web 应用程序在后台时,Firestore 实时侦听器

Django JWT 令牌停用

iOS:当您没有权利文件时,如何为您的应用程序实施关键警报?

当您的 Gemfile 需要旧版本的捆绑器时,如何“捆绑安装”?