Django doctests en views.py

La documentación de Django 1.4 en las pruebas indica:

Para una aplicación Django dada, el corredor de pruebas busca pruebas en dos lugares:

  • El archivo models.py . Puede definir pruebas de nivel de módulo y / o una prueba para modelos individuales. Es una práctica común colocar las pruebas de nivel de aplicación en la cadena de documentación del módulo y las pruebas de nivel de modelo en las cadenas de documentación del modelo.

  • Un archivo llamado tests.py en el directorio de la aplicación, es decir, el directorio que contiene models.py. Este archivo es un enganche para todos los documentos que desee escribir que no estén necesariamente relacionados con los modelos.

Por curiosidad, me gustaría saber por qué el testrunner de Django se limita a los doctests en models.py , pero más prácticamente me gustaría saber cómo se puede expandir los doctests de testruns para incluir (por ejemplo) views.py y otros módulos cuando se ejecuta la manage.py test .

Estaría agradecido por cualquier entrada.

Gracias.

Brian

Puede hacer esto agregando / editando la función suite () en tests.py, que define qué pruebas ejecutará el corredor de pruebas de django.

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

Luego simplemente ejecute sus pruebas como de costumbre y debería ver su doctests en views.py run.

 $ python manage.py test project 

Esto se describe con más detalle en la documentación de prueba de django.

Cuando ejecuta sus pruebas, el comportamiento predeterminado de la utilidad de prueba es encontrar todos los casos de prueba (es decir, subclases de unittest.TestCase) en models.py y tests.py, construir automáticamente un conjunto de pruebas a partir de esos casos de prueba. y ejecuta esa suite.

Hay una segunda forma de definir el conjunto de pruebas para un módulo: si define una función llamada conjunto () en models.py o tests.py, el corredor de pruebas de Django usará esa función para construir el conjunto de pruebas para ese módulo. Esto sigue la organización sugerida para las pruebas unitarias. Consulte la documentación de Python para obtener más detalles sobre cómo construir un conjunto de pruebas complejas.

Sin embargo, tenga en cuenta que construir su propio conjunto de pruebas significa que el corredor de pruebas de django no ejecutará automáticamente ninguna prueba que tenga en tests.py. Tendrá que agregarlos manualmente a su suite, por ejemplo

 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 

Las cosas han cambiado en Django 1.6 :

Doctests ya no serán descubiertos automáticamente. Para integrar doctests en su conjunto de pruebas, siga las recomendaciones en la documentación de Python .

Así que todo lo que tenía que hacer era (en 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 

Esta es mi implementación de tests/__init__.py , basada en la respuesta de Jesse Shieh :

 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 

Básicamente, esta solución permite agregar “archivos” arbitrarios (en realidad, módulos) al conjunto de pruebas. Permite dividir las pruebas unitarias en archivos separados y permite agregar cualquier módulo que contenga doctests. Solo agregue los nombres de los módulos a la lista apropiada en la parte superior de este archivo.

Use las pruebas con el plugin para django (django-sane-testing o django-nose) y use la marca –with-doctest .

El sistema de prueba nativo de Django se basa en el paquete unittest . Entonces no es tan poderoso como puede ser.

Le recomiendo que use una unittest de la unittest nariz compatible con los esteroides. Úsalo junto con el corredor de prueba Django que usa la nariz . Puede personalizar la nariz de muchas maneras, incluso apuntando a ubicaciones de prueba personalizadas utilizando el indicador -m .

Publiqué un github gist que te permite ejecutar pruebas en cualquier archivo o módulo de tu proyecto. Ejecutar doctests desde módulos y archivos específicos

Puede intentar escribir su propio testrunner y ver si puede incluir otros archivos para verificar las pruebas de documentos.

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