Django 1.7 a introduit les migrations de bases de données .
Lors de l'exécution des tests unitaires dans Django 1.7, cela force une migration , qui prend beaucoup de temps. Je voudrais donc ignorer les migrations de django et créer la base de données dans l'état final.
Je sais qu'ignorer les migrations peut être une mauvaise pratique, car cette partie du code ne serait pas testée. Mais ce n'est pas le cas: j'exécute les migrations complètes dans le serveur de test CI (jenkins). Je veux seulement sauter les migrations dans mes tests locaux, où la vitesse compte.
Un peu de contexte:
Jusqu'à Django 1.6 , lors de l'utilisation de South, j'ai utilisé le paramètre SOUTH_TESTS_MIGRATE :
Par défaut, la commande syncdb de South appliquera également les migrations si elle est exécutée en mode non interactif, ce qui inclut le moment où vous exécutez des tests - elle exécutera chaque migration à chaque fois que vous exécutez vos tests.
Si vous voulez que le testeur utilise syncdb au lieu de migrer - par exemple, si vos migrations prennent beaucoup trop de temps à appliquer - définissez simplement SOUTH_TESTS_MIGRATE = False dans settings.py.
Cependant, syncdb n'existe plus, maintenant il migre .
Et à partir de Django 1.8, j'utiliserai le paramètre --keepdb :
L'option --keepdb peut être utilisée pour conserver la base de données de test entre les exécutions de test. Cela a l'avantage de sauter à la fois les actions de création et de destruction, ce qui réduit considérablement le temps d'exécution des tests, en particulier ceux d'une grande suite de tests. Si la base de données de test n'existe pas, elle sera créée lors de la première exécution, puis conservée pour chaque exécution suivante. Toutes les migrations non appliquées seront également appliquées à la base de données de test avant d'exécuter la suite de tests.
Cette question est donc limitée à Django 1.7.
la source
django-test-without-migrations
package a été vraiment pratique pour moi, vous voudrez peut-être changer la réponse acceptée en stackoverflow.com/a/28993456/200224Réponses:
Regardez cette solution de contournement , publiée par Bernie Sumption sur la liste de diffusion des développeurs Django:
Dans Django 1.9, cette situation est quelque peu améliorée et vous pouvez définir la valeur sur
None
:MIGRATION_MODULES = {"myapp": Aucun}
la source
myapp.migrations_not_used_in_tests
module ne doit pas exister.Voici la fin de mon fichier de paramètres:
basé sur cet extrait
J'ai désactivé les migrations uniquement lorsque les tests sont en cours d'exécution
la source
__setitem__(self, *_)
méthode car nous avons eu des problèmes avec les applications qui définissent leur propre migration commesettings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
django-test-without-migrations ajoute un
--nomigrations
indicateur àmanage.py test
. Fonctionne comme un charme.la source
Mise à jour : Qu'à cela ne tienne, ce changement a été annulé avant la sortie de la version 1.10 finale. Espérons qu'il reviendra dans une prochaine version.
Notez qu'à partir de Django 1.10, cela peut être contrôlé par un paramètre de base de données de test.
la source
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
la source
Pour django 1.9 et plus la réponse de Guillaume Vincent ne fonctionne plus, alors voici une nouvelle solution:
J'utilise cet extrait dans mon fichier de paramètres, après la définition du
INSTALLED_APPS
Il itère sur toutes les applications installées et les marque comme n'ayant pas de module de migration. Consultez la documentation de django pour plus d'informations .
En utilisant cet extrait, vous pouvez exécuter vos tests, en définissant la variable d'environnement
TESTS_WITHOUT_MIGRATIONS
, par exemple:la source
Je viens de comprendre comment désactiver les migrations après django 1.10, cela pourrait peut-être aider quelqu'un. Voici le lien sur git
Les migrations pour django 1.10 ont deux parties, veuillez regarder load_disk et recorder
La partie du
load_disk
modèle d'application pour les migrations qui sera ajouté àINSTALL_APP
Et la partie de larecorder
connexion à la base de données Pour la version antérieure à la version 1.9, nous devons définirMIGRATION_MODULES={'do.not.migrate':'notmigrations'}
lorsque vous exécutez le test Maintenant, nous devons la définir Aucune commeMIGRATION_MODULES={'do.not.migrate':None}
Donc si nous ne voulons pas effectuer de migrations pour aucune application , étendez simplement un dict et retournezNone
pourgetitem
fonction, et faites de même àDATABASES
, c'est la bonne chose à fairePS: pour la commande, vous devez spécifier
--setting=module.path.settings_test_snippet
aprèstest
PPS Si vous travaillez avecpycharm
, ne définissez pas d'--settings
options surRun/Debug configurations
, ajoutez simplement le chemin desettings_test_snippet.py
au paramètre personnalisé. Ça va bien !!prendre plaisir
la source