Django Unit Testing tarda mucho tiempo en crear una base de datos de prueba
Desde hace algún tiempo, las pruebas de mi unidad han tardado más de lo esperado. He intentado depurarlo un par de veces sin mucho éxito, ya que los retrasos son antes de que mis pruebas comiencen a ejecutarse. Esto ha afectado mi capacidad de hacer algo remotamente cercano al desarrollo impulsado por pruebas (tal vez mis expectativas son demasiado altas), por lo que quiero ver si puedo solucionar esto de una vez por todas.
Cuando se ejecuta una prueba, hay un retraso de 70 a 80 segundos entre el inicio y el comienzo real de la prueba. Por ejemplo, si ejecuto una prueba para un módulo pequeño (usandotime python manage.py test myapp
), Yo obtengo
<... bunch of unimportant print messages I print from my settings>
Creating test database for alias 'default'...
......
----------------------------------------------------------------
Ran 6 tests in 2.161s
OK
Destroying test database for alias 'default'...
real 1m21.612s
user 1m17.170s
sys 0m1.4,00s
Aproximadamente 1m18 de 1m: 21 están entre el
Creating test database for alias 'default'...
y el
.......
línea. En otras palabras, la prueba dura menos de 3 segundos, pero la inicialización de la base de datos parece estar tardando 1: 18min
Tengo alrededor de 30 aplicaciones, la mayoría con modelos de base de datos de 1 a 3, por lo que esto debería dar una idea del tamaño del proyecto. Utilizo SQLite para pruebas unitarias y he implementado algunas de las mejoras sugeridas. No puedo publicar todo mi archivo de configuración, pero me complace agregar cualquier información que sea necesaria.
Yo uso un corredor
from django.test.runner import DiscoverRunner
from django.conf import settings
class ExcludeAppsTestSuiteRunner(DiscoverRunner):
"""Override the default django 'test' command, exclude from testing
apps which we know will fail."""
def run_tests(self, test_labels, extra_tests=None, **kwargs):
if not test_labels:
# No appnames specified on the command line, so we run all
# tests, but remove those which we know are troublesome.
test_labels = (
'app1',
'app2',
....
)
print ('Testing: ' + str(test_labels))
return super(ExcludeAppsTestSuiteRunner, self).run_tests(
test_labels, extra_tests, **kwargs)
y en mi configuración:
TEST_RUNNER = 'config.test_runner.ExcludeAppsTestSuiteRunner'
También he intentado usardjango-nose
condjango-nose-exclude
He leído mucho sobre cómo acelerar la prueba ellos mismos, pero no he encontrado pistas sobre cómo optimizar o evitar la inicialización de la base de datos. He visto las sugerencias para tratar de no probar con la base de datos, pero no puedo o no sé cómo evitarlo por completo.
Por favor avísame si
Esto es normal y esperadoNo se espera (y es de esperar una solución o liderazgo sobre qué hacer)Nuevamente, no necesito ayuda sobre cómo acelerar la prueba, sino la inicialización (o sobrecarga). Quiero que el ejemplo anterior tome 10 segundos en lugar de 80 segundos.
Muchas gracias
Ejecuté la prueba (para una sola aplicación) con--verbose 3
y descubrí que todo esto está relacionado con las migraciones:
Rendering model states... DONE (40.500s)
Applying authentication.0001_initial... OK (0.005s)
Applying account.0001_initial... OK (0.022s)
Applying account.0002_email_max_length... OK (0.016s)
Applying contenttypes.0001_initial... OK (0.024s)
Applying contenttypes.0002_remove_content_type_name... OK (0.048s)
Applying s3video.0001_initial... OK (0.021s)
Applying s3picture.0001_initial... OK (0.052s)
... Many more like this
Aplasté todas mis migraciones pero aún así lento.