Ho un metodo Python 2.7 che a volte chiama
sys.exit(1)
È possibile eseguire uno unit test che verifica che questa riga di codice venga chiamata quando vengono soddisfatte le condizioni giuste?
Ho un metodo Python 2.7 che a volte chiama
sys.exit(1)
È possibile eseguire uno unit test che verifica che questa riga di codice venga chiamata quando vengono soddisfatte le condizioni giuste?
Risposte:
Sì. sys.exit
solleva SystemExit
, quindi puoi verificarlo con assertRaises
:
with self.assertRaises(SystemExit):
your_method()
Le istanze di SystemExit
hanno un attributo code
che è impostato sullo stato di uscita proposto e il gestore contesto restituito da assertRaises
ha l'istanza di eccezione catturata come exception
, quindi controllare lo stato di uscita è facile:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception.code, 1)
Esci da Python. Questo viene implementato sollevando l'
SystemExit
eccezione ... è possibile intercettare il tentativo di uscita a un livello esterno.
sys.exit(1)
(al contrario, diciamo, sys.exit(0)
) devi effettivamente affermare che code
è 1. Immagino che potresti farlo con assertRaisesRegexp(SystemExit, '1')
?
unittest
metodo che ti consente di passare un'eccezione e un predicato richiamabile da eseguire sull'eccezione o sui suoi argomenti, piuttosto che solo un modello regex da eseguire sulla rappresentazione di stringa del suo primo arg ... ma immagino di no. C'è qualche altro modulo di test a cui sto pensando?
self.assertRaisesRegex( SystemExit, '^2$', testMethod )
meno codice, abbastanza leggibile.
self.assertRaisesRegexp
Ecco un esempio funzionante completo. Nonostante l'eccellente risposta di Pavel, mi ci è voluto un po 'per capirlo, quindi lo includo qui nella speranza che possa essere utile.
import unittest
from glf.logtype.grinder.mapping_reader import MapReader
INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"
class TestMapReader(unittest.TestCase):
def test_get_tx_names_incomplete_mapping_file(self):
map_reader = MapReader()
with self.assertRaises(SystemExit) as cm:
tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
self.assertEqual(cm.exception.code, 1)
Ho trovato la risposta alla tua domanda nella ricerca della documentazione di Python Unit Testing per "Testing for Exceptions". Usando il tuo esempio, lo unit test sarebbe simile al seguente:
self.assertRaises(SystemExit, your_function, argument 1, argument 2)
Ricorda di includere tutti gli argomenti necessari per testare la tua funzione.
Come nota aggiuntiva all'eccellente risposta di Pavel, puoi anche verificare gli stati specifici se sono forniti nella funzione che stai testando. Ad esempio, se your_method()
contenesse quanto segue sys.exit("Error")
sarebbe possibile testare specificamente per "Errore":
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception, "Error")