Domanda

Voglio scrivere test che possano mostrare se il database è sincronizzato o meno con il mio file models.py. In realtà li ho già scritti, solo per scoprire che django crea un nuovo database ogni volta che i test vengono eseguiti in base al file models.py. Posso fare in modo che il test models.py usi lo schema di database esistente? Quello che è in mysql / postgresql e non quello che è in /myapp/models.py?

Non mi interessano i dati che si trovano nel database, mi interessa solo il schema cioè voglio che i miei test notino se una tabella nel database ha meno campi dello schema nel mio file models.py.

Sto usando il framework unittest (in realtà l'estensione django ad esso) se questo ha qualche rilevanza.

grazie

È stato utile?

Soluzione

Quello che abbiamo fatto è stato sovrascrivere il test_runner predefinito in modo che non creasse un nuovo database da testare. In questo modo, esegue il test a prescindere dal nostro attuale database locale. Ma stai molto attento se usi questo metodo perché qualsiasi modifica ai dati che fai nei tuoi test sarà permanente. Mi sono assicurato che tutti i nostri test ripristinassero le modifiche al loro stato originale, mantenendo la nostra versione originale del nostro database sul server e facendone il backup.

Quindi per fare questo devi copiare il metodo run_test da django.test.simple in una posizione nel tuo progetto - Ho messo il mio in myproject / test / test_runner.py

Quindi apporta le seguenti modifiche a quel metodo:

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

Assicurati di fare tutte le importazioni necessarie in alto e poi nel tuo file delle impostazioni imposta l'impostazione:

TEST_RUNNER = 'myproject.test.test_runner.run_tests'

Ora quando esegui il test ./manage.py Django eseguirà i test sullo stato corrente del tuo database anziché creare una nuova versione basata sulle definizioni del tuo modello attuale.

Un'altra cosa che puoi fare è creare una copia del tuo database localmente, quindi fare un controllo nel tuo nuovo metodo run_test () in questo modo:

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) 

In questo modo non c'è pericolo di eseguire test sul database principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top