Die Erstellung der Testdatenbank bei Django Unit Testing dauert sehr langePython

Python-Programme
Anonymous
 Die Erstellung der Testdatenbank bei Django Unit Testing dauert sehr lange

Post by Anonymous »

Seit einiger Zeit dauern meine Unit-Tests länger als erwartet. Ich habe ein paar Mal erfolglos versucht, es zu debuggen, da es zu Verzögerungen kommt, bevor meine Tests überhaupt beginnen. Dies hat meine Fähigkeit beeinträchtigt, auch nur annähernd eine testgetriebene Entwicklung durchzuführen (vielleicht sind meine Erwartungen zu hoch), also möchte ich sehen, ob ich das ein für alle Mal beheben kann.

Wenn ich einen Test durchführe, gibt es eine Verzögerung von 70 bis 80 Sekunden zwischen dem Start und dem tatsächlichen Beginn des Tests. Wenn ich beispielsweise einen Test für ein kleines Modul durchführe (mit time python manage.py test myapp), erhalte ich

Code: Select all


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.400s
Etwa 1:18 der 1:21 Minuten liegen zwischen

Code: Select all

Creating test database for alias 'default'...
und der

Code: Select all

.......
Zeile. Mit anderen Worten, der Test dauert weniger als 3 Sekunden, aber die Datenbankinitialisierung scheint 1:18 Minuten zu dauern

Ich habe etwa 30 Apps, die meisten mit 1 bis 3 Datenbankmodellen, daher sollte dies eine Vorstellung von der Projektgröße geben. Ich verwende SQLite für Unit-Tests und habe einige der vorgeschlagenen Verbesserungen implementiert. Ich kann nicht meine gesamte Einstellungsdatei veröffentlichen, füge aber gerne alle erforderlichen Informationen hinzu.

Ich verwende einen Läufer

Code: Select all

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)
und in meinen Einstellungen:

Code: Select all

TEST_RUNNER = 'config.test_runner.ExcludeAppsTestSuiteRunner'
Ich habe auch versucht, django-nose mit django-nose-exclude zu verwenden

Ich habe viel darüber gelesen, wie man den Test selbst beschleunigt, aber keine Hinweise darauf gefunden, wie man die Datenbankinitialisierung optimieren oder vermeiden kann. Ich habe die Vorschläge gesehen, nicht mit der Datenbank zu testen, aber ich kann oder weiß nicht, wie ich das ganz vermeiden kann.

Bitte lassen Sie mich wissen, wenn
  • Das ist normal und erwartet
  • Nicht erwartet (und hoffentlich eine Lösung oder ein Hinweis, was zu tun ist)
Auch hier brauche ich keine Hilfe, wie das geht Beschleunigen Sie nicht den Test selbst, sondern die Initialisierung (oder den Overhead). Ich möchte, dass das obige Beispiel 10 Sekunden statt 80 Sekunden dauert.

Vielen Dank

Ich habe den Test (für eine einzelne App) mit --verbose 3 ausgeführt und festgestellt, dass das alles mit Migrationen zusammenhängt:

Code: Select all

  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
Ich habe alle meine Migrationen unterdrückt, aber immer noch langsam.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post