Доски Django в views.py
Документация по испытаниям Django 1.4 гласит:
Для данного приложения Django тестовый бегун ищет доктрины в двух местах:
-
Файл models.py
. Вы можете определить домены модулей и/или доктрину для отдельных моделей. Общепринятой практикой является размещение доктрин уровня приложения в докшринном модуле и доктринах уровня модели в докстронах модели.
-
Файл с именем tests.py
в каталоге приложения - то есть каталог, в котором содержится models.py. Этот файл является крючком для любых и всех доктрин, которые вы хотите написать, которые не обязательно связаны с моделями.
Из любопытства я хотел бы знать, почему Django testrunner ограничен доктринами в models.py
, но более практично я хотел бы знать, как можно расширить доктрины testrunner, чтобы включить (например) views.py
и других модулей при запуске manage.py test
.
Буду благодарен за любой ввод.
Спасибо.
Брайан
Ответы
Ответ 1
Вы можете сделать это, добавив/отредактировав функцию suite() в test.py, которая определяет, какие тесты будут выполняться тестовым бегуном django.
import unittest
import doctest
from project import views
def suite():
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(views))
return suite
Затем просто запустите свои тесты, как обычно, и вы увидите свои доктрины в режиме view.py.
$ python manage.py test project
Это описано более подробно в документации django
При запуске тестов поведение по умолчанию утилиты тестирования заключается в том, чтобы найти все тестовые примеры (то есть подклассы unittest.TestCase) в models.py и tests.py, автоматически построить тестовый пакет из этих тестовые примеры и запустить этот пакет.
Существует второй способ определения набора тестов для модуля: если вы определяете функцию под названием suite() либо в файле models.py, либо в test.py, тестовый бегун Django будет использовать эту функцию для создания набора тестов для этот модуль. Это следует за предлагаемой организацией для модульных тестов. Более подробную информацию о том, как создать сложный набор тестов, см. В документации Python.
Однако имейте в виду, что создание собственного тестового набора означает, что тестовый бегун django не будет автоматически запускать любые тесты, которые у вас есть в tests.py. Вам придется добавить их в свой пакет вручную, например
import unittest
import doctest
from project import views
class FooTestCase(unittest.TestCase):
def testFoo(self):
self.assertEquals('foo', 'bar')
def suite():
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(views))
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(FooTestCase))
return suite
Ответ 2
Вещи изменены в Django 1.6:
Doctests больше не будут автоматически обнаружены. Интегрировать доктрины в вашем тестовом наборе, следуйте рекомендациям в Python документация.
Итак, все, что я должен был сделать, было (в my_app/tests.py):
import unittest
import doctest
from my_app import views
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(views))
return tests
Ответ 3
Это моя реализация tests/__init__.py
, основанная на Джесси Шие:
import doctest
import unittest
list_of_doctests = [
'myapp.views.myview',
'myapp.forms.myform',
]
list_of_unittests = [
'sometestshere', # This file is myapp/tests/sometestshere.py
'moretestshere', # This file is myapp/tests/moretestshere.py
'myapp.tests.othertest', # Absolute paths also work.
]
def suite():
suite = unittest.TestSuite()
for t in list_of_doctests:
suite.addTest(doctest.DocTestSuite(
__import__(t, globals(), locals(), fromlist=["*"])
))
for t in list_of_unittests:
suite.addTest(unittest.TestLoader().loadTestsFromModule(
__import__(t, globals(), locals(), fromlist=["*"])
))
return suite
В принципе, это решение позволяет добавлять в набор тестов произвольные "файлы" (фактически, модули). Он позволяет разбивать модульные тесты на отдельные файлы и позволяет добавлять любой модуль, содержащий доктрины. Просто добавьте имена модулей в соответствующий список в верхней части этого файла.
Ответ 4
Используйте nosetests с плагином для django (django-sane-testing или django-нос) и используйте - with-doctest flag.
Ответ 5
Собственная система тестирования Django основана на пакете unittest
. Так что это не так сильно, как может быть.
Я рекомендую вам использовать nose, который поддерживает обратную совместимость unittest
на стероидах. Используйте его вместе с Django test runner, который использует нос. Вы можете настроить нос многими способами, включая указание его на пользовательские места тестирования с использованием флага -m
.
Ответ 6
Я опубликовал github gist, который позволяет запускать тест в любом файле или модуле в вашем проекте.
Запуск доктрин из определенных модулей и файлов
Ответ 7
Вы можете попытаться написать свой собственный testrunner
и посмотреть, если вы можете включить другие файлы для проверки на тесты doc.
http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner