【发布时间】:2020-01-18 13:56:33
【问题描述】:
我有以下单元测试功能:
#!/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()
该函数使用 Python3 中的 ipaddress 模块来验证用户输入,即检查用户输入是否为实际的 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'`
【问题讨论】:
-
无效输入的可见行为是请求了新输入。它是通过捕获异常来完成的,这是一个实现细节,您应该能够在不破坏测试的情况下进行更改。
标签: python unit-testing ip-address try-except