使用tests /目录替换tests.py后,使manage.py测试app.TestCase再次运行的最简单方法是什么?

时间:2011-07-13 20:25:15

标签: django unit-testing

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

project/app/tests/__init__.py

命令from apples import TestApples from bananas import TestBananas 仍然有效,但manage.py test appmanage.py test app.bananas没有,例如:

manage.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

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

4 个答案:

答案 0 :(得分:2)

我只是做this tutorial

编辑:在django 1.6之后,测试发现机制发生了变化。您只需创建一个文件夹tests,其中包含__init__.py文件,并将测试文件放在那里。 您的测试文件应与test*.py模式匹配。

答案 1 :(得分:2)

在您的示例中,如果您运行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 :(得分:0)

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

答案 3 :(得分:0)

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