2010-03-04 4 views
0

Si vous avez une configuration de base de données dans Django, comment pouvez-vous faire en sorte que TestRunner utilise la base de données 'live' les paramètres DATABASE_ * dans settings.py) au lieu de les exécuter sur la base de données de test éphémère.Effectuez des tests unitaires sur la base de données 'live' dans settings.py lors de l'utilisation du 'manage.py test' de Django

Par exemple, je voudrais lancer le test suivant sur la base de données live qui est spécifié dans settings.py:

import unittest 

from example import models 

class DBDriverTest(unittest.TestCase): 
    db testDriver(self): 
     "Connect to the live database and drop in sample value." 
     m = models.MyModel('hello') 
     m.save() # ... save to the live database from settings.py 

Actuellement, le code ci-dessus permettra d'économiser seulement à la base de données de test qui a été construit. Ceci est très limitant car mon application a plusieurs processus parallèles fonctionnant sur la base de données - et mes tests unitaires seront incomplets (et incohérents) sans la possibilité de transférer les données vers une base de données 'live' et de voir où elles se trouvent après un court sommeil.

Les deux options possibles, je peux penser sont:

  1. Branchez via l'API Django pour comprendre comment « manuellement » se connecter à la base de données settings.py

  2. Faire un faible connexion -level à la base de données « en direct » et remplir manuellement

l'avant est problématique parce qu'elle avait invoquerait les choses sous l'API publique de Django. Ce dernier est problématique car il renonce à l'API de base de données Django agnostique et est plus manuel.

Je vous suis reconnaissant pour vos idées et vos commentaires.

Brian

Répondre

2

Vous devez définir vos propres méthodes test_runnertearDown, parce que chaque test est exécuté de manière isolée et base de données est effacée après chaque course. Vous pouvez faire ce que vous demandez simplement en construisant votre propre test_runner, nous l'avons fait une fois (même si ce n'était pas moi dans l'équipe) avec la base de données qui a été accédée par les services web et pendant un certain temps nous n'avions aucun façon de supprimer quoi que ce soit à partir de là, mais de supprimer manuellement toute la base de données ;-) C'était très amusant. Répondre à votre question: créez votre propre test_runner et préparez-vous à créer vos propres méthodes tearDown, dans lesquelles vous ne supprimerez que les objets que vous avez créés. Vous devez en quelque sorte y stocker primary keys, vous ne supprimerez donc rien de la base de données en direct.

Cependant, je ne pense pas que ce soit un bon moyen de le faire. L'exécution de tests sur une base de données en direct vous demande un désastre. Tôt ou tard, vous aurez des ennuis avec cela. Ce que vous devez faire à la place est de vider votre base de données en direct, préparer fixtures à partir de ces données et les utiliser dans vos tests. Ceci est bien documenté et facile à faire. De cette façon, vous aurez l'environnement en direct sans risquer vos précieuses données et vous n'avez pas besoin d'écrire le vôtre test_runner. C'est le meilleur et le plus sûr d'aller à mon avis.

+0

Merci, Gruszczy. Je suis d'accord que la création d'un «test_runner» n'est généralement pas la meilleure façon de procéder, mais notre cas est quelque peu différent de la norme. Tout d'abord, les données ne sont pas pertinentes après environ 5 minutes. Deuxièmement, la base de données est interrogée (par un démon) pour les insertions (par Django). Si le démon voit certaines données dans une rangée, cette ligne peut être modifiée. Nous voulons que nos tests unitaires testent que (1) les insertions sont correctes, et (2) le démon fonctionne correctement.Malheureusement, les appareils ne résolvent pas le problème de savoir comment autoriser le démon à accéder à la base de données de tests unitaires. Cependant un test_runner personnalisé devrait résoudre le problème! –

+0

Wow! Les données ne sont pas pertinentes après 5 minutes? Que diable faites-vous, parce que cela semble très en temps réel et cool :-) – gruszczy

+0

Si cela fonctionne jamais, je l'afficherai ici. : o) Na zdrowie! –

Questions connexes