__init__ per unittest.TestCase


122

Vorrei aggiungere un paio di cose a ciò che fa la unittest.TestCaseclasse dopo essere stata inizializzata, ma non riesco a capire come farlo.

In questo momento lo sto facendo:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

Vorrei che tutti gli stub venissero generati solo una volta per l'intera serie di test. Non posso usarlo setUpClass()perché sto lavorando su Python 2.4 (non sono stato in grado di farlo funzionare neanche su Python 2.7).

Cosa sto facendo di sbagliato qui?

Ottengo questo errore:

 `TypeError: __init__() takes 1 argument (2 given)` 

... e altri errori quando sposto tutto il codice stub __init__quando lo eseguo con il comando python -m unittest -v test.


@ Neeraj Penso che la mia domanda sia precedente a quella?
Flotta il

@Abhijeet Questa domanda è stata posta nel 2013, quella a cui ti colleghi è stata posta nel 2016 e ha meno risposte e discorsi, forse dovresti contrassegnare l'altra domanda come duplicata? La risposta è correlata a Python 3 e questa domanda parla di Python 2.
ffledgling

mi dispiace per questo mio male.
Abhijeet

Risposte:


166

Prova questo:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

Stai sovrascrivendo il TestCase's __init__, così si potrebbe desiderare di lasciare che il manico classe base gli argomenti per voi.


+1 Inizializzerei la classe base prima di chiamare qualsiasi metodo oggetto.
Joachim Isaksson

Questo non funziona per me. Le cose all'interno di gen_stub non vengono eseguite. Infatti sembra che gen_stub non sia stato chiamato affatto ... posso dirlo perché il self.tempdir che dovrebbe esistere, non è accessibile dagli altri metodi della classe. Ottengo un AttributeError: l'oggetto 'TestingClass' non ha attributo 'tempdir'
ffledgling il

22
non dovresti chiamarlo setUpinvece di sovrascriverlo __init__?
karthikr

2
@karthikr Voglio generare gli stub una volta per tutti i test piuttosto che ricrearli ogni volta per ogni test. Alcuni degli stub non verranno nemmeno utilizzati da alcuni test. Vorrei usare setUpClass, ma non credo che Python 2.4 lo supporti.
ffledgling il

2
Puoi anche essere un po 'più esplicito in questo caso (il che aiuta con la leggibilità secondo me) e usare: unittest.TestCase.__init__(self,*args,**kwargs)invece disuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo

22

Volevo solo aggiungere alcuni chiarimenti sull'override della funzione init di

unittest.TestCase

La funzione verrà chiamata prima di ogni metodo nella classe di test. Si noti che se si desidera aggiungere alcuni calcoli costosi che dovrebbero essere eseguiti una volta prima di eseguire tutti i metodi di test, utilizzare il metodo di classe SetUpClass

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Questa funzione verrà chiamata una volta prima di tutti i metodi di test della classe. Vedere setUpper un metodo che viene chiamato prima di ogni metodo di test.


4

Installa unittest2 e usa il pacchetto unittest.

import unittest2 

e quindi utilizzare la classe setupModule / tearDownModule o setupClass / tearDown per una logica di inizializzazione speciale

Maggiori informazioni: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Inoltre molto probabilmente stai creando un test di integrazione più che un unittest. Scegli un buon nome per i test per differenziarli o inseriscili in un diverso modulo contenitore.


Grazie per il link alla documentazione.
Chris
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.