Spiegare i metodi Python "setUp" e "tearDown" utilizzati nei casi di test


93

Qualcuno può spiegare l'uso dei metodi setUpe di Python tearDowndurante la scrittura di casi di test a parte questo setUpviene chiamato immediatamente prima di chiamare il metodo di test e tearDownviene chiamato immediatamente dopo che è stato chiamato?

Risposte:


85

In generale, si aggiungono tutti i passaggi prerequisiti a setUp e tutti i passaggi di pulizia a tearDown.

Puoi leggere di più con esempi qui .

Quando viene definito un metodo setUp (), il test runner eseguirà quel metodo prima di ogni test. Allo stesso modo, se viene definito un metodo tearDown (), il test runner invocherà quel metodo dopo ogni test.

Ad esempio, hai un test che richiede che gli elementi esistano o un determinato stato, quindi inserisci queste azioni (creazione di istanze di oggetti, inizializzazione di db, preparazione di regole e così via) nel setUp.

Inoltre, come sai, ogni test dovrebbe interrompersi nel punto in cui è stato avviato - questo significa che dobbiamo ripristinare lo stato dell'app al suo stato iniziale - ad esempio chiudere file, connessioni, rimuovere elementi appena creati, chiamare callback delle transazioni e così via - tutto questo i passaggi devono essere inclusi nel tearDown.

Quindi l'idea è che il test stesso dovrebbe contenere solo azioni che devono essere eseguite sull'oggetto di test per ottenere il risultato, mentre setUp e tearDown sono i metodi per aiutarti a lasciare il codice del test pulito e flessibile.

Puoi creare un setUp e un tearDown per una serie di test e definirli in una classe genitore, quindi sarebbe facile per te supportare tali test e aggiornare le preparazioni e le pulizie comuni.

Se stai cercando un esempio semplice, utilizza il seguente link con l'esempio


54

È possibile utilizzarli per escludere il codice comune a tutti i test nella suite di test.

Se hai molto codice ripetuto nei tuoi test, puoi abbreviarli spostando questo codice in setUp / tearDown.

Potresti usarlo per creare dati di test (ad es. Impostare falsi / mock) o eliminare funzioni con falsi.

Se stai eseguendo il test di integrazione, puoi utilizzare il controllo delle pre-condizioni ambientali in setUp e saltare il test se qualcosa non è impostato correttamente.

Per esempio:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())

16
+1 perché le 9 righe di codice sono tutto ciò di cui avevo bisogno per crescere al 100%. Esempio elegante e conciso. Ad essere onesti, quelle 9 righe sono l'unica cosa che ho letto sulla pagina oltre alla domanda, che era anche la mia domanda. Hai detto qualcosa in inglese prima dell'esempio di codice? Non era necessario! Il codice dice tutto! Grazie Matt.
Nathan C. Tresch

2
Non mi è chiaro come "salta il test se qualcosa non è impostato correttamente" viene dimostrato qui. O era solo una parentesi?
user5359531

6

Supponi di avere una suite con 10 test. 8 dei test condividono lo stesso codice di installazione / smontaggio. Gli altri 2 no.

setup e smontaggio ti danno un bel modo per rifattorizzare quegli 8 test. Ora cosa fai con gli altri 2 test? Li sposteresti in un altro testcase / suite. Quindi l'utilizzo di setup e smontaggio aiuta anche a fornire un modo naturale per suddividere i test in case / suite


1
A volte non è consigliabile spostare i test in un altro caso di prova. In tal caso è possibile scrivere un decoratore con il codice di installazione / smontaggio e decorare solo le funzioni di test desiderate.
Matthijs

2
Questa non è affatto una risposta alla domanda.
gented
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.