У мене є метод 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
має зловлений екземпляр винятку як 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")