Django 1.7 führte Datenbankmigrationen ein .
Wenn Sie die Komponententests in Django 1.7 ausführen, wird eine Migration erzwungen , die lange dauert. Daher möchte ich die Django-Migrationen überspringen und die Datenbank im Endzustand erstellen.
Ich weiß, dass das Ignorieren der Migrationen eine schlechte Praxis sein kann, da dieser Teil des Codes nicht getestet werden würde. Dies ist jedoch nicht der Fall: Ich führe die vollständigen Migrationen auf dem CI-Testserver (Jenkins) aus. Ich möchte nur die Migrationen in meinen lokalen Tests überspringen, bei denen es auf die Geschwindigkeit ankommt.
Ein Kontext:
Bis Django 1.6 habe ich bei Verwendung von South die Einstellung SOUTH_TESTS_MIGRATE verwendet :
Standardmäßig wendet der Befehl syncdb von South auch Migrationen an, wenn er im nicht interaktiven Modus ausgeführt wird. Dies gilt auch für die Ausführung von Tests. Bei jeder Ausführung Ihrer Tests wird jede Migration ausgeführt.
Wenn Sie möchten, dass der Testläufer syncdb anstelle der Migration verwendet, z. B. wenn Ihre Migrationen viel zu lange dauern, setzen Sie einfach SOUTH_TESTS_MIGRATE = False in settings.py.
Allerdings syncdb existieren mehr nicht, jetzt ist es Migrate .
Und ab Django 1.8 verwende ich den Parameter --keepdb :
Mit der Option --keepdb kann die Testdatenbank zwischen den Testläufen beibehalten werden. Dies hat den Vorteil, dass sowohl die Erstellungs- als auch die Zerstörungsaktionen übersprungen werden, was die Zeit zum Ausführen von Tests erheblich verkürzt, insbesondere in einer großen Testsuite. Wenn die Testdatenbank nicht vorhanden ist, wird sie beim ersten Lauf erstellt und dann für jeden nachfolgenden Lauf beibehalten. Nicht angewendete Migrationen werden auch auf die Testdatenbank angewendet, bevor die Testsuite ausgeführt wird.
Diese Frage ist also auf Django 1.7 beschränkt.
quelle
django-test-without-migrations
Paket war wirklich praktisch für mich, vielleicht möchten Sie die akzeptierte Antwort auf stackoverflow.com/a/28993456/200224Antworten:
Schauen Sie sich diese Problemumgehung an , die Bernie Sumption auf der Mailingliste der Django-Entwickler veröffentlicht hat:
In Django 1.9 hat sich diese Situation etwas verbessert , und Sie können den Wert auf Folgendes einstellen
None
:MIGRATION_MODULES = {"myapp": Keine}
quelle
myapp.migrations_not_used_in_tests
Modul nicht vorhanden sein sollte.Hier ist das Ende meiner Einstellungsdatei:
basierend auf diesem Snippet
Ich habe Migrationen nur deaktiviert, wenn Tests ausgeführt werden
quelle
__setitem__(self, *_)
Methode hinzufügen , weil wir Probleme mit Apps hatten, die ihre eigene Migration wiesettings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
django-test-without-migrations fügt ein
--nomigrations
Flag hinzumanage.py test
. Klappt wunderbar.quelle
Update : Egal, diese Änderung wurde vor der Veröffentlichung des 1.10-Finales rückgängig gemacht . Hoffentlich wird es in einer zukünftigen Version zurückkehren.
Beachten Sie, dass dies ab Django 1.10 durch eine Testdatenbankeinstellung gesteuert werden kann.
quelle
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
quelle
Für Django 1.9 und höher funktioniert die Antwort von Guillaume Vincent nicht mehr. Hier ist eine neue Lösung:
Ich verwende dieses Snippet in meiner Einstellungsdatei nach der Definition des
INSTALLED_APPS
Es iteriert über alle installierten Apps und markiert jede als ohne Migrationsmodul. Weitere Informationen finden Sie in den Django-Dokumenten .
Mit diesem Snippet können Sie Ihre Tests ausführen und die Umgebungsvariable festlegen
TESTS_WITHOUT_MIGRATIONS
, z.quelle
Ich finde gerade heraus, wie man Migrationen nach Django 1.10 deaktiviert, vielleicht könnte es jemandem helfen. Hier ist der Link bei git
Migrationen für Django 1.10 bestehen aus zwei Teilen. Schauen Sie sich load_disk und recorder an
Der Teil
load_disk
für das Migrationsmodell der App, der hinzugefügt wird,INSTALL_APP
und der Teilrecorder
für die Datenbankverbindung Für die Version vor 1.9 müssen wir festgelegt werden,MIGRATION_MODULES={'do.not.migrate':'notmigrations'}
wenn Sie den Test ausführen. Jetzt müssen wir ihn festlegen. Keine wieMIGRATION_MODULES={'do.not.migrate':None}
Also, wenn wir keine Migrationen für eine App durchführen möchten Erweitern Sie einfach ein Diktat und kehren SieNone
zurgetitem
Funktion zurück, und machen Sie dasselbe beiDATABASES
, das ist das Richtige, was Sie tun müssenPS: Für Befehle müssen Sie
--setting=module.path.settings_test_snippet
nachtest
PPS angeben. Wenn Sie mit arbeitenpycharm
, legen Sie keine--settings
Optionen festRun/Debug configurations
, sondern fügen Sie einfach den Pfad vonsettings_test_snippet.py
bei Benutzerdefinierte Einstellung hinzu. Das ist einfach gut !!genießen
quelle