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