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.
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
También encontré este problema y en lugar de usar django-nose seguí este enlace aquí: http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/ . Debe abrir init .py e importar sus pruebas.
Ex en init .py: from unique_test_file import *
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.