2011-05-03 13 views
99

La documentación de Django (http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests) dice que puede ejecutar casos de prueba individuales especificándolas:Ejecución de un caso de prueba específico en Django cuando su aplicación tiene un directorio de pruebas

$ ./manage.py test animals.AnimalTestCase 

Esto supone que tiene sus pruebas en un archivo tests.py en su aplicación Django. Si esto es cierto, entonces este comando funciona como se espera.

tengo mis pruebas para una aplicación Django en un directorio de pruebas:

my_project/apps/my_app/ 
├── __init__.py 
├── tests 
│ ├── __init__.py 
│ ├── field_tests.py 
│ ├── storage_tests.py 
├── urls.py 
├── utils.py 
└── views.py 

El archivo tests/__init__.py tiene una función suite():

import unittest 

from my_project.apps.my_app.tests import field_tests, storage_tests 

def suite(): 
    tests_loader = unittest.TestLoader().loadTestsFromModule 
    test_suites = [] 
    test_suites.append(tests_loader(field_tests)) 
    test_suites.append(tests_loader(storage_tests)) 
    return unittest.TestSuite(test_suites) 

Para ejecutar las pruebas que hago:

$ ./manage.py test my_app 

Intentar especificar un caso de prueba individual plantea una excepción:

$ ./manage.py test my_app.tests.storage_tests.StorageTestCase 
... 
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method 

he tratado de hacer lo que el mensaje de excepción, dijo:

$ ./manage.py test my_app.StorageTestCase 
... 
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test 

¿Cómo se especifica un caso de prueba individual cuando mis pruebas están en varios archivos?

Respuesta

97

Pago django-nose. Se le permite especificar las pruebas a correr como:

python manage.py test another.test:TestCase.test_method 

o como se señaló en los comentarios, utiliza la sintaxis:

python manage.py test another.test.TestCase.test_method 
+0

Gracias @sdolan. Encontró el mismo problema que hekevintran. Cambió a django-nose y solucionó ese problema, también funciona mucho mejor que el corredor de prueba predeterminado de Django. – LeeMobile

+5

Gracias. Es algo tonto que el corredor de prueba de Django no pueda hacer esto. – hekevintran

+0

Esto ejecuta una prueba, pero ¿cómo ejecutar un TestCase completo? – jMyles

7

que estaba teniendo este problema por mí mismo y encontró a esta pregunta, en caso de que alguien más viene a lo largo, aquí estaba lo que desenterré. El DjangoTestSuiteRuner utiliza un método llamado build_test (label) que averigua qué casos de prueba ejecutar en función de la etiqueta. Al analizar este método, resulta que están haciendo un getattr() en el módulo "modelos" o "prueba". Esto significa que si devuelve un paquete, el corredor de prueba no está buscando sus casos de prueba en ese conjunto, solo se ve en uno de esos módulos.

Una solución rápida es usar __init__.py para importar sus pruebas directamente en lugar de definir un conjunto de aplicaciones. Los hace parte del módulo "prueba" y así build_test (etiqueta) puede encontrarlos.

Para su ejemplo anterior, tests/__init__.py contendrá simplemente:

from field_tests import * 
from storage_tests import * 

Esto no es muy elegante y por supuesto, si usted está tratando de hacer algo más complicado con su suite, entonces esto no va a funcionar, pero sería para este caso.

2

Pon este código en tu __init__.py importará todas las clases de prueba en el paquete y subpaquetes. Esto le permitirá ejecutar pruebas específicas sin importar todos los archivos manualmente.

import pkgutil 
import unittest 

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__): 
    module = loader.find_module(module_name).load_module(module_name) 
    for name in dir(module): 
     obj = getattr(module, name) 
     if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase): 
      exec ('%s = obj' % obj.__name__) 

Del mismo modo, para el conjunto de pruebas sólo tiene que utilizar:

def suite(): 
    return unittest.TestLoader().discover("appname.tests", pattern="*.py") 

Ahora todo lo que tiene que hacer para las nuevas pruebas es escribir ellos y asegurarse de que están en la carpeta de pruebas. ¡No más mantenimiento tedioso de las importaciones!

116

Desde Django 1.6 puede ejecutar un caso de prueba completo, o una sola prueba, usando la notación de puntos completa para el elemento que desea ejecutar.

descubrimiento de prueba automática ahora se encuentra en pruebas de cualquier archivo que comienza con prueba bajo el directorio de trabajo, por lo que abordar la cuestión tendría que cambiar el nombre de archivos, pero ahora usted puede mantenerlos dentro del directorio que desea. Si desea utilizar nombres de archivo personalizados, puede especificar un patrón (corredor de prueba de Django predeterminado) con la opción marcar --pattern="my_pattern_*.py".

Así que si usted está en su directorio manage.py y desea ejecutar la prueba test_a dentro TestCase subclase A dentro de un archivo tests.py bajo la aplicación/módulo example puede hacer:

python manage.py test example.tests.A.test_a 

Si no desea para incluir una dependencia y están en Django 1.6 o posterior, así es como lo haces.

See the Django documentation for more information

+0

. Es bueno ver ahora esta función integrada en Django. – hekevintran

4

Esto debería trabajo-

python manage.py test my_app.tests.storage_tests 
Cuestiones relacionadas