Возможно ли, чтобы unit test утверждал, что метод вызывает sys.exit()
У меня есть метод python 2.7, который иногда вызывает
sys.exit(1)
Можно ли сделать unit test, который проверяет, что эта строка кода вызывается при выполнении правильных условий?
Ответы
Ответ 1
Да. sys.exit
вызывает SystemExit
, поэтому вы можете проверить его с помощью assertRaises
:
with self.assertRaises(SystemExit):
your_method()
У экземпляров SystemExit
есть атрибут code
, который настроен на предлагаемый статус выхода, а менеджер контекста, возвращенный assertRaises
, имеет экземпляр исключенного исключения как exception
, поэтому проверка состояния выхода проста:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception.code, 1)
sys.exit Документация:
Выход из Python. Это реализуется путем создания исключения SystemExit
... можно перехватить попытку выхода на внешнем уровне.
Ответ 2
Вот полный рабочий пример. Несмотря на отличный ответ Павлу, мне потребовалось некоторое время, чтобы понять это, поэтому я включаю его здесь в надежде, что это будет полезно.
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
В качестве дополнительной заметки к Великому ответу Павла вы также можете проверить определенные статусы, если они предоставлены в тестируемой функции. Например, если your_method()
содержит следующее sys.exit("Error")
, можно было бы проверить для "Ошибка" конкретно:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception, "Error")
Ответ 4
Я нашел ответ на ваш вопрос в Документации по тестированию модулей Python, чтобы найти "Тестирование для исключений". Используя ваш пример, unit test будет выглядеть следующим образом:
self.assertRaises(SystemExit, your_function, argument 1, argument 2)
Не забудьте включить все аргументы, необходимые для проверки вашей функции.