我已将project/app/tests.py
替换为project/app/tests/
目录。该目录包含几个Python文件(称为apples.py
,bananas.py
等),每个文件定义一个或多个派生自TestCase
的类(称为TestApples
,{ {1}}等)。文件TestBananas
包含
project/app/tests/__init__.py
命令from apples import TestApples
from bananas import TestBananas
仍然有效,但manage.py test app
和manage.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)解决方案吗?
答案 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”?