Django (1.2 Beta) réinitialisera la ou les bases de données entre chaque test qui fonctionne, ce qui signifie que chaque test fonctionne sur un DB vide. Cependant, la ou les bases de données ne sont pas Considérez un test qui tire des données hors de la base de données par clé primaire: P> auto_incrènement code> est réinitialisé. class ChangeLogTest(django.test.TestCase):
def test_one(self):
do_something_which_creates_two_log_entries()
log = LogEntry.objects.get(id=1)
assert_log_entry_correct(log)
log = LogEntry.objects.get(id=2)
assert_log_entry_correct(log)
3 Réponses :
est-il possible de forcer ./Manage.py Test pour rincer la base de données entre chaque cas de test? P>
Consultez la mise en œuvre de la commande de django.core.management.commands.flush.py. p>
Vous pouvez appeler la commande de flush à l'intérieur de votre appel de test (peut-être dans testcase.setup) : p>
xxx pré> Peut-être qu'il y a une bonne raison. Est-ce que quelqu'un sait? P> BlockQuote>
Oui, il y a: accélérer. Rincer et recharger de nombreuses données de Json prend un moment ... p>
Peut-être que vous devriez avoir un coup d'oeil sur
TransactionStestCase P> BlockQuote>
La réponse à ceci est, n'écrivez pas vos tests de manière à ce qu'ils dépendent de valeurs clés particulières. Par exemple, votre test pourrait mieux être écrit:
def test_one(self):
do_something_which_creates_two_log_entries()
logs = LogEntry.objects.all()
assert_log_entry_correct(log[0])
assert_log_entry_correct(log[1])
Je suppose que cela fonctionnerait, car logentiry.Object.all () code> retourne toujours des enregistrements dans le même ordre (augmentation de la clé primaire), non?
Il est indéfini, mais très probablement oui. Si vous voulez être sûr, il suffit de commander des résultats par ID
@Mike, Ivan: ..or Ajouter Commande = ('ID',) Code> à Model.Meta
Une façon, vous pouvez écrire le type de test suggéré par Daniel utilise quelque chose comme jsonschema code> et swagger. J'imagine qu'il y ait d'autres moyens, mais c'est juste celui qui a fonctionné pour moi.
Vous pouvez également utiliser Transaction. Réinitialisation :
Réglage RESET_SURCENCESS = TRUE STROND> sur une TRANSACTIONSTECASE SEROINDERA TOUT TOUJOURS Réinitialiser avant l'exécution du test: P>
class TestsThatDependsOnPrimaryKeySequences(TransactionTestCase): reset_sequences = True def test_animal_pk(self): lion = Animal.objects.create(name="lion", sound="roar") # lion.pk is guaranteed to always be 1 self.assertEqual(lion.pk, 1)
Ça ne fonctionne que si le backend de la base de données a supports_Suence_reset = true code>, ce qui n'est pas le cas pour SQLite.