pruebas integracion python unit-testing

python - integracion - ¿Es posible que una prueba de unidad afirme que un método llama a sys.exit()



pruebas de integracion python (4)

Aquí hay un ejemplo completo de trabajo. A pesar de la excelente respuesta de Pavel, me tomó un tiempo darme cuenta de esto, así que lo incluyo aquí con la esperanza de que sea útil.

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)

Tengo un método de python 2.7 que a veces llama

sys.exit(1)

¿Es posible realizar una prueba unitaria que verifica que se llame a esta línea de código cuando se cumplen las condiciones adecuadas?


Como nota adicional a la excelente respuesta de Pavel, también puede verificar si hay estados específicos en la función que está probando. Por ejemplo, si your_method() contiene el siguiente sys.exit("Error") , sería posible probar específicamente el "Error":

with self.assertRaises(SystemExit) as cm: your_method() self.assertEqual(cm.exception, "Error")


Encontré la respuesta a su pregunta en la búsqueda de la documentación de Pyong Unit Testing para "Probar excepciones". Usando su ejemplo, la prueba de la unidad se vería como la siguiente:

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

Recuerde incluir todos los argumentos necesarios para probar su función.


Sí. sys.exit genera SystemExit , por lo que puede verificarlo con assertRaises :

with self.assertRaises(SystemExit): your_method()

Las instancias de SystemExit tienen un code atributo que se establece en el estado de salida propuesto, y el administrador de contexto devuelto por assertRaises tiene la excepción de excepción capturada, por lo que es fácil verificar el estado de salida:

with self.assertRaises(SystemExit) as cm: your_method() self.assertEqual(cm.exception.code, 1)

sys.exit Documentación :

Salir de Python. Esto se implementa levantando la excepción SystemExit ... es posible interceptar el intento de salida en un nivel externo.