Можно ли для модульного теста утверждать, что метод вызывает sys.выход()


У меня есть метод python 2.7, который иногда вызывает

sys.exit(1) 

можно ли сделать модульный тест, который проверяет этот код вызывается, когда все условия выполнены?

4 64

4 ответа:

да. 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.выход из документации:

выход из 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 поиск "тестирование на исключения". Используя Ваш пример, модульный тест будет выглядеть следующим образом:

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

Не забудьте включить все аргументы, необходимые для проверки функции.