Подтвердить что ты не робот

Доски Django в views.py

Документация по испытаниям Django 1.4 гласит:

Для данного приложения Django тестовый бегун ищет доктрины в двух местах:

  • Файл models.py. Вы можете определить домены модулей и/или доктрину для отдельных моделей. Общепринятой практикой является размещение доктрин уровня приложения в докшринном модуле и доктринах уровня модели в докстронах модели.

  • Файл с именем tests.py в каталоге приложения - то есть каталог, в котором содержится models.py. Этот файл является крючком для любых и всех доктрин, которые вы хотите написать, которые не обязательно связаны с моделями.

Из любопытства я хотел бы знать, почему Django testrunner ограничен доктринами в models.py, но более практично я хотел бы знать, как можно расширить доктрины testrunner, чтобы включить (например) views.py и других модулей при запуске manage.py test.

Буду благодарен за любой ввод.

Спасибо.

Брайан

4b9b3361

Ответ 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.