【问题标题】:What is the simplest way to make manage.py test app.TestCase work again after replacing tests.py with tests/ directory?用 tests/ 目录替换 tests.py 后,让 manage.py test app.TestCase 再次工作的最简单方法是什么?
【发布时间】:2011-10-04 20:06:35
【问题描述】:

我已将 project/app/tests.py 替换为 project/app/tests/ 目录。该目录包含多个 Python 文件(称为apples.pybananas.py 等),每个文件定义一个或多个派生自TestCase 的类(称为TestApplesTestBananas 等)。文件project/app/tests/__init__.py 包含

from apples import TestApples
from bananas import TestBananas

命令manage.py test app 仍然有效,但manage.py test app.bananasmanage.py test app.tests.bananas 无效,例如:

ValueError: Test label 'app.bananas' does not refer to a test

manage.py test app.tests.bananas 失败并出现同样的错误,但manage.py test app.tests.bananas.TestBananas 更有希望:

ValueError: Test label 'store.tests.bananas.TestBananas' should be of the form app.TestCase or app.TestCase.test_method

Django 文档和Python docs 建议解决方案是编写自定义测试运行器或测试收集器并将其插入; this StackOverflow question 走同样的路,然后似乎建议切换到 django-nose。除非必须,否则我宁愿不这样做,而且我很想知道如何使用 Django 的标准工具来完成这项工作。有人有一个简单的(ish)解决方案吗?

【问题讨论】:

  • 我最近问了一个非常相似的问题。我被引导到 django-nose,我很高兴地进行了切换。所需的工作几乎没有,因为测试本身不需要更改。您是否有具体的理由不进行转换?

标签: django unit-testing


【解决方案1】:

在您的示例中,如果您运行 manage.py test app.TestBananas,那么您可以运行该特定测试。

您可以通过确保将所有测试导入__init__.py 来让一切正常运行,但是当您有大量测试时,这变得难以管理。如果你想在 PyCharm 中运行测试,那么 django-nose 不是一个选项。

为了使这更容易,我们可以让测试套件自动查找测试包中的所有测试。把这个放在__init__.py(一定要替换“appname”):

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

这仍然不允许我们运行特定的测试。为此,您需要在__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 运行特定测试

【讨论】:

    【解决方案2】:

    我只是做this tutorial

    编辑:在 django 1.6 之后,测试发现机制发生了变化。你只需要创建一个文件夹tests,里面有一个__init__.py 文件,然后把你的测试文件放在那里。 您的测试文件应与 test*.py 模式匹配。

    【讨论】:

    • 谢谢,这似乎正是我想要的。
    • ick...这个教程不见了!!
    • 谢谢 Tarsis,这里的参考很有帮助。
    【解决方案3】:

    我用django-nose!不要害怕包裹。

    【讨论】:

    • nose 至少从 2015 年开始一直处于维护模式。django-nose 也处于维护模式,唯一的维护者不再是活跃用户。访问 Jazzband.co 了解如何维护 django-nose 以及如何提供帮助。新项目应考虑使用 pytest 或 unittest 与 Django 测试框架。来源:github.com/jazzband/django-nose#note-to-users
    【解决方案4】:

    您是否尝试将测试文件重命名为“test_foo.py”,而不是“foo.py”?

    【讨论】:

    • 是的;似乎对“manage.py test app.bananas”(或等效项)没有帮助。它对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多