È possibile che uno unit test asserisca che un metodo chiama sys.exit ()


Risposte:


155

Sì. sys.exitsolleva SystemExit, quindi puoi verificarlo con assertRaises:

with self.assertRaises(SystemExit):
    your_method()

Le istanze di SystemExithanno un attributo codeche è impostato sullo stato di uscita proposto e il gestore contesto restituito da assertRaisesha 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)

 

Documentazione sys.exit :

Esci da Python. Questo viene implementato sollevando l' SystemExiteccezione ... è possibile intercettare il tentativo di uscita a un livello esterno.


3
+1, tranne per il fatto che se vuole verificare che chiama sys.exit(1)(al contrario, diciamo, sys.exit(0)) devi effettivamente affermare che codeè 1. Immagino che potresti farlo con assertRaisesRegexp(SystemExit, '1')?
abarnert

Ero sicuro che esistesse un unittestmetodo 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?
abarnert

1
+1, poiché per controllare il codice di errore è molto più semplice fare solo: self.assertRaisesRegex( SystemExit, '^2$', testMethod ) meno codice, abbastanza leggibile.
Marek Lewandowski

1
@MarekLewandowski - errore di battitura. Deve essereself.assertRaisesRegexp
Evgen

12

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)

3

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.


1

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")
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.