Запуск конкретного тестового примера в Django, когда у вашего приложения есть тестовый каталог - PullRequest
138 голосов
/ 04 мая 2011

В документации 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 имеет набор() функция:

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

Iпопытался сделать то, что говорилось в сообщении об исключении:

$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test

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

Ответы [ 6 ]

150 голосов
/ 24 февраля 2014

Начиная с 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

128 голосов
/ 04 мая 2011

Оформить заказ Джанго-Нос .Он позволяет указать тесты для запуска, например:

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

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

python manage.py test another.test.TestCase.test_method
10 голосов
/ 09 мая 2012

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

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

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

from field_tests import *
from storage_tests import *

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

9 голосов
/ 12 мая 2017

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

python manage.py test my_app.tests.storage_tests
3 голосов
/ 14 марта 2013

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

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

3 голосов
/ 24 января 2013

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

Пример: init .py: from unique_test_file import *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...