117 votes

Désactiver les migrations lors de tests unitaires en cours d’exécution dans Django 1.7

Django 1.7 introduit migrations de base de données.

Lors de l'exécution des tests unitaires dans Django 1.7, elle oblige à migrer, qui prend du temps. Donc je voudrais sauter le django migrations, et de créer la base de données dans l'état final.

Je sais que le fait d'ignorer les migrations peuvent être une mauvaise pratique, car cette partie du code n'est pas testé. Mais ce n'est pas le cas: je suis en cours d'exécution de la pleine migrations dans l'IC serveur de test (jenkins). Je ne veux sauter les migrations dans mes tests locaux, où la vitesse des questions.


Le contexte:

Jusqu'à ce que Django 1.6, lors de l'utilisation de Sud, j'ai utilisé le SOUTH_TESTS_MIGRATE paramètre:

Par défaut, le Sud de la commande syncdb s'appliquera également les migrations s'il est exécuté en mode non-interactif, qui comprend lorsque vous êtes en cours d'exécution, des essais, il sera exécuté à chaque migration chaque fois que vous exécutez vos tests.

Si vous souhaitez que le lanceur de test à utiliser syncdb au lieu de migrer - par exemple, si votre migrations prend beaucoup trop de temps à appliquer - réglez simplement SOUTH_TESTS_MIGRATE = False dans settings.py.

Cependant, syncdb n'existe plus, maintenant c'est à migrer.

Et à partir de Django 1.8 , je vais utiliser l' --keepdb paramètre:

L' --keepdb option peut être utilisée pour préserver la base de données de test entre les séries de tests. Ceci a l'avantage de faire l'impasse à la fois de la créer et de détruire des actions qui réduit considérablement le temps d'exécution des tests, en particulier ceux dans une grande suite de tests. Si le test de la base de données n'existe pas, il sera créé lors de la première exécution, puis conservées pour chaque run. Tout non imputées migrations sera également appliqué à la base de données de test avant de lancer la suite de tests.

Ainsi, cette question est limitée à Django 1.7.

82voto

albertgasset Points 236

Regarder cette solution de contournement, posté par Bernie Sumption à la Django liste de diffusion des développeurs:

Si makemigrations n'a pas encore été exécuté, le "migrer" commande traite une application comme unmigrated, et crée des tables directement à partir des modèles de juste comme syncdb n'en 1.6. J'ai défini une nouvelle paramètres de module pour l'unité des tests appelés "settings_test.py" qui les importations * à partir de la principale paramètres de module et ajoute cette ligne:

MIGRATION_MODULES = {"myapp": "myapp.migrations_not_used_in_tests"}

Puis-je exécuter des tests de ce genre:

DJANGO_SETTINGS_MODULE="myapp.settings_test" python manage.py test

Cette imbéciles migrer en pensant que l'application est unmigrated, et ainsi de chaque fois qu'un test de base de données est créée, elle s'inscrit dans le courant la structure de models.py.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X