2017-05-05 2 views
8

J'ai écrit une série de tests pour mon application Django, et je voudrais les exécuter sur une copie de ma base de données de production.Comment exécuter des tests Django sur une copie de ma base de données de production?

Pour autant que je peux dire, la meilleure façon de faire est d'utiliser fixture loading comme ceci:

  • Run manage.py dumpdata -o app.dump
  • Déplacer le fichier app.dump résultant de un répertoire dans fixtures le dossier
  • [nom de l'application] Spécifiez un attribut de classe « fixtures » sur ma django.test.TestCase sous-classe

Cependant, cette approche est lourde. J'ai plusieurs applications, et en cours d'exécution manage.py dumpdata pour chacun d'entre eux et déplacer manuellement les fichiers appareils à chaque fois que je veux tester mon application est une douleur.

Existe-t-il un moyen plus simple de générer automatiquement une copie de toute ma base de données de production et de tester mes applications Django par rapport à celle-ci?

+1

Cela n'est possible que pour les petits sites Web. Combien de temps pensez-vous qu'il suffira de configurer le test s'il y a plusieurs Go de données? – e4c5

+0

Je sais! Heureusement, mon site est assez petit. – Sam

Répondre

3

Généralement, il est déconseillé de tester le DB actif ou une copie de la base de données en direct. Pourquoi? Parce que les tests doivent être prévisibles. Lorsque vous effectuez une copie de la base de données dynamique, l'entrée devient imprévisible. Le deuxième problème est que vous ne pouvez évidemment pas tester sur le site en direct, donc vous devez cloner les données. C'est lent pour quelque chose de plus que quelques MB.

Même si le DB est petit, dumpdata suivi par loaddata n'est pas le chemin. C'est parce que dumpdata par défaut exporte dans un format JSON qui a un gros surcoût de génération, sans parler de rendre le fichier de données très volumineux. L'importation à l'aide de loaddata est encore plus lente.

La seule façon réaliste de créer un clone est d'utiliser les moteurs de base de données construits dans le mécanisme d'exportation/importation. Dans le cas de sqlite, il s'agit juste de copier le fichier db. Pour mysql c'est SELECT INTO OUTFILE suivi de LOAD DATA INFILE. Et pour postgresql, c'est COPY TO suivi de COPY FROM et ainsi de suite.

Toutes ces commandes d'exportation/importation peuvent être exécutées à l'aide de l'objet de connexion de bas niveau disponible dans django et peuvent donc être utilisées pour charger des appareils.

+0

Merci pour la réponse, e4c5. Essentiellement, ce que j'entends, c'est que je devrais trouver un autre moyen de faire ce que j'essaie de faire. J'ai posté le problème en tant que question séparée ici au cas où vous avez des idées: http://stackoverflow.com/questions/43876310/how-should-i-test-a-database-driven-django-cms-for-404 -les erreurs – Sam

0

Vous n'avez pas mentionné quelle version de Django que vous utilisez, mais regardant la documentation 1.11:

Cependant, il n'est pas certain que from the 1.11 docs about fixture loading for tests verra également FIXTURE_DIRS. Cela ne résout donc pas entièrement votre problème.