2010-05-05 15 views
6

Django (1.2 beta) ripristinerà il/i database/i tra ogni test eseguito, ovvero ogni test viene eseguito su un DB vuoto. Tuttavia, il (i) database (i) non è svuotato. Uno degli effetti dello svuotamento del database è il ripristino dei contatori auto_increment.Can Django svuota il (i) database (i) tra ogni test unitario?

consideri un test che estrae i dati dal database chiave primaria:

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) 

questo passerà, perché solo due voci di registro sono stati mai creato. Tuttavia, se viene aggiunto un altro test a e viene eseguito prima deltest_one, le chiavi primarie delle voci di registro non sono più 1 e 2, potrebbero essere 2 e 3. Ora test_one non riesce.

Questo è in realtà una domanda in due parti:

  1. E 'possibile forzare ./manage.py test per svuotare il database tra un banco di prova?
  2. Dato che Django non scarica il DB tra ogni test per impostazione predefinita, forse c'è una buona ragione. Qualcuno sa?

risposta

7

è possibile forzare ./manage.py test per svuotare il database tra ogni caso di test?

Dai un'occhiata all'implementazione del comando di django.core.management.commands.flush.py.

È possibile chiamare il comando a filo dall'interno della vostra chiamata di prova (forse in TestCase.setUp):

management.call_command('flush') 

forse c'è una buona ragione. Qualcuno sa?

Sì c'è: Accelerazione. Lavaggio e ricaricare molti dati da JSON vuole un po '...

Forse si dovrebbe avere uno sguardo su TransactionTestCase

8

La risposta a questo è, non scrivere i test in modo tale da essi dipendono particolare valori chiave. Ad esempio, il test potrebbe meglio essere scritta:

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

immagino che avrebbe funzionato, in quanto 'LogEntry.objects.all()' restituisce sempre record nello stesso ordine (crescente chiave primaria), giusto? –

+0

non è definito, ma molto probabilmente sì. Se vuoi essere sicuro, basta ordinare i risultati per id –

+1

@Mike, Ivan: ..o aggiungere 'ordering = ('id',)' a Model.Meta –

Problemi correlati