最近工作中有个数据传输接口需要测试, 其中涉及到大量数据要处理。仔细观察发现,这些数据是有规律可循的,所以尝试使用自动化的方式解决数据筛选问题,从而提高测试效率。
业务需求通过核对接口接收的数据条目数、是否等于接口传输条目数, 验证 数据接口 传输相关 的正确性。
前提条件本接口是实时传输
接口每次传输的数据是全量数据
解决思路 因为是全量传输,所以需要根据传输时间对接收数据进行筛选
把接口当次传输的数据找出来,并进行数据条目求和计算
看接收数是否和传输数一致
笔者尝试用正则表达式与非正则两种方法解决此问题。
Python学习交流群:1004391443,这里是python学习者聚集地,有大牛答疑,有资源共享!小编也准备了一份python学习资料,有想学习python编程的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。
前期准备首先,需要对接收的数据进行格式处理:
1、获取传输数据
通过开发给的接口URL,在网页上得到接口传输的数据信息。复制粘贴该页面所有数据到后缀为txt的文本文档中。
如图显示:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621886" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
得到的接口传输的数据,并没有根据某个字段信息进行排序,所以数据显示没有什么规律性。
2、分析数据格式
数据样式如下:
原数据较长且比较复杂,不利于阅读和梳理思路,所以笔者精简了数据,只留下两条,并用红色框拆解出来数据的格式。
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621890" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
可以看出来,数据是按照json串的格式进行传输的。美化后,显示如下。看着就更清晰了。
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621896" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
3、拆解数据,把源数据变成python中的字典数据类型
将json串转换成dict类型,需要引入一个json包
使用包中的json.loads的方法,将数据转化成dict类型。代码如下:
import json
withopen("e:\test\sourcedata.txt",encoding="utf-8") as fp:
content = fp.read()
print(type(content)) #查看读取json串后的数据类型
data_dict = json.loads(content)
print(type(data_dict)) #查看处理json串后的数据类型
执行结果如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621899" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
然后把得到的data_dict存放到新的文档loadsdata.txt中,代码如下:
with open("e:\test\loadsdata.txt",'w',encoding="utf-8")as fp2:
fp2.write(str(data_dict))
print(type(data_dict)) #查看存放在新文档后的数据类型
执行结果如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621902" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
4、获取所需的时间信息
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621906" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
时间信息是shelf_version字段,而该字段存在于data_dict字典中"data"这个key对应的value值里。
这个value值是一个列表,列表里嵌套了多个字典。所以要再次对数据进行处理,取出value值。
代码如下:
data = data_dict['data']
结果取出value列表(列表内容嵌套多个字典)。存放在新的文件newdata中,显示如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621910" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
数据格式整理好之后,终于可以开始数据筛选工作了。
实现方法
一、非正则方法
1、日期比对
笔者只想查找2019-03-21这一天的10点-12点的时间段内,总共传输过来多少条数据。
定义一个函数,用来筛选符合条件的日期。
代码如下:
def get_data(x):
if x['shelf_version'] >'2019-03-21 10:00' and x['shelf_version']<'2019-03-21 12:00' :
return x
使用filter函数,对newdata中的数据进行筛选,并把结果存放在新的list里,然后记录在result结果文件中,代码如下:
result=list(filter(get_data,newdata))
print(result)
withopen("e:\test\result.txt",'w',encoding="utf-8") as fp1:
fp1.write(str(result))
结果如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621916" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
根据时间段筛选数据成功。
2、计算筛选出的数据条目
因为筛选出的数据类型为list,所以通过len函数就可以得到筛选结果的总数。(如果不是list格式,想必大家都知道可以用for循环或者count函数求合计值,达到一样的效果)
代码如下:
print("满足条数的数据:",len(list(filter(get_data,newdata))))
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621920" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
得出的数据,和传输的数据条目一致。此接口的传输是成功的。
二、正则表达式匹配方法
1、日期比对
列表中嵌套的每个字典中都有一个’shelf_version’字段(也就是想获取的时间信息字段),使用for循环,循环取出。循环次数是newdata列表长度。
代码如下:
for i in range(len(newdata)):
date=newdata[i]['shelf_version']
每次循环取出时间的时候,使用正则表达式进行时间比对。需要进行判断,匹配成功的,才能写入结果文档中。
正则表达式如下(两种都可以,在for循环内部执行):
mt = re.findall(r"2019-03-21 1[0-1]:.*",date)
mt =re.findall(r"2019-03-21 1[0-1]:\d{2}:\d{2}",date)
匹配的是2019-03-21 10点至12点之间的数据。
写入结果文档代码如下(在for循环内部执行):
if date in mt:
withopen("e:\test\result.txt",'a',encoding="utf-8") as fp1:
fp1.write(str(mt))
print(mt)
此处需要注意,由于是放在for循环中,多次打开文档,所以打开文档写入模式,应该是“a”追加写。否则每次只能保存一个数据比对结果。
并且,调试程序的时候,应该每次执行前都删掉result.txt文档、重新生成,否则执行代码时,调试的所有结果都会记录在这个文档中,会造成代码错误的误导。
执行结果如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621929" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
根据时间段筛选数据成功,筛选出的是2019-03-21 10点至12点之间的数据。
2、计算筛选出的数据条目
如果想要计算匹配成功的条目数,可以用一个变量count,每次写入文档的时候,计数加一。(此处代码相信大家都会,略过)
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1557300621932" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;">[图片上传失败...(image-6ff6a6-1557300637451)]
<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
得出的数据,和传输的数据条目一致。与第一种方法计算出的合计值相同,正则匹配方法成功。
由于是新手,可能实现方法有点复杂,还请大神们有更好的筛选方法,能不吝赐教,在评论区留言。欢迎批评指正。
网友评论