Документация Django (http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests) говорит, что вы можете запускать отдельные тестовые примеры, указав их:
$ ./manage.py test animals.AnimalTestCase
Это предполагает, что у вас есть ваши тесты в файле tests.py в приложении Django. Если это так, то эта команда работает, как и ожидалось.
У меня есть мои тесты для приложения 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
Как указать отдельный тестовый пример, когда мои тесты находятся в нескольких файлах?
Оформить заказ django-nose. Это позволяет вам указывать тесты для запуска, например:
python manage.py test another.test:TestCase.test_method
или, как отмечено в комментариях, используйте синтаксис:
python manage.py test another.test.TestCase.test_method
С Django 1.6 вы можете запустить полный тестовый пример или один тест, используя полную точечную нотацию для элемента, который вы хотите запустить.
Автоматическое обнаружение тестов теперь найдет тесты в любом файле, который начинается с test под рабочим каталогом, поэтому, обратившись к вопросу, который вам нужно будет переименовать, вы теперь можете сохранить их в каталоге вы хотите. Если вы хотите использовать пользовательские имена файлов, вы можете указать шаблон (тестовый бег по умолчанию Django) с флажком опций --pattern="my_pattern_*.py"
.
Итак, если вы находитесь в своем каталоге manage.py
и хотите запустить тест test_a
внутри TestCase
подкласса A
внутри файла tests.py
в приложении/модуле example
, вы бы сделали:
python manage.py test example.tests.A.test_a
Если вы не хотите включать зависимость и находитесь в Django 1.6 или новее, как это сделать.
error: option --pattern not recognized
и invalid command name
У меня была эта проблема сама и нашел этот вопрос, на случай, если кто-нибудь еще придет, вот что я откопал. DjangoTestSuiteRuner использует метод build_test (label), который вычисляет, какие тестовые примеры выполняться на основе метки. В этом методе выясняется, что они делают getattr() на модуле "модели" или "тест". Это означает, что если вы вернете пакет, тестовый бегун не ищет ваши тестовые примеры в этом пакете, он будет выглядеть только в одном из этих модулей.
Быстрая работа - использовать __init__.py
для импорта тестов непосредственно, а не для определения набора. Он делает их частью модуля "test", поэтому build_test (label) может их найти.
В приведенном выше примере tests/__init__.py
должен содержать:
from field_tests import *
from storage_tests import *
Это не очень элегантно и, конечно, если вы пытаетесь сделать что-то более сложное с вашим пакетом, тогда это не сработает, но это будет для этого случая.
Это должно работать -
python manage.py test my_app.tests.storage_tests
Поместите этот код в свой __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")
Теперь все, что вам нужно сделать для новых тестов, это написать их и убедиться, что они находятся в папке с тестами. Нет более утомительного обслуживания импорта!
Я также столкнулся с этой проблемой, и вместо использования django-носа я следил за этой ссылкой здесь: http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/. Вам нужно открыть init.py и импортировать ваши тесты.
Ex в init.py: from unique_test_file import *