我们都知道IP地址组成为:(1~255).(0~255).(0~255).(0~255)
![b09afe5c0a68960a142381182806ac04.png](https://i-blog.csdnimg.cn/blog_migrate/d08888b082ec1d9fd69b6bef914e5aaf.png)
那么这道面试题个人认为很经典,既考察了求职者的写用例水平又考察了软件测试求职者的编码水平。
看似没有头绪的题目,其实静下心来,边写代码边写用例,不知不觉就完成了这道题目的解答,下来我对题目进行拆解。
![8f1395c46d94e11b3da290249dfb6a19.png](https://i-blog.csdnimg.cn/blog_migrate/6fbb61015a0a55a75060f82930a188d7.png)
首先我们都知道写用例第一步,按照正常人的思维先肯定想到正向的用例,对应的用例为:
![e210dea749cfc73acaa8da9c72fa846d.png](https://i-blog.csdnimg.cn/blog_migrate/d2efa28da0a38be571eec722a4f4ef5d.png)
之后考虑输入为空的情况:
![bd98a99f44392c5429b5508cb17b13e2.png](https://i-blog.csdnimg.cn/blog_migrate/a8d8c948cd5c1d3fa0ffe0c8d68defef.png)
对应的代码片段为:
![4d8b964fca892570724472d4621efd9c.png](https://i-blog.csdnimg.cn/blog_migrate/78e4877c5c725deeaf9826ae44e8cef2.png)
下来再考虑IP肯定在7~15位(最小的1.1.1.1,最大的255.255.255.255)正常情况已经包括了
那么,作为测试人员,考虑小于7位以及7的边界值的情况:
![066ce886b79c04b743a6244476214496.png](https://i-blog.csdnimg.cn/blog_migrate/75a13063a0a9d430327247292cd73f82.jpeg)
对应的代码片段为:
![2a5e9b93de2d059ae3fb52b06f0abad3.png](https://i-blog.csdnimg.cn/blog_migrate/a686bf045145021acbe5abbed5f90e54.png)
下来考虑的是大于15位以及15位左右情况
![2804f964c499a3580ac0ecbb3470ea8c.png](https://i-blog.csdnimg.cn/blog_migrate/1c108e4424df25dfd60d854b159e42af.jpeg)
对应的代码片段
![c482ee7a9016bffcc5de406ad96824ed.png](https://i-blog.csdnimg.cn/blog_migrate/58049acb31c9684c820fbae3ff2f84c2.png)
再考虑首尾不能以.结尾
![3145474b48a8a8ca875251ceb6e38e29.png](https://i-blog.csdnimg.cn/blog_migrate/37b0c64a131c4551b9713d223e324349.png)
对应的代码片段为:
![f2a3439807d0015fe085b74b4ba4144b.png](https://i-blog.csdnimg.cn/blog_migrate/0e7c286a0a7b45735b95c0e7b179c2a7.png)
我们都知道ip地址固定有4个".",并且按"."分割之后每隔分割的字符,不能以'0'开头,且按"."分割之后必须在0-255
对应的用例为:
![3720746a05c520d05bceeaa550527fcb.png](https://i-blog.csdnimg.cn/blog_migrate/6ee06ea70820226423e04c7b3d2db3c7.jpeg)
对应的代码片段为:
![a068e81980881113fd6abd212eaa72a6.png](https://i-blog.csdnimg.cn/blog_migrate/56e7bf555211c6d5023d09f1247bcf26.png)
当然,需要检查每一个分割出来的字符都是在0-9之间:
![52597c5d8bc1d5e760c6235bbd4e5121.png](https://i-blog.csdnimg.cn/blog_migrate/2cc221001a4e3aad1bffbf80aa6f30a7.jpeg)
这里面还有输入其他的情况会导致转换异常,因此,本人用异常,把异常try except
时间有限,部分完整的用例如下:
![567f336a47cb8e8afbeb2733f4116a8d.png](https://i-blog.csdnimg.cn/blog_migrate/90166f937b8467470aa8f2d7cc70b72c.jpeg)
![e8700180ad215e7bccda1d8e896e72bd.png](https://i-blog.csdnimg.cn/blog_migrate/71e943b46c63384a0f2da7e261c0fe58.jpeg)
有时间各位童鞋可以完善用例,代码整个如下:
![6df6414e8d327def22d12c3eb916c8af.png](https://i-blog.csdnimg.cn/blog_migrate/cc6438e3b5efda42775a4ba837cd12ef.jpeg)
当然,还有一种比较简单的方法就是使用正则表达式,一般遇到ip地址和邮箱电话等等,我们也可以优先考虑正则表达式
![d3021129ba7d9f9ccaa264edfd67bcf1.png](https://i-blog.csdnimg.cn/blog_migrate/8891fc516958425aa9940f6e8eb91f6d.jpeg)
import re
def isIpAdress(IpStr):
flag = True
try:
if IpStr == '':#'IP地址不能为空'
flag = False
if len(IpStr)<7:#'IP地址至少为7位'
flag = False
if len(IpStr)>15:#'IP地址最长位15位'
flag = False
if IpStr[0]=='.':#对输入字符串的首字符判断,如果是"."则是非法IP
flag = False
if IpStr[-1]=='.':#对输入字符串的末字符判断,如果是"."则是非法IP
flag = False
arr = IpStr.split('.')
if len(arr)!=4:#按"."分割字符串,并判断分割出来的个数,如果不是4个,则是非法IP
flag = False
for item in arr:
if len(item)>0 and item[0]=='0':#如果每个字符串不是一位字符,且以'0'开头,则是非法的IP,如:01.02.03.004
flag = False
for num in item:
if num<'0' and num >'9':#对每个字符串的每个字符进行逐一判断,如果不是数字0-9,则是非法的IP
flag = False
break
if int(item)<0 or int(item)>255:
flag = False
break
except:
flag = False
return flag
def isIpAdress2(IpStr):
reg = "^([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 (re.match(reg,IpStr)):
return True
else:
return False
if __name__ == '__main__':
s = input("请输入IP地址,格式参考(1~255).(0~255).(0~255).(0~255):")
if isIpAdress(s):
print("IP地址有效")
else:
print("无效的IP地址")
if isIpAdress2(s):
print("IP地址有效")
else:
print("无效的IP地址")