2008-09-26 6 views
6

Je veux écrire des tests qui peuvent montrer si la base de données est ou non en synchronisation avec mon fichier models.py. En fait, je les ai déjà écrits, seulement pour découvrir que django crée une nouvelle base de données chaque fois que les tests sont exécutés sur la base du fichier models.py. Est-il possible de faire le models.py test utiliser le schéma de base de données existant? Celui qui est dans mysql/postgresql, et pas celui qui est dans /myapp/models.py? Je ne me soucie pas des données qui sont dans la base de données, je me soucie seulement de schéma ie je veux que mes tests remarquent si une table dans la base de données a moins de champs que le schéma dans mon fichier models.py . J'utilise le framework unittest (en fait l'extension django) si cela a de la pertinence.Comment tester un schéma de base de données django?

grâce

Répondre

8

Ce que nous avons fait était remplacer le test_runner par défaut de sorte qu'il ne serait pas créer une nouvelle base de données pour effectuer le test. De cette façon, il exécute le test contre tout ce qui ressemble à notre base de données locale actuelle. Mais soyez très prudent si vous utilisez cette méthode car toute modification des données que vous effectuez dans vos tests sera permanente. Je me suis assuré que tous nos tests restaure tous les changements à leur état d'origine, et conserve notre version vierge de notre base de données sur le serveur et sauvegardée.

Donc, pour ce faire, vous devez copier la méthode RUN_TEST de django.test.simple à un emplacement dans votre projet - je mets le mien dans myproject/test/test_runner.py

Ensuite, faire les modifications suivantes cette méthode:

// change 
old_name = settings.DATABASE_NAME 
from django.db import connection 
connection.creation.create_test_db(verbosity, autoclobber=not interactive) 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 
connection.creation.destroy_test_db(old_name, verbosity) 

// to: 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 

Assurez-vous de faire toutes les importations nécessaires en haut, puis dans les paramètres ensemble de fichiers le réglage:

TEST_RUNNER = 'myproject.test.test_runner.run_tests' 

maintenant lorsque vous exécutez. /manage.py test Django exécute les tests sur l'état actuel de votre base de données plutôt que de créer une nouvelle version basée sur vos définitions de modèle actuelles.

Une autre chose que vous pouvez faire est de créer une copie de votre base de données locale, puis effectuez une vérification dans votre nouvelle méthode RUN_TEST() comme ceci:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

De cette façon, il n'y a pas de danger de tests en cours d'exécution contre votre base de données principale.

Questions connexes