Запуск конкретного тестового примера в Django, когда ваше приложение имеет каталог тестов

Документация 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

Как указать отдельный тестовый пример, когда мои тесты находятся в нескольких файлах?

Ответ 1

Оформить заказ django-nose. Это позволяет вам указывать тесты для запуска, например:

python manage.py test another.test:TestCase.test_method

или, как отмечено в комментариях, используйте синтаксис:

python manage.py test another.test.TestCase.test_method

Ответ 2

С 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 или новее, как это сделать.

Подробнее см. документацию Django

Ответ 3

У меня была эта проблема сама и нашел этот вопрос, на случай, если кто-нибудь еще придет, вот что я откопал. DjangoTestSuiteRuner использует метод build_test (label), который вычисляет, какие тестовые примеры выполняться на основе метки. В этом методе выясняется, что они делают getattr() на модуле "модели" или "тест". Это означает, что если вы вернете пакет, тестовый бегун не ищет ваши тестовые примеры в этом пакете, он будет выглядеть только в одном из этих модулей.

Быстрая работа - использовать __init__.py для импорта тестов непосредственно, а не для определения набора. Он делает их частью модуля "test", поэтому build_test (label) может их найти.

В приведенном выше примере tests/__init__.py должен содержать:

from field_tests import *
from storage_tests import *

Это не очень элегантно и, конечно, если вы пытаетесь сделать что-то более сложное с вашим пакетом, тогда это не сработает, но это будет для этого случая.

Ответ 4

Это должно работать -

python manage.py test my_app.tests.storage_tests

Ответ 5

Я также столкнулся с этой проблемой, и вместо использования django-носа я следил за этой ссылкой здесь: http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/. Вам нужно открыть init.py и импортировать ваши тесты.

Ex в init.py: from unique_test_file import *

Ответ 6

Поместите этот код в свой __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")

Теперь все, что вам нужно сделать для новых тестов, это написать их и убедиться, что они находятся в папке с тестами. Нет более утомительного обслуживания импорта!