unitarias test pruebas crear python django unit-testing

python - test - Ejecutar un caso de prueba específico en Django cuando su aplicación tiene un directorio de pruebas



pruebas unitarias python django (6)

La documentación de Django ( http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests ) dice que puede ejecutar casos de prueba individuales al especificarlos:

$ ./manage.py test animals.AnimalTestCase

Esto supone que tiene sus pruebas en un archivo de 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 de 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

Intenté hacer lo que decía el mensaje de excepción:

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

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


Coloque este código en su __init__.py e 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 su suite de pruebas puede simplemente usar:

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

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


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.

El descubrimiento de prueba automático ahora encontrará pruebas en cualquier archivo que comience con la prueba en el directorio de trabajo, por lo que al responder a la pregunta, debería cambiar el nombre de sus archivos, pero ahora puede mantenerlos dentro del directorio que desee. Si desea usar nombres de archivo personalizados, puede especificar un patrón (corredor de prueba Django predeterminado) con la opción flag --pattern="my_pattern_*.py" .

Por lo tanto, si está en su directorio manage.py y quiere ejecutar la prueba test_a dentro de la subclase TestCase A dentro de un archivo tests.py en el example la aplicación / módulo, haría:

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

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

Consulte la documentación de Django para más información


Esto debería funcionar-

python manage.py test my_app.tests.storage_tests


Salida django-nose . Le permite especificar pruebas para ejecutar como:

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

o como se menciona en los comentarios, use la sintaxis:

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



Yo mismo estaba teniendo este problema y encontré esta pregunta, en caso de que apareciera alguien más, 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 __init__.py rápida es usar __init__.py para importar sus pruebas directamente en lugar de definir un conjunto. Los hace parte del módulo "prueba" y así build_test (etiqueta) puede encontrarlos.

Para su ejemplo anterior, las tests/__init__.py solo deberían contener:

from field_tests import * from storage_tests import *

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