資料傳輸介面測試,Python解決資料篩選問題
最近工作中有個資料傳輸介面需要測試, 其中涉及到大量資料要處理。仔細觀察發現,這些資料是有規律可循的,所以嘗試使用自動化的方式解決資料篩選問題,從而提高測試效率。
業務需求通過核對介面接收的資料條目數、是否等於介面傳輸條目數, 驗證 資料介面 傳輸相關 的正確性。
前提條件本介面是實時傳輸
介面每次傳輸的資料是全量資料
解決思路因為是全量傳輸,所以需要根據傳輸時間對接收資料進行篩選
把介面當次傳輸的資料找出來,並進行資料條目求和計算
看接收數是否和傳輸數一致
筆者嘗試用正則表示式與非正則兩種方法解決此問題。
前期準備首先,需要對接收的資料進行格式處理:
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,每次寫入文件的時候,計數加一。(此處程式碼相信大家都會,略過)
得出的資料,和傳輸的資料條目一致。與第一種方法計算出的合計值相同,正則匹配方法成功。
由於是新手,可能實現方法有點複雜,還請大神們有更好的篩選方法,能不吝賜教,在評論區留言。歡迎批評指正。