53 votos

Ejecución de una prueba específica para el caso en Django cuando la aplicación tiene un directorio de pruebas

El Django de documentación (http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests) dice que se puede ejecutar individual de casos de prueba mediante la especificación de ellas:

$ ./manage.py test animals.AnimalTestCase

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

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

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

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

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 yo hago:

$ ./manage.py test my_app

Tratando de especificar un individuo de caso de prueba, se obtiene 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

Traté 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 puedo especificar un individuo de caso de prueba cuando mis pruebas son en varios archivos?

63voto

sdolan Puntos 15572

Checkout django-nariz. Le permite especificar las pruebas a ejecutar como:

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

54voto

cristiano2lopes Puntos 225

Desde Django 1.6 puede ejecutar una prueba completa del caso, o de una sola prueba, utilizando el completar la notación de punto para el elemento que desea ejecutar.

Prueba automática de descubrimiento de ahora podrás encontrar pruebas en cualquier archivo que se inicia con la prueba bajo el directorio de trabajo, para abordar la pregunta que habría que cambiar el nombre de los archivos, pero ahora se puede guardar en el directorio que quieras.

Así que si usted está en su manage.py directorio y desea ejecutar la prueba test_a dentro de TestCase Una subclase dentro de un archivo tests.py en virtud de la aplicación o módulo de ejemplo se podría hacer:

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

Si usted no desea incluir una dependencia y en django 1.6 esa es la manera de hacerlo.

Documentación -> https://docs.djangoproject.com/en/dev/topics/testing/overview/

6voto

Chris T Puntos 41

Yo tenía este problema mí mismo y encontré esta pregunta, en caso de que alguien más venga, aquí era lo que me excavado. El DjangoTestSuiteRuner utiliza un método llamado build_test(etiqueta) que se encarga de determinar qué casos de prueba a ejecutar en función de la etiqueta. Buscando en este método resulta que están haciendo un getattr() en uno de los "modelos" o "prueba" del módulo. Esto significa que si usted devuelve un suite de la prueba corredor no está mirando para los casos de prueba en la suite, que sólo se ve en uno de los módulos.

Un trabajo rápido es utilizar __init__.py a la importación de las pruebas directamente en lugar de definir una suite. El hace parte de la "prueba" del módulo y así build_test(etiqueta) puede encontrar.

Para el ejemplo anterior, tests/__init__.py simplemente debe contener:

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, a continuación, esto no va a funcionar, pero para este caso.

2voto

Bryce Drennan Puntos 316

Poner este código en tu __init__.py para importar todas las clases de prueba en los paquetes y subpaquetes. Esto le permitirá ejecutar pruebas específicas sin importar manualmente cada archivo.

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 se puede utilizar simplemente:

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

Ahora todo lo que tienes que hacer para nuevas pruebas es escribir y asegúrese de que están en la carpeta pruebas. No más tedioso mantenimiento de las importaciones!

1voto

Austin Puntos 647

También me encontré con este problema y en vez de usar django-nariz seguí este enlace aquí: http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/. Usted necesita para abrir init.py y la importación de sus pruebas.

Ex en init.py: from unique_test_file import *

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X