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
当我的测试在多个文件中时,如何指定单个测试用例?
答案 0 :(得分:142)
从Django 1.6开始,你可以运行一个完整的测试用例或单个测试,使用你想要运行的元素的完整点符号。
自动测试发现现在可以在工作目录下以测试开头的任何文件中找到测试,因此解决了您必须重命名文件的问题,但现在可以将它们保存在目录中你要。如果要使用自定义文件名,可以使用选项标志--pattern="my_pattern_*.py"
指定模式(默认Django测试运行器)。
因此,如果您在manage.py
目录中,并希望在app / /下的文件test_a
内的TestCase
子类A
内运行测试tests.py
模块example
你会这样做:
python manage.py test example.tests.A.test_a
如果您不想包含依赖项,并且在Django 1.6或更高版本中就是这样做的。
答案 1 :(得分:126)
结帐django-nose。它允许您指定要运行的测试:
python manage.py test another.test:TestCase.test_method
或如评论中所述,使用语法:
python manage.py test another.test.TestCase.test_method
答案 2 :(得分:10)
我自己遇到了这个问题并发现了这个问题,如果有其他人出现,这就是我挖出来的。 DjangoTestSuiteRuner使用一个名为build_test(label)的方法,该方法根据标签确定要运行的测试用例。看看这个方法,事实证明他们在“模型”或“测试”模块上做了一个getattr()。这意味着如果您返回套件,测试运行器不会在该套件中查找您的测试用例,它只会查看其中一个模块。
快速解决方法是使用__init__.py
直接导入测试而不是定义套件。使它们成为“测试”模块的一部分,因此build_test(标签)可以找到它们。
对于上面的示例,tests/__init__.py
应该只包含:
from field_tests import *
from storage_tests import *
这不是很优雅,当然如果你试图用你的套件做一些更复杂的事情,那么这将不起作用,但它适用于这种情况。
答案 3 :(得分:9)
这应该有效 -
python manage.py test my_app.tests.storage_tests
答案 4 :(得分:3)
我也遇到了这个问题而不是使用django-nose我在这里点了这个链接:http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/。您需要打开 init .py并导入测试。
ex init .py:from unique_test_file import *
答案 5 :(得分:3)
将此代码放在__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")
现在你要为新测试做的就是编写它们并确保它们在tests文件夹中。没有更乏味的进口维护!
答案 6 :(得分:0)
如果要运行路径为 create database newdb1;
REVOKE USAGE ON SCHEMA information_schema FROM PUBLIC;
REVOKE USAGE ON SCHEMA pg_catalog FROM PUBLIC;
REVOKE SELECT ON TABLE pg_catalog.pg_database FROM PUBLIC;
REVOKE USAGE ON SCHEMA information_schema FROM PUBLIC cascade;
REVOKE USAGE ON SCHEMA pg_catalog FROM PUBLIC cascade;
REVOKE SELECT ON TABLE pg_catalog.pg_database FROM PUBLIC cascade;
create user new_user password 'xxxxxx';
grant USAGE ON SCHEMA public to new_user;
revoke select on table pg_catalog.pg_database from new_user CASCADE;
的测试用例类,可以运行命令 <module_name>/tests/test_views.py
。