unitarias test pruebas parallel framework form python django unit-testing

python - pruebas - test form django



¿Cómo ejecutar django unit-tests en la base de datos de producción? (4)

En caso de que alguien busque en Google aquí la solución para un problema dado, aquí está el esqueleto sobre cómo realizar pruebas unitarias en la base de datos de producción de django. Consulte la sección de documentos de django aquí , para la estructura del archivo / directorio, y las instrucciones sobre dónde colocar el código dado. Debe ir en yourapp/management/commands/newcommandname.py , y tanto las carpetas de administración como las de comandos deben contener archivos __init__.py vacíos, lo que hace que Python los trate como módulos válidos.

El conjunto de pruebas puede ejecutarse como:

$ python manage.py newcommandname

Y aquí viene el código que debe poner en yourapp/management/commands/newcommandname.py :

from django.core.management.base import BaseCommand import unittest class Command(BaseCommand): help = """ If you need Arguments, please check other modules in django/core/management/commands. """ def handle(self, **options): suite = unittest.TestLoader().loadTestsFromTestCase(TestChronology) unittest.TextTestRunner().run(suite) class TestChronology(unittest.TestCase): def setUp(self): print "Write your pre-test prerequisites here" def test_equality(self): """ Tests that 1 + 1 always equals 2. """ from core.models import Yourmodel self.failUnlessEqual(1 + 1, 2)

Estoy iniciando la actitud de desarrollo de TDD y estoy escribiendo pruebas unitarias para mi aplicación django. Soy consciente de los aparatos y sé que esa es la forma en que se deben ejecutar las pruebas, pero para una prueba dada necesito ejecutarlo en toda la base de datos, y el accesorio json para más de 10 millones de bases de datos no es algo que me gustaría manejar Además, esta prueba es de "solo lectura".

Entonces, la pregunta es ¿cómo está configurando sus suites de prueba para que se ejecuten en la base de datos de producción? Me imagino que podría ser tan fácil como agregar la configuración DATABASE_NAME en el método de configuración de ciertas pruebas. Pero la configuración.DATABASE_NAME = "prod_db" da como resultado "NameError: el nombre global ''settings'' no está definido" al ejecutar la prueba. Además, hay un riesgo descrito en http://code.djangoproject.com/ticket/11987 , que puede eliminar accidentalmente una base de datos de producción.

Entonces, ¿cómo es posible, o, mejor aún, cuál es la mejor práctica, ejecutar una única prueba de un conjunto de pruebas en una base de datos de producción en lugar de una temporal?

¡Saludos de antemano por cualquier opinión!


Este TEST_RUNNER funciona en Django 1.3

from django.test.simple import DjangoTestSuiteRunner as TestRunner class DjangoTestSuiteRunner(TestRunner): def setup_databases(self, **kwargs): pass def teardown_databases(self, old_config, **kwargs): pass


Primero, si lo está ejecutando en la base de datos de producción, no es una prueba de "unidad".

Es un trabajo por lotes de primera clase y debe tratarse como un trabajo por lotes de producción de primera clase.

No puede utilizar el comando de test Django para ver los datos de producción. Siempre crea una base de datos vacía que se rellena desde los dispositivos en el TestCase.

Podría hacer que su base de datos de producción procesa un comando de gestión adecuado. Esto tiene todo el entorno configurado correctamente para que su comando pueda usar simplemente el ORM de Django para procesar sus datos.

La alternativa es asegurarse de que configura sus settings . Utilice la variable de entorno DJANGO_SETTINGS_MODULE o use la función settings.configure() para crear un entorno.

Luego puede importar los modelos y hacer el procesamiento que desea hacer en la base de datos de producción.

Puede llamarlo "prueba" si lo desea, pero está mirando los datos de producción, por lo que debe tratarse como una aplicación de producción con respecto a obtener el archivo de configuración y usar la configuración ORM adecuada.


Un test de unidad está destinado a probar sin ningún efecto secundario. Aunque tu prueba no sería nada que se conoce como prueba de unidad. Si desea hacerlo de todos modos, puede usar un corredor de prueba personalizado que está configurando la base de datos (o, en su caso, utilizando la base de datos existente).

Puede establecer la configuración de TEST_RUNNER en su archivo settings.py. El valor predeterminado es localizar en django.test.simple.run_tests . Puede consultar la fuente aquí: http://code.djangoproject.com/browser/django/trunk/django/test/simple.py

Copie y pegue el código en un nuevo archivo y elimine las siguientes líneas del código:

connection.creation.create_test_db(verbosity, autoclobber=not interactive)
...
connection.creation.destroy_test_db(old_name, verbosity)

Esto evitará que django cree una base de datos de prueba y restablezca la configuración de la base de datos de su archivo de configuración.