2010-03-04 26 views
23

Los Django 1.4 documentation on tests estados:prueba unitaria de Django en views.py

Para una aplicación Django dado, el corredor prueba busca prueba unitaria en dos lugares:

  • El archivo models.py. Puede definir doctest de nivel de módulo y/o doctest para modelos individuales. Es una práctica común colocar doctest de nivel de aplicación en docstring de módulo y doctest de nivel de modelo en docstrings 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 y cada uno de los doctest que desea escribir y que no están necesariamente relacionados con los modelos.

Por curiosidad me gustaría saber por qué TestRunner de Django se limita a la prueba unitaria en models.py, pero de manera más práctica me gustaría saber cómo se podría ampliar prueba unitaria de la TestRunner incluir (por ejemplo,) views.py y otros módulos al ejecutar manage.py test.

Estaría agradecido por cualquier aportación.

Gracias.

Brian

Respuesta

22

Puede hacerlo 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 ejecute sus pruebas como de costumbre y debería ver sus pruebas en view.py ejecutar.

$ python manage.py test project 

Esto se describe con más detalle en el django testing documentation

Al ejecutar 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, construye automáticamente un conjunto de pruebas de esos casos de prueba y ejecuta ese conjunto de aplicaciones.

Existe una segunda forma de definir el conjunto de pruebas para un módulo: si define una función llamada suite() en models.py o tests.py, el corredor de prueba de Django usará esa función para construir el conjunto de pruebas para ese módulo Esto sigue la organización sugerida para 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 la construcción de su propio banco de pruebas significa que el corredor de pruebas django no ejecutará automáticamente ninguna prueba que tenga en tests.py. Vas a tener que añadir estos en su conjunto de forma manual, 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 
+1

Gracias! realmente útil – droope

+3

¿Sigue siendo así, con Django 1.8? La respuesta de Andre Miras a continuación sugiere que se actualizó. –

+3

@ BrianM.Hunt No estoy seguro acerca de 1.8 pero en 1.6 me parece que 'suite()' ya no se llama. La respuesta de Andre con 'load_tests()' funcionó en su lugar. – jamesc

2

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

Te recomiendo que uses nose que es unittest compatible con los esteroides. Úselo junto con Django test runner that uses nose. Puede personalizar el morro de muchas maneras, incluso apuntarlo a ubicaciones de prueba personalizadas usando el indicador -m.

7

Ésta es mi tests/__init__.py aplicación, basado en 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 

Básicamente, esta solución permite la adición de "archivos" arbitrarias (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. Simplemente agregue los nombres de los módulos a la lista correspondiente en la parte superior de este archivo.

15

cosas tienen changed in Django 1.6:

prueba unitaria ya no se detectan automáticamente. Para integrar doctests en su conjunto de pruebas, siga el recommendations in the Python documentation.

Así que todo lo que tenía que hacer yo 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 
+0

¿Dónde pusiste este pedazo de código? – jamesc

+2

Al final de mi solicitud de archivo tests.py (He actualizado mi respuesta). –

+0

Esto funcionó para mí, gracias. Pude traer los modelos de la aplicación en lugar de vistas para doctesting. ¿Y creo que puedes omitir la importación de 'unittest'? – jamesc

Cuestiones relacionadas