2009-03-15 16 views
13

So di modulo unittest Python.Python - test che riesce quando l'eccezione non viene sollevata

Conosco il metodo assertRaises() della classe TestCase.

Vorrei scrivere un test che ha esito positivo quando un'eccezione è non segnalata.

Eventuali suggerimenti per favore?

+0

possibile duplicato di [Python unittest - opposto di assertRaises?] (Http://stackoverflow.com/questions/4319825/python-unittest-opposite-of-assertraises) – brandizzi

+0

@brandizzi - controllare la data su "duplicato" domanda;) – testerjoe2

risposta

12

Il test runner rileverà tutte le eccezioni che non è stato affermato. Così:

doStuff() 
self.assert_(True) 

Questo dovrebbe funzionare bene. Puoi omettere la chiamata self.assert_, poiché in realtà non fa nulla. Mi piace metterlo lì per documentare che non ho dimenticato un'affermazione.

+5

In questo modo il test non fallirà ma genererà un errore. L'approccio try/except citato nell'altra risposta è una risposta migliore secondo me. – tisto

21
def runTest(self): 
    try: 
     doStuff() 
    except: 
     self.fail("Encountered an unexpected exception.") 

UPDATE: Come liw.fi menzioni, il risultato di default è un successo, così l'esempio precedente è una specie di antipattern. Probabilmente dovresti usarlo solo se vuoi fare qualcosa di speciale prima di fallire. Dovresti anche prendere le eccezioni più specifiche possibili.

+0

Non essere pedante, ma Python usa provare ... eccetto, non provare ... intercettare –

+1

Grazie - il colpo di risposta "prima del caffè" colpisce ancora. –

+3

Questo ha lo svantaggio di perdere la traccia dello stack originale rendendo il test più difficile da eseguire il debug in caso di errore. – b4hand

6

Io uso questo schema per il tipo di affermazione che hai chiesto:

with self.assertRaises(Exception): 
    try: 
     doStuff() 
    except: 
     pass 
    else: 
     raise Exception 

fallirà esattamente quando viene sollevata un'eccezione per doStuff().

+0

Kosii: anche questa è una soluzione corretta? http://stackoverflow.com/a/4319870/6648326 – testerjoe2