У меня есть следующая функция с модульными тестами:
#!/usr/bin/env python3
# https://docs.python.org/3/library/ipaddress.html
# https://docs.python.org/3.4/library/unittest.html
import ipaddress
import unittest
from unittest.mock import patch
from unittest import TestCase
def validate_IP():
"""Prompt user for IPv4 address, then validate."""
while True:
try:
return ipaddress.IPv4Address(input('Enter a valid IPv4 address: '))
except ValueError:
print('Bad value, try again.')
class validate_IP_Test(unittest.TestCase):
@patch('builtins.input', return_value='192.168.1.1')
def test_validate_IP_01(self, input):
self.assertIsInstance(validate_IP(), ipaddress.IPv4Address)
@patch('builtins.input', return_value='10.0.0.1')
def test_validate_IP_02(self, input):
self.assertIsInstance(validate_IP(), ipaddress.IPv4Address)
@patch('builtins.input', return_value='Derp!')
def test_validate_IP_03(self, input):
self.assertRaises(ValueError, msg=none)
if __name__ == '__main__':
unittest.main()
Функция использует модуль ipaddress
в Python3 для проверки ввода пользователя, т. е. проверяет, что ввод пользователя является фактическим IPv4 address
. Мои первые два теста работают, как и ожидалось. Однако я не совсем понимаю, как проверить недопустимый ввод с помощью модуля Python3 unittest
для части исключения функции, как в третьем тесте.
Когда вводится неверный ввод, тест должен распознать, что было создано исключение, и пройти тест. Для справки, вот соответствующий вывод интерпретатора, когда я ввожу неверный адрес:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File
raise AddressValueError("Expected 4 octets in %r" % ip_str)
ipaddress.AddressValueError: Expected 4 octets in 'derp'`