unit test parallel form data python django unit-testing doctest

python - parallel - Django doctests en views.py



test form django (7)

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

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

  • El archivo models.py . Puede definir doctests a nivel de módulo y / o un doctest para modelos individuales. Es una práctica común colocar pruebas de nivel de aplicación en la cadena de documentación del módulo y 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 gancho 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


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 nose la nose compatible con las versiones anteriores de 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 .


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.


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



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 sus pruebas de documentos 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, las 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 pruebas de unidad. 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



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