Django 1.7 a introduit des migrations de firebase database .
Lors de l’exécution des tests unitaires dans Django 1.7, cela force la migration , ce qui prend beaucoup de temps. Donc, je voudrais sauter les migrations de django et créer la firebase database dans l’état final.
Je sais que 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’effectue les migrations complètes sur le serveur de test CI (jenkins). Je ne veux que sauter les migrations dans mes tests locaux, là où la vitesse est importante.
Un contexte:
Jusqu’à Django 1.6 , en utilisant 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 les tests en cours. Elle exécutera chaque migration chaque fois que vous exécuterez vos tests.
Si vous souhaitez que le programme de test utilise syncdb au lieu de migrer – par exemple, si vos migrations sont trop longues à 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 préserver la firebase database de test entre les tests. Cela présente l’avantage d’éviter 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 firebase database de test n’existe pas, elle sera créée lors de la première exécution, puis conservée pour chaque exécution ultérieure. Toute migration non appliquée sera également appliquée à la firebase database de test avant d’exécuter la suite de tests.
Donc, cette question est limitée à Django 1.7.
Regardez cette solution de contournement , postée par Bernie Sumption sur la liste de diffusion des développeurs Django:
Si makemigrations n’a pas encore été exécuté, la commande “migrate” traite une application comme non migrée et crée des tables directement à partir des modèles, comme l’a fait syncdb en 1.6. J’ai défini un nouveau module de parameters uniquement pour les tests unitaires appelés “settings_test.py”, qui importe * depuis le module de parameters principal et ajoute cette ligne:
MIGRATION_MODULES = {“myapp”: “myapp.migrations_not_used_in_tests”}
Ensuite, je lance des tests comme celui-ci:
DJANGO_SETTINGS_MODULE = “myapp.settings_test” Test de python manage.py
Ces imbéciles migrent en pensant que l’application n’est pas migrée, et chaque fois qu’une firebase database de test est créée, elle reflète la structure actuelle de models.py.
Dans Django 1.9, cette situation s’améliore quelque peu et vous pouvez définir la valeur sur None
:
MIGRATION_MODULES = {“myapp”: Aucun}
Voici la fin de mon fichier de parameters:
class DisableMigrations(object): def __contains__(self, item): return True def __getitem__(self, item): return None TESTS_IN_PROGRESS = False if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]: logging.disable(logging.CRITICAL) PASSWORD_HASHERS = ( 'django.consortingb.auth.hashers.MD5PasswordHasher', ) DEBUG = False TEMPLATE_DEBUG = False TESTS_IN_PROGRESS = True MIGRATION_MODULES = DisableMigrations()
basé sur cet extrait
J’ai désactivé les migrations uniquement lorsque les tests sont en cours d’exécution
django-test-without-migrations ajoute un indicateur manage.py test
. Fonctionne comme un charme.
Mise à jour : Peu importe, ce changement a été annulé avant la publication de la version 1.10 finale. J’espère qu’il reviendra dans une future version.
Notez qu’à partir de Django 1.10, cela peut être contrôlé par un paramètre de firebase database de test.
ÉMIGRER
Par défaut:
True
Si la valeur est
False
, Django n’utilisera pas les migrations pour créer la firebase database de test.
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
MIGRATION_MODULES = { app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests' for app in INSTALLED_APPS }
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 parameters, après la définition de INSTALLED_APPS
if os.environ.get('TESTS_WITHOUT_MIGRATIONS', False): MIGRATION_MODULES = { app.split('.')[-1]: None for app in INSTALLED_APPS }
Il parcourt toutes les applications installées et marque chacune comme n’ayant pas de module de migration. Voir les django docs 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:
TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test
Je viens de comprendre comment désactiver les migrations après Django 1.10, peut-être que cela pourrait aider quelqu’un. Voici un lien à git
class DisableMigrations(dict): def __contains__(self, item): return True def __getitem__(self, item): return None DATABASES = DisableMigrations() MIGRATION_MODULES = DisableMigrations()
Migrations for django 1.10 a deux parties, regardez load_disk et recorder
La partie de load_disk
pour le modèle de migration de l’application qui est ajoutée à INSTALL_APP
Et la partie de l’ recorder
pour la connexion à la firebase database Pour la version antérieure à 1.9, il faut définir MIGRATION_MODULES={'do.not.migrate':'notmigrations'}
Maintenant, nous avons besoin de le configurer Aucun comme MIGRATION_MODULES={'do.not.migrate':None}
Donc, si vous ne voulez pas faire de migration pour une application, getitem
simplement un dict et retournez None
pour la fonction getitem
, et faites la même chose avec DATABASES
, c’est la bonne chose à faire
PS: Pour la commande, vous devez spécifier --setting=module.path.settings_test_snippet
après le test
PPS Si vous travaillez avec pycharm
, ne définissez pas les options --settings
dans les Run/Debug configurations
, ajoutez simplement le chemin de settings_test_snippet.py
dans Custom réglage. Ça va bien !!
prendre plaisir