Джанго doctests в views.py - PullRequest
       29

Джанго doctests в views.py

24 голосов
/ 04 марта 2010

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

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

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

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

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

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

Спасибо.

Brian

Ответы [ 7 ]

23 голосов
/ 13 июня 2010

Это можно сделать, добавив / отредактировав функцию suite () в tests.py, которая определяет, какие тесты будет запускать тестер django.

import unittest
import doctest
from project import views

def suite():
    suite = unittest.TestSuite()
    suite.addTest(doctest.DocTestSuite(views))
    return suite

Тогда просто запустите свои тесты как обычно, и вы должны увидеть свои тесты в файле views.py.

$ python manage.py test project

Более подробно это описано в документации по тестированию django

Когда вы запускаете свои тесты, поведение тестовой утилиты по умолчанию состоит в том, чтобы найти все тестовые случаи (то есть подклассы unittest.TestCase) в models.py и tests.py, автоматически создать набор тестов из этих тестовые случаи и запустить этот набор.

Существует второй способ определения набора тестов для модуля: если вы определили функцию с именем suite () в любом из моделей models.py или tests.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
15 голосов
/ 13 декабря 2013

Вещи изменились в 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
8 голосов
/ 27 января 2011

Это моя tests/__init__.py реализация, основанная на Jesse Shieh answer :

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

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

5 голосов
/ 04 марта 2010

Используйте тесты носа с плагином для django (django-sane-testing или django-nose) и используйте флаг - with-doctest .

2 голосов
/ 16 февраля 2011

Я опубликовал github gist, который позволяет вам запускать тестирование в любом файле или модуле вашего проекта. Запуск doctests из определенных модулей и файлов

2 голосов
/ 05 марта 2010

Нативная система тестирования Django основана на пакете unittest. Так что это не так сильно, как может быть.

Я рекомендую вам использовать нос , который обратно совместим unittest на стероидах. Используйте его вместе с Django, который использует нос . Вы можете настроить нос во многих отношениях, включая указание на пользовательские места тестирования с помощью флага -m.

1 голос
/ 04 марта 2010

Вы можете попытаться написать свой собственный testrunner и посмотреть, можете ли вы включить другие файлы, которые будут проверены на наличие документов.

http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner

...