基於python的Json容錯數據自動化輸出

2022-01-10 搜狗測試

測試工作中往往需要對服務端所返回的Json數據做容錯,即需要確保原數據中各項值被替換成異常數據類型時,相關數據傳輸與處理系統不會發生報錯、崩潰等問題。

若手動編寫容錯數據,小編認為有以下兩點弊端:

1. 繁瑣操作帶來的人力、時間成本消耗;

2. 可能因數據繁多而導致疏漏;

因此希望實現能夠根據待測試Json數據,一鍵輸出全部相關容錯數據文件的腳本。

開始代碼實現之前希望能夠明確思路,小編經過思考,確立腳本實現環節如下:

1. 獲取key

獲取Json中所有需做數據替換處理的元素標識(如Json對象中的各個key);    

2. 定位value

根據獲取到的標識,定位到需修改的值(如key對應的value);

3. 替換與輸出

將每個值進行數據替換並輸出為各式容錯數據文件。


1. 獲取key

以這樣一份基本包含各式數據的Json為例:

{  "testDict":{  "testDict_1_string":"1_value",  "testDict_2_int":1,  "testDict_3_bollen":false,  "testDict_4_list":["4_value",1],  "testDict_5_null":null,  "testDict_6_dict":{"6_key":{"6_key_1":"6_value_1"}, "6_list":["test_list"]},  "testDict_7_complex":[    {      "id":"10000",      "testA":{"A":"A_value"},      "testB":["B1","B2"]      },      {        "id":"10001",      "testC":{"C":"C_value"},      "testRepeat":"R_value"      },      ["testX", "testY", {"testRepeat":"testRepeat"}],      ["test_list_2"],      "7_value"    ],  "testRepeat":"R_value"  },  "testRepeat":"R_value",  "test_extra":["test_extra_value"]}

小編嘗試通過對其進行遞歸處理進行key的獲取,並輔以這樣幾點思考:

1. 針對數據中字典形式的json對象、列表形式的json數組,需不同的處理方法;

2. 為避免重複key混淆,需使用數據鏈路結構進行區分,如「父級key—子級key—子級key」;

3. 為避免鏈路結構同key產生混淆,需使用特殊符號進行層級連結。

4. 為避免多重數組導致數據鏈路結構重複,需額外添加」inlist」標識。

代碼如下:

def getKeyFromJsonFile(dic_json, keylist, keyParent=None, isChild=False, listInlist=False):    if isinstance(dic_json, dict):    for key in dic_json:            if isinstance(dic_json[key], dict):                if isChild:          key = keyParent + '-*-' + key        keylist.append(key)        getKeyFromJsonFile(dic_json[key.split('-*-')[-1]], keylist, keyParent=key, isChild=True, listInlist=False)      elif isinstance(dic_json[key], list):        if isChild:          key = keyParent + '-*-' + key        keylist.append(key)        for i in dic_json[key.split('-*-')[-1]]:          getKeyFromJsonFile(i, keylist, keyParent=key, isChild=True, listInlist=False)      else:                        if listInlist:          key = key + '_*inlist'        if isChild:          key = keyParent + '-*-' + key        keylist.append(key)    if isChild and isinstance(dic_json, list):    for i in dic_json:      getKeyFromJsonFile(i, keylist, keyParent=keyParent, isChild=True, listInlist=True)

2. 定位value

小編嘗試將每個key值以連結符號-*-進行分割為列表,並於Json數據中逐級進行找尋、定位,此時對這樣兩種情況進行了考慮。

若key值對應的value類型並非列表,則位於鏈路末端的key值對應的value即是需要修改的值:

def getValue(slist, data_next):    for j in range(0 ,len(slist)):        if isinstance(data_next[slist[j]], list):      return        if j == len(slist)-1:            value = data_next[slist[j]]      return        data_next = data_next[slist[j]]

而列表內元素無法根據key值定位,直接定位到列表後續進行遍歷即可:

def getValueFromList(data_list, key_list):    if isinstance(data_list, dict):    for key in key_list:            if key in data_list.keys() and key == key_list[-1]:                value = data_list[key]                if isinstance(data_list[key], list):                    value = data_list[key]        return            elif key in data_list.keys():        getValueFromList(data_list[key], key_list)

二者結合,則getValue方法內列表相關邏輯應是:

if isinstance(data_next[slist[j]], list):  # 當前key無子節點  if j == len(slist)-1:    # 得到需要遍歷其內元素進行修改的目標列表    value = data_next[slist[j]]  # 截取後續子節點在列表中進行遞歸  else:    for datas in data_next[slist[j]]:      tlist = slist[j+1:]      getValueFromList(datas, tlist)  return

針對列表處理方法getValueFromList,小編還進行了以下補充(此處代碼不再贅述):

1. 針對列表中包含列表,需添加判斷isinstance(data_list, list)繼續遞歸處理;

2. 針對添加了inlist的列表標識,需進行字符串分割後再去遍歷取值。

3. 替換與輸出

通過遍歷預設的測試數據列表即可對需要修改的值進行替換,列表示例如下:

null = Nonefalse = Falsetype_list = ["testString", 1, false, null, ["test_list"], {"test_dict":"test_dict_value"}]

修改後的數據指向的仍是原待測試Json數據(需要在每次修改、輸出文件後進行數據還原),直接將其寫入文件即可——將以容錯類型命名的每組數據存入以數據鏈路key值命名創建的文件夾內(避免輸出相同結構的重複數據):

with open(path, "w") as f:  json.dump(data, f, sort_keys=True, indent=4, ensure_ascii=False)

此外,預設(如Json數據中不存在這一key)同樣是一種常規的數據容錯方式,可使用pop()方法操作字典、列表對相應值進行刪除予以實現。

綜上,運行腳本可得容錯文件如圖——針對需要替換的值,每組容錯數據包含int、string、bool等數據類型及數據預設:

打開任一文件,如圖中...-testA-*-A_int.json,可見原數據中相應值已被替換成了預設值:

"testDict_7_complex": [            {                "id": "10000",                "testA": {                    "A": 1                },

至此,一鍵自動化輸出Json容錯數據文件的目的便達成了。感謝閱讀,歡迎交流。

基於python的測試報告自動化生成

搜狗測試微信號:Qa_xiaoming

搜狗測試QQ粉絲群:459645679

相關焦點

  • 13-python爬蟲之JSON操作
    JSONJSON(JavaScript Object Notation) 是一種輕量級的數據交換格式;適用於進行數據交互的場景,比如網站前臺與後臺之間的數據交互Python 3.x中自帶了JSON模塊,直接import json就可以使用了。
  • python3爬蟲(3)--解析json數據
    環境:python3前言:在做數據採集的過程中,我們經常遇到json格式的數據,如有道翻譯就是
  • 自動化測試Python處理Excel小技巧,建議收藏
    「在自動化測試,尤其是接口自動化測試中,我們經常使用Excel做為數據驅動,那麼如何快速的操作Excel呢?":"1234","username":mrjade"}\n}', '200', 'json')]    # 遍歷數組(excel行數據)    for i in range(len(testdata)):        print(testdata[i])        # 遍歷數組中的元組(行單元格數據)        for j in range(len
  • 3招Python 處理CSV、JSON和XML數據的簡便方法!
    Python的卓越靈活性和易用性使其成為最受歡迎的程式語言之一,尤其是對於數據處理和機器學習方面來說,其強大的數據處理庫和算法庫使得python成為入門數據科學的首選語言。在日常使用中,CSV,JSON和XML三種數據格式佔據主導地位。下面我將針對三種數據格式來分享其快速處理的方法。CSV是存儲數據的最常用方法。在Kaggle比賽的大部分數據都是以這種方式存儲的。
  • Spark for python developers —Spark流式數據處理
    根據微型批處理設置的時間窗口,將流入的數據記錄緩衝到一個容器中。
Spark Streaming 經常用來與 Storm 比較,這是兩種不同的流數據模型。 Spark Streaming 基於微型批處理,而 Storm 基於及時處理流入的數據。 Storm 也提供了微型批處理選項 即 Storm Triden。流處理應用的主要驅動因素的時間延遲。
  • 【Python教程】pypal數據可視化
    利用雷達圖分析了一下周圍餐廳的評分例子五:可視化展示世界人口地圖(處理json數據)例子六:利用github提供的接口,呈現GitHub上Python項目的受歡迎程度(使用Web API分析數據)實例五可視化展示世界人口地圖(處理json數據) 需要用到人口數據 population.json, 它是json數據表示的。在鯨魚的源碼倉庫 data文件夾可以找到
  • 【Python教程】pygal數據可視化
    有的時候,實現題目的要求很簡單,甚至參考資料裡就有,但是背後的思考和親手去實踐卻是任務最關鍵的一部分。在學習這些資料時,要多思考,多提問,多質疑。相信通過和小夥伴們的交流,能讓你的學習事半功倍。= '餐廳評分數據'radar_chart.x_labels = ['味道', '衛生', '服務', '價格', '環境']radar_chart.add('老王炸雞', [9, 6, 6, 4, 7])radar_chart.add('小明快餐', [7, 8, 9, 6, 8])radar_chart.add('阿強燒烤', [10, 4, 6, 8, 4])radar_chart.add(
  • Python+requests接口自動化測試框架實例詳解教程
    ,使用的是java語言,但對於一個學java,卻在學python的我來說,覺得python比起java更簡單些。所以,我決定自己寫python的接口自動化測試框架,由於本人也是剛學習python,這套自動化框架目前已經基本完成了,於是進行一些總結,便於以後回顧溫習,有許多不完善的地方,也遇到了許多的問題,希望大神們多多指教。下面我就進行今天的主要內容吧。(初學者的成功之路,哈哈哈~~)正常的接口測試流程是什麼?
  • 基於Selenium的Grafana自動化截圖工具
    圖一 Grafana可視化監控數據樣例Grafana可視化工具強大,同時也具有分享和截圖的功能,但是其Snapshot的截圖均保存於線上,對於查看歷史相關監控圖表不是很方便,因此本人萌生了做一個自動化小工具的想法。
  • 資源 | Parris:機器學習算法自動化訓練工具
    Parris 是一個自動化訓練機器學習算法的工具。
  • Python函數耗時異常自動化監控!
    在做Python性能分析優化的時候,可以藉助cProfile生成性能數據文件,通過pstats獲取詳細耗時分布數據,結合gprof2dot腳本生成函數調用棧結構圖做可視化分析,提高性能分析的效率。接著從具體的耗時分布,先從佔用大頭的函數分析具體邏輯實現,逐步優化,同時保存pstats函數耗時平均值數據作為後續異常自動化監控的樣本數據。
  • Python數據分析實戰案例:統計分析微信朋友圈數據(附實操視頻)
    ', 'w')f.write(json.dumps(post_moment_rank))f.close()列印輸出發送朋友圈信息最多的前5位數據,具體實現代碼如下所示。', 'w')f.write(json.dumps(received_like_rank))f.close()列印輸出前5位獲得最多贊的用戶信息,具體實現代碼如下所示。
  • 【Mind+Python】基於Pyecharts+Flask+Pinpong智能家居數字大屏系統
    本教程將會帶領你從零開始搭建一個:基於Pyecharts + Flask + Pinpong 智能家居數字大屏系統的項目!當數據分析遇上數據可視化時,pyecharts 誕生了。方法一:在mind+的python模式下:點擊「庫管理」→"圖表"→"pyecharts"點擊安裝即可!
  • Unity 基於excel2json批處理讀取Excel表並反序列化
    excel2json是一款將Excel表格文件快速生成json和C#數據類的高效插件,詳情了解如下:https://neil3d.github.io
  • [數據類型] golang 筆記 string/int/array/map/slice/point/json
    fmt.Println(MyArray)}輸出結果:>go run go-array.go[1 2 3]基本數據結構 map// filename go-map.gopackage mainimport "fmt"func main() {
  • Appium+python自動化22-Android夜神模擬器
    一、環境安裝1.官網下載地址:[https://www.yeshen.com/](https://www.yeshen.com/)2.夜神安卓模擬器(夜神模擬器),是全新一代的安卓模擬器,與傳統安卓模擬器相比,**基於android4.4.2**,兼容X86/AMD,在性能、穩定性、兼容性等方面有著巨大優勢3.安裝時候選擇指定的文件夾路徑
  • 手把手教你用 Flask,Docker 和 Kubernetes 部署Python機器學習模型(附代碼)
    將機器學習(ML)模型部署到生產環境中的一個常見模式是將這些模型作為 RESTful API 微服務公開,這些微服務從 Docker 容器中託管,例如使用 SciKit Learn 或 Keras 包訓練的 ML 模型,這些模型可以提供對新數據的預測。然後,可以將它們部署到雲環境中,以處理維護連續可用性所需的所有事情,例如容錯、自動縮放、負載平衡和滾動服務更新。
  • 基於yolo5工地安全帽和禁入危險區域識別系統,附數據集
    AI項目體驗地址 https://loveai.tech創建自己的數據集配置文件因為我這裡只是判斷 【人沒有帶安全帽】、【人有帶安全帽】、【人體】 3個類別 ,基於 data/coco128.yaml 文件,創建自己的數據集配置文件 custom_data.yaml
  • python的輸入與輸出
    如果文件已存在就報錯),a(追加),b(二進位文件),t(文本文件),+(更新,讀寫)open函數默認打開模式為rt,即文本讀取模式文件操作非常容易出異常,需要進行異常處理文件的打開、寫入、讀取和關閉with語句和上下文管理協議為了簡化操作,python
  • Python輸出簡潔美觀的文本化表格
    四、添加數據prettytable提供了多種的添加數據的方式,最常用的應該就是按行按列添加數據了。A、按行添加數據 table.add_row在上面簡單的示例中,我們就是按行添加數據的。添加的數據必須要是列表的形式,而且數據的列表長度要和表頭的長度一樣。在實際的使用中,我們應該要關注到添加的數據是否和表頭對應,這一點很重要。B、按列添加數據 table.add_column()看下面的示例:#!