È 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.