欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析Python中的JSON比較

 更新時間:2023年09月18日 09:28:49   作者:郝同學的測開筆記  
進行接口自動化時,有時候我們需要斷言的數據比較多,一個字段一個字段進行斷言比較麻煩,那么如何利用Python實現輕松判斷數據格式是否相同呢,下面小編就為大家詳細講講

前言

進行接口自動化時,有時候我們需要斷言的數據比較多,一個字段一個字段進行斷言比較麻煩,如果可以直接斷言整個響應結果,豈不美哉,那該如何實現該功能呢?

遞歸

在進入正式實現前,我們先簡單說一下遞歸。因為該功能我們主要使用遞歸實現,以防小伙伴們看不懂。

是什么?

遞歸是一種算法或函數設計方法,它通過將一個問題不斷分解成規(guī)模更小的子問題來解決原始問題。在 Python 中,遞歸是一種函數自身調用自身的過程。通過遞歸,程序可以在問題空間中向下深入,并通過返回值將解決子問題的結果合并起來,最終獲得整個問題的解。

如何用?

在 Python 中使用遞歸,首先需要定義邊界條件,即遞歸的結束條件。當滿足邊界條件時,遞歸停止,返回結果。同時,還需要定義遞歸情況,即在未滿足邊界條件時,如何繼續(xù)遞歸調用函數來解決子問題。遞歸函數應該能夠將問題領域縮小,使其逐漸接近邊界條件。

隱藏風險

首先,遞歸可能會導致堆棧溢出,特別是在處理大規(guī)模問題時。其次,遞歸的執(zhí)行效率可能較低,因為每次遞歸都需要保存函數調用的上下文。此外,遞歸需要合理設置邊界條件,否則可能導致無限循環(huán)和程序崩潰。

在編寫遞歸函數時,需要仔細考慮邊界條件和遞歸情況,確保遞歸能夠正確結束,并得到期望的結果。同時,為了提高遞歸性能,可以考慮使用尾遞歸優(yōu)化或迭代等技術。

案例實現

有了遞歸的基本了解,接下來進入正題,我們將實現如何斷言整個接口響應數據。

class AssertInfo:
 ? ?data = []
?
?
def diff_json(response_data, assert_data):
 ? ?if isinstance(response_data, dict):
 ? ? ? ?for key in assert_data:
 ? ? ? ? ? ?if key not in response_data:
 ? ? ? ? ? ? ? ?info = f"Response data has no key: {key}"
 ? ? ? ? ? ? ? ?print(info)
 ? ? ? ? ? ? ? ?AssertInfo.data.append(info)
 ? ? ? ?for key in response_data:
 ? ? ? ? ? ?if key in assert_data:
 ? ? ? ? ? ? ? ?diff_json(response_data[key], assert_data[key])
 ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ?info = f"Assert data has not key: {key}"
 ? ? ? ? ? ? ? ?print(info)
 ? ?elif isinstance(response_data, list):
 ? ? ? ?if len(response_data) == 0:
 ? ? ? ? ? ?print("response is []")
 ? ? ? ?if len(response_data) != len(assert_data):
 ? ? ? ? ? ?print(f"list len: '{len(response_data)}' != '{len(assert_data)}'")
?
 ? ? ? ?if response_data:
 ? ? ? ? ? ?if isinstance(response_data[0], dict):
 ? ? ? ? ? ? ? ?response_data = sorted(response_data, key=lambda x: x[list(response_data[0].keys())[0]])
 ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ?response_data = sorted(response_data)
 ? ? ? ?if assert_data:
 ? ? ? ? ? ?if isinstance(assert_data[0], dict):
 ? ? ? ? ? ? ? ?assert_data = sorted(assert_data, key=lambda x: x[list(assert_data[0].keys())[0]])
 ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ?assert_data = sorted(assert_data)
?
 ? ? ? ?for src_list, dst_list in zip(response_data, assert_data):
 ? ? ? ? ? ?diff_json(src_list, dst_list)
 ? ?else:
 ? ? ? ?if str(response_data) != str(assert_data):
 ? ? ? ? ? ?info = f"Value are not equal: {response_data}"
 ? ? ? ? ? ?print(info)
 ? ? ? ? ? ?AssertInfo.data.append(info)

代碼其實也不難理解,我們做一個簡單解釋:

這是一個用于比較兩個 JSON 數據格式是否相同的函數。每個部分的功能:

1.函數名稱:diff_json(response_data, assert_data)

參數:response_data 是接口響應數據,assert_data 是期望的斷言數據。

2.if isinstance(response_data, dict):

如果 response_data 是字典類型,則進入該條件判斷。

循環(huán)遍歷 assert_data 中的每個鍵(key):

如果鍵(key)不在 response_data 中,則打印信息表示響應數據缺少該鍵(key)。

循環(huán)遍歷 response_data 中的每個鍵(key):

  • 如果鍵(key)在 assert_data 中,則遞歸調用 diff_json 函數進行比較。
  • 否則,打印信息表示斷言數據缺少該鍵(key)。

3.elif isinstance(response_data, list):

如果 response_data 是列表類型,則進入該條件判斷。

檢查響應數據和斷言數據的長度是否相等,如果不相等,則打印信息表示長度不一致。

如果 response_data 不為空:

  • 如果列表中的元素是字典類型,按照字典鍵(key)的值進行排序。
  • 如果列表中的元素不是字典類型,進行普通的排序。

如果 assert_data 不為空:

  • 如果列表中的元素是字典類型,按照字典鍵(key)的值進行排序。
  • 如果列表中的元素不是字典類型,進行普通的排序。

使用 zip 函數同時迭代 response_dataassert_data

對于每個對應位置的元素,遞歸調用 diff_json 函數進行比較。

4.else:

  • 如果response_data 既不是字典類型也不是列表類型,則進入該條件判斷。
  • 如果 response_dataassert_data 的值不相等,則打印信息表示值不相等。

這個函數通過遞歸的方式,遍歷并比較兩個 JSON 數據結構的每一個鍵(key)和值。如果存在差異,將會打印出對應的信息。在需要斷言和驗證接口返回數據時,可以使用該函數進行檢查。

好了,那我們看一看測試效果:

response_data = {
 ? ?"name": "Alice",
 ? ?"age": 25,
 ? ?"email": "alice@example.com"
}
?
assert_data = {
 ? ?"name": "Alice",
 ? ?"email": "Alice@example.com"
}
?
diff_json(response_data, assert_data)

執(zhí)行之后,會打印出如下結果:

Assert data has not key: age
Value are not equal: alice@example.com

完美解決!

最后

這個功能還是很實用的,大部分接口響應內容都比較復雜,想要斷言的內容比較多時就比較麻煩,而這個函數可以比較兩個 JSON 數據格式是否相同,節(jié)省了很多時間,提高編寫接口用例的效率。

到此這篇關于深入解析Python中的JSON比較的文章就介紹到這了,更多相關Python JSON內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python pyttsx3庫實現文本轉語音功能的示例

    Python pyttsx3庫實現文本轉語音功能的示例

    pyttsx3是一個功能強大且易于使用的文本轉語音庫,適合需要離線語音合成的場景,本文就來介紹一下Python pyttsx3庫實現文本轉語音功能的示例,感興趣的可以了解一下
    2025-04-04
  • Python基礎學習之基本數據結構詳解【數字、字符串、列表、元組、集合、字典】

    Python基礎學習之基本數據結構詳解【數字、字符串、列表、元組、集合、字典】

    這篇文章主要介紹了Python基礎學習之基本數據結構,結合實例形式分析了Python數字、字符串、列表、元組、集合、字典等基本數據類型功能、原理及相關使用技巧,需要的朋友可以參考下
    2019-06-06
  • Python Web框架之Django框架Form組件用法詳解

    Python Web框架之Django框架Form組件用法詳解

    這篇文章主要介紹了Python Web框架之Django框架Form組件用法,結合實例形式詳細分析了Django框架中各種常用Form組件的功能、使用方法及相關操作注意事項,需要的朋友可以參考下
    2019-08-08
  • 簡單了解python gevent 協(xié)程使用及作用

    簡單了解python gevent 協(xié)程使用及作用

    這篇文章主要介紹了簡單了解python gevent 協(xié)程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • python3 讀寫文件換行符的方法

    python3 讀寫文件換行符的方法

    下面小編就為大家分享一篇python3 讀寫文件換行符的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 如何解決pycharm調試報錯的問題

    如何解決pycharm調試報錯的問題

    在本篇內容里小編給大家整理的是一篇關于如何解決pycharm調試報錯的問題文章,需要的朋友們可以學習參考下。
    2020-08-08
  • 使用Python繪制詞云圖的詳細教程

    使用Python繪制詞云圖的詳細教程

    詞云(Word Cloud)是一種數據可視化技術,用于顯示文本數據中的頻繁單詞,在本教程中,我們將使用 Python 的 wordcloud 庫,結合 matplotlib 和 jieba 等工具,展示如何從文本數據生成詞云圖,需要的朋友可以參考下
    2025-01-01
  • python中的iterator和"lazy?iterator"區(qū)別介紹

    python中的iterator和"lazy?iterator"區(qū)別介紹

    這篇文章主要介紹了python中的iterator和?“l(fā)azy?iterator“之間有什么區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Matplotlib繪制雷達圖和三維圖的示例代碼

    Matplotlib繪制雷達圖和三維圖的示例代碼

    這篇文章主要介紹了Matplotlib繪制雷達圖和三維圖的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 解決TensorFlow程序無限制占用GPU的方法

    解決TensorFlow程序無限制占用GPU的方法

    這篇文章主要介紹了解決TensorFlow程序無限制占用GPU的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06

最新評論