Django Unit Testing benötigt sehr viel Zeit zum Erstellen der Testdatenbank

Seit einiger Zeit dauert das Testen meiner Geräte länger als erwartet. Ich habe ein paar Mal ohne großen Erfolg versucht, es zu debuggen, da die Verzögerungen auftreten, bevor meine Tests überhaupt zu laufen beginnen. Dies hat sich auf meine Fähigkeit ausgewirkt, alles zu tun, was der testgetriebenen Entwicklung aus der Ferne nahe kommt (möglicherweise sind meine Erwartungen zu hoch). Daher möchte ich sehen, ob ich dies ein für alle Mal beheben kann.

Wenn ein Test ausgeführt wird, gibt es eine Verzögerung von 70 bis 80 Sekunden zwischen dem Start und dem tatsächlichen Beginn des Tests. Zum Beispiel, wenn ich einen Test für ein kleines Modul durchführe (mittime python manage.py test myapp), Ich bekomm

<... 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

Ungefähr 1m18 der 1m: 21 liegen zwischen dem

Creating test database for alias 'default'...

und di

.......

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

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

Ich benutze einen Läufer

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:

TEST_RUNNER = 'config.test_runner.ExcludeAppsTestSuiteRunner'

Ich habe auch versucht mitdjango-nose mitdjango-nose-exclude

Ich habe viel darüber gelesen, wie der Test selbst beschleunigt werden kann, habe jedoch keine Hinweise zur Optimierung oder Vermeidung der Datenbankinitialisierung gefunden. Ich habe die Vorschläge gesehen, wie man versucht, nicht mit der Datenbank zu testen, aber ich kann oder kann das nicht vollständig vermeiden.

Bitte lass mich wissen, wen

Das ist normal und erwartetNicht erwartet (und hoffentlich eine Lösung oder Anleitung, was zu tun ist)

Again, ich brauche keine Hilfe, um den Test selbst zu beschleunigen, sondern die Initialisierung (oder den Overhead). Ich möchte, dass das obige Beispiel 10 Sekunden anstatt 80 Sekunden dauert.

Danke vielmal

Ich führe den Test (für eine einzelne App) mit @ a--verbose 3 und entdeckte, dass dies alles mit Migrationen zu tun hat:

  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 gequetscht, aber immer noch langsam.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage