数据传输接口测试,Python解决数据筛选问题

2019-05-08   出处:V社 北京社  作/译者:神说要有光  

最近工作中有个数据传输接口需要测试,其中涉及到大量数据要处理。仔细观察发现,这些数据是有规律可循的,所以尝试使用自动化的方式解决数据筛选问题,从而提高测试效率。

业务需求

通过核对接口接收的数据条目数、是否等于接口传输条目数,验证数据接口传输相关的正确性。

前提条件

本接口是实时传输

接口每次传输的数据是全量数据

解决思路

因为是全量传输,所以需要根据传输时间对接收数据进行筛选

把接口当次传输的数据找出来,并进行数据条目求和计算

看接收数是否和传输数一致

笔者尝试用正则表达式与非正则两种方法解决此问题。


前期准备


首先,需要对接收的数据进行格式处理:

1、获取传输数据

通过开发给的接口URL,在网页上得到接口传输的数据信息。复制粘贴该页面所有数据到后缀为txt的文本文档中。

如图显示:

得到的接口传输的数据,并没有根据某个字段信息进行排序,所以数据显示没有什么规律性。

2、分析数据格式

数据样式如下:

原数据较长且比较复杂,不利于阅读和梳理思路,所以笔者精简了数据,只留下两条,并用红色框拆解出来数据的格式。

可以看出来,数据是按照json串的格式进行传输的。美化后,显示如下。看着就更清晰了。

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串后的数据类型

执行结果如下:

然后把得到的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))      #查看存放在新文档后的数据类型

执行结果如下:

4、获取所需的时间信息

时间信息是shelf_version字段,而该字段存在于data_dict字典中"data"这个key对应的value值里。

这个value值是一个列表,列表里嵌套了多个字典。所以要再次对数据进行处理,取出value值。

代码如下:

data = data_dict['data']

结果取出value列表(列表内容嵌套多个字典)。存放在新的文件newdata中,显示如下:

数据格式整理好之后,终于可以开始数据筛选工作了。

实现方法


一、非正则方法

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))

结果如下:

根据时间段筛选数据成功。

2、计算筛选出的数据条目

因为筛选出的数据类型为list,所以通过len函数就可以得到筛选结果的总数。(如果不是list格式,想必大家都知道可以用for循环或者count函数求合计值,达到一样的效果)

代码如下:

print("满足条数的数据:",len(list(filter(get_data,newdata))))

得出的数据,和传输的数据条目一致。此接口的传输是成功的。

二、正则表达式匹配方法

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文档、重新生成,否则执行代码时,调试的所有结果都会记录在这个文档中,会造成代码错误的误导。

执行结果如下:

根据时间段筛选数据成功,筛选出的是2019-03-21 10点至12点之间的数据。

2、计算筛选出的数据条目

如果想要计算匹配成功的条目数,可以用一个变量count,每次写入文档的时候,计数加一。(此处代码相信大家都会,略过)

得出的数据,和传输的数据条目一致。与第一种方法计算出的合计值相同,正则匹配方法成功。

由于是新手,可能实现方法有点复杂,还请大神们有更好的筛选方法,能不吝赐教,在评论区留言。欢迎批评指正。


欢迎给测试窝投稿或参与内容翻译工作,请邮件至editors@testwo.com。也欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,并与我们的编辑和其他窝友交流。
139°|1393 人阅读|0 条评论

登录 后发表评论