最近工作中有个数据传输接口需要测试,
业务需求:
通过核对接口接收的数据条目数、是否等于接口传输条目数,印证数据接口的正确性。
前提条件:
本接口是实时传输。
接口每次传输的数据是全量数据。
解决方法:
因为是全量传输,所以需要根据传输时间对接收数据进行筛选,
把接口当次传输的数据找出来,并进行数据条目求和计算。
看接收数是否和传输数一致。
笔者尝试用非正则、正则表达式两种方法分别解决此问题。
首先,需要对接收的数据进行格式处理:
1、 获取传输数据
通过开发给的接口URL,在网页上得到接口传输的数据信息。复制粘贴该页面所有数据到后缀为txt的文本文档中。
如图显示:
得到的接口传输的数据,并没有根据某个字段信息进行排序,所以数据显示没有什么规律性。
2、 分析数据格式
数据样式如下:
原数据较长且比较复杂,不利于阅读和梳理思路,所以笔者精简了数据,只留下两条,并用红色框拆解出来数据的格式。
可以看出来,数据是按照json串的格式进行传输的。美化后,显示如下。看着就更清晰了。
3、 拆解数据,把源数据变成python中的字典数据类型
将json串转换成dict类型,需要引入一个json包
使用包中的json.loads的方法,将数据转化成dict类型。代码如下:
import json
with open("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)
with open("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['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:
with open("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,每次写入文档的时候,计数加一。(此处代码相信大家都会,略过)
得出的数据,和传输的数据条目一致。与第一种方法计算出的合计值相同,正则匹配方法成功。
由于是新手,可能实现方法有点复杂,还请大神们有更好的筛选方法,能不吝赐教,在评论区留言。欢迎批评指正。 |