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


документация Django (http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests) говорит, что вы можете запускать отдельные тестовые случаи, указав их:

$ ./manage.py test animals.AnimalTestCase

это предполагает, что у вас есть свои тесты в a 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

The 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

Я попытался сделать то, что сообщение об исключении сказал:

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

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

6 120

6 ответов:

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

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

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

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

начиная с Django 1.6 вы можете запустить полный тестовый случай или один тест, используя полную точечную нотацию для элемента, который вы хотите запустить.

автоматическое обнаружение тестов теперь будет находить тесты в любом файле, который начинается с тест в рабочем каталоге, поэтому для решения вопроса вам нужно будет переименовать ваши файлы, но теперь вы можете сохранить их в нужном каталоге. Если вы хотите использовать пользовательские имена файлов, вы можете указать шаблон (по умолчанию Django Test runner) с флагом опции --pattern="my_pattern_*.py".

так что если вы в своем

Я сам столкнулся с этой проблемой и нашел этот вопрос, если кто-то еще придет, вот что я выкопал. 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")

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

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

Ex in init. py:from unique_test_file import *