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