给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例
判断是不是ipv4地址先要知道 ipv4 地址的格式:(1~255).(0~255).(0~255).(0~255)
从格式上看有3个点,分四个部分,第1部分范围是1~255, 后面3个部分是0~255
于是可以把字符串按.去切割,判断数字范围大小
''' 给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例 # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ ''' def check_ipv4(ip_str): """检查ipv4地址格式""" if not isinstance(ip_str, str): print("输入参数不合法,请输入字符串") return False if ip_str.count(".") != 3: return False else: ip_list = ip_str.split(".") print(ip_list) # 按点切割四个部分 # 校验每个部分的合法性,判断是不是数字 num1 = ip_list[0] try: n1 = int(num1) print("第1个数字:", n1) if n1 >=1 and n1 =0 and n2 <= 255: pass else: return False except: return False return True if __name__ == '__main__': result = check_ipv4("1.2.2.3") print(result)正则判断ipv4地址
也可以用正则表达式判断ipv4地址, 正则匹配代码会简单很多
先第一部分匹配1-255, 匹配有5种情况
- 1位数 1-9
- 2位数 10-99
- 3位数 100-199
- 3位数 200-249
- 3位数 250-255
于是正则表达式可以写成[1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]
后面3个数是从0-255,根上面的差不多,把1-9 改成 0-9 即可
import re # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ def check_ipv4_by_re(ip_str): """正则判断ipv4""" if not isinstance(ip_str, str): print("输入参数不合法,请输入字符串") return False compile_ipv4 = re.compile('^([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))(\\.([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))){3}$') if compile_ipv4.match(ip_str): return True else: return False if __name__ == '__main__': result2 = check_ipv4_by_re("255.0.2.3") print(result2)测试用例
什么是有效的ipv4地址?(baidu搜来的)
有效ipV4(第4版)地址的范围是1.0.0.0~254.255.255.254,由4节组成,每节取值范围0~255
但有一些地址是特殊的,不能算bai作”有效值“有效IP地址的范围是:网络地址+1~广播地址-1。
有效IP地址分为3类,分别是:
A类IP段 0.0.0.0 到127.255.255.255 (0段和127段不使用)。
B类IP段 128.0.0.0 到191.255.255.255
C类IP段 192.0.0.0 到223.255.255.255
如果仅仅是校验ipv4 地址的格式:(1~255).(0~255).(0~255).(0~255),用上面的代码就行了,如果要校验有效IP,还得排除掉无效的ip
测试用例设计
测试点 | 用户输入 | 期望结果 |
---|---|---|
非字符串 | 1234 | 输入不合法 False |
空字符 | "" | False |
格式不对 | abcdef | False |
格式不对 | 123.456 | False |
格式不对 | 1.2.3 | False |
第1位校验 | a.1.1.1 | False |
- | 0.1.1.1 | False |
- | 1.1.1.1 | True |
- | 9.1.1.1 | True |
- | 10.1.1.1 | True |
- | 99.1.1.1 | True |
- | 100.1.1.1 | True |
- | 199.1.1.1 | True |
- | 200.1.1.1 | True |
- | 250.1.1.1 | True |
- | 255.1.1.1 | True |
- | 256.1.1.1 | False |
- | 356.1.1.1 | False |
第2位校验 | 10.a.1.1 | False |
- | 10.0.1.1 | True |
- | 10.255.1.1 | True |
- | 10.256.1.1 | False |
- | 10.300.1.1 | False |
第3位校验 | 10.0.a.1 | False |
- | 10.0.0.1 | True |
- | 10.0.255.1 | True |
- | 10.0.256.1 | False |
- | 10.0.300.1 | False |
第4位校验 | 10.0.0.a | False |
- | 10.0.0.0 | True |
- | 10.0.0.255 | True |
- | 10.0.0.256 | False |
- | 10.0.0.300 | False |
用pytest框架测试上面的用例
import pytest # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ # 测试数据 test_data = [ [1234, False], ["", False], ["abcdef", False], ["123.456", False], ["1.2.3", False], ["a.1.1.1", False], ["0.1.1.1", False], ["1.1.1.1", True], ["9.1.1.1", True] ] @pytest.mark.parametrize("test_input, expected", test_data) def test_ip(test_input, expected): assert expected == check_ipv4_by_re(test_input)
用例太多,省略了一部分