11
votes

Django peut-il affiner sa ou ses bases de données entre chaque test de l'unité?

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 rinçues fortes>. L'un des effets de la rinçage de la base de données est le auto_incrènement code> est réinitialisé.

Considérez un test qui tire des données hors de la base de données par clé primaire: P>

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)


0 commentaires

3 Réponses :


11
votes

est-il possible de forcer ./Manage.py Test pour rincer la base de données entre chaque cas de test?

Consultez la mise en œuvre de la commande de django.core.management.commands.flush.py.

Vous pouvez appeler la commande de flush à l'intérieur de votre appel de test (peut-être dans testcase.setup) : xxx

Peut-être qu'il y a une bonne raison. Est-ce que quelqu'un sait?

Oui, il y a: accélérer. Rincer et recharger de nombreuses données de Json prend un moment ...

Peut-être que vous devriez avoir un coup d'oeil sur TransactionStestCase


0 commentaires

9
votes

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])


4 commentaires

Je suppose que cela fonctionnerait, car logentiry.Object.all () 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',) à Model.Meta


Une façon, vous pouvez écrire le type de test suggéré par Daniel utilise quelque chose comme jsonschema et swagger. J'imagine qu'il y ait d'autres moyens, mais c'est juste celui qui a fonctionné pour moi.



2
votes

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)


1 commentaires

Ça ne fonctionne que si le backend de la base de données a supports_Suence_reset = true , ce qui n'est pas le cas pour SQLite.