<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      接口自動化測試,一鍵快速校驗接口返回值全部字段

      大家好,我是狂師。

      大家在日常開展自動化測試工作時,為了保證接口測試的有效性,少不了要對接口返回的響應字段進行校驗斷言等操作。當接口返回的字段數量本身就很少時,接口斷言操作一般都很容易就能實現,但當接口的返回字段特別多,結構特別復雜時,例如響應字段數量達到了成百上千時,如何快速實現全部返回字段的校驗?這類問題,相信困擾了很多的正在開展接口測試的小伙伴。

      今天針對如何快速審核接口返回值全部字段問題,分享一些解答思路,希望能幫到大家~

      其實解決上述之類問題,市面上常見的解決方案有兩類:

      • 根據業務校驗需求,自定義開發校驗規則庫
      • 借助現有的第三方庫

      今天,我們先來聊聊,如何借助現有的第三方庫來解決: 快速校驗API接口返回的全部字段。由于當今大部分接口都是基于Restful API,后續我介紹中,我們假設接口響應體格式以JSON為例。

      要滿足上面的實現需求,第三方庫方案有很多,比如常見的就有:deepdiffdifflibjson-diffjson_tools 等,這些三方庫之間,都有各自側重點,本篇文章,重點介紹:如何借助DeepDiff庫來解決快速校驗接口返回字段的問題

      一、認識一下,DeepDiff 介紹

      Deepdiff模塊常用來校驗兩個對象是否一致,并找出其中差異之處。其中提供了三個類,DeepDiff,DeepSearch和DeepHash,官網地址:https://deepdiff.readthedocs.io/en/latest/ ,當前最新版本為:V5.5.0

      主要組成部分:

      • DeepDiff:比較兩個對象,對象可以是字段、字符串等可迭代的對象,針對對象的深層差異,遞歸查找所有更改。

      • DeepSearch:在對象中搜索其他對象

      • DeepHash:根據對象的內容進行哈希處理

      DeepDiff 的初衷是用來找出不同數據的差別,可以比較JSONXML文本類的,也可以比較圖片,在使用了一下之后,其實我們完全可以直接使用它作為測試的斷言,這也是從另一個思考角度提供了一種全新的校驗思路

      二、DeepDiff 使用

      當你看完上述的介紹,相信還是一臉懵,不知如何下手,接下來,就通過幾個案例來進一步感受一下Deepdiff的功能和作用。

      使用之前,先安裝:

      pip install deepdiff
      

      2.1 案例一:比較兩個JSON

      利用Deepdiff 比較 JSON 的差異:

      import pytest
      import requests
      import pprint
      from deepdiff import DeepDiff
      
      class TestDemo(object):
      
          def test_case_01(self):
              a = {"Object": {
                  "code": "0",
                  "message": "success"
              },
                  "code": "0",
                  "message": "success"
              }
      
              b = {"Object": {
                  "code": "0",
                  "message": "failure"
              },
                  "message": "success",
                  "timestamp": "1614301293"
              }
      
              pprint.pprint(DeepDiff(a, b))
      

      上述案例,作用是比較a和b兩者的差異,result 差異的輸出結果是:

      .{'dictionary_item_added': [root['timestamp']],
       'dictionary_item_removed': [root['code']],
       'values_changed': {"root['Object']['message']": {'new_value': 'failure',
                                                        'old_value': 'success'}}}
      

      上述輸出結果中,實際上根據這個返回的 json 獲取所有的差別。主要是對比對象之間的值、類型前后之間的變化以及刪除的或者增加的情況key進行了結果輸出。

      主要包含以下四種情況:

      • 1、type_changes:類型改變的key
      • 2、values_changed:值發生變化的key
      • 3、dictionary_item_added:字典key添加
      • 4、dictionary_item_removed:字段key刪除

      2.2 案例二:比較接口響應

      有了案例一的基礎,進一步,我們將本地定義寫死的變量值改成采取調用接口的方式(更符合實際接口測試),通過發起請求,獲取響應、并結合Deepdiff來斷言使用。

      核心思路:先定義預期的響應結構體(意味著,你得事先知道你期望的結果是什么),再根據實際返回的結構體兩者通過Deepdiff進行自動比較。

      import pytest
      import requests
      import pprint
      from deepdiff import DeepDiff
      
      
      class TestDemo(object):
      
          def setup_class(self):
              self.response = requests.get('http://www.httpbin.org/json').json()
      
          def test_case_02(self):
              expected_reps = {'slideshow': {'author': 'Yours Truly', 'date': 'date of publication',
                                             'slides': [{'title': 'Wake up to WonderWidgets!', 'type': 'all'}, {
                                                 'items': ['Why <em>WonderWidgets</em> are great',
                                                           'Who <em>buys</em> WonderWidgets'], 'title': 'Overview',
                                                 'type': 'all'}], 'title': 'Sample Slide Show'}}
              pprint.pprint(DeepDiff(expected_reps, self.response))
      

      由于實際返回的結構體和預期定義待校驗的結構體數據完全一樣,因此上述代碼輸出結果為:{},即兩者沒有差異。(也意味著實際和預期結果一致)

      在此基礎上,如果我們把上述expected_reps預期結構體中的authorYours Truly修改為Yours,再執行一次,則輸出的結果為:

      {'values_changed': {"root['slideshow']['author']": {'new_value': 'Yours Truly',
                                                          'old_value': 'Yours'}}}
      

      從上述的輸出結果中,我們可以很明顯的獲取到三個訊息:

      • 接口返回的結構體中有值發生了改變,通過values_changed標識出來了
      • 明確指出具體哪個字段的值發生改變了,如root['slideshow']['author']
      • 改變具體的內容,如實際返回值為Yours Truly,而預期值為Yours

      看完了這個,相信此時的你,對Deepdiff在接口測試中的使用,已經有了一些感覺了。但接著你肯定會提出疑問,有些接口返回的值,并不是固定的,那比如校驗呢。比如某個時間戳字段,每次調用接口時,返回字段的值都是不一樣,針對這類只知道數據規則,但數據本身的值一開始是無法確定的,又該如何結合Deepdiff來使用呢?別急,再接著往下看。

      2.3 案例三:正則搜索匹配

      要解決上述的問題,可以利用DeepSearch中的正則搜索匹配功能,如果你的接口返回,是一個很深的嵌套結構對象,然后你想校驗查找指定的元素(key和value都行)是否存在,那么Deep Search將是個好選擇。

      使用前,需要先導入from deepdiff import grep,示例源碼如下:

          def test_case_03(self):
              datas = {"mikezhou": "狂師", "age":18, "city": "china", "info": {"author": {"tag": "mikezhou"}}}
              reuslt = datas | grep("mike*",use_regexp=True)
              print(reuslt)
      

      比如想校驗有沒有以mike開頭字段或值在返回的結構體中,指定元素存在則返回它的路徑;不存在則返回一個空字典。上述輸出結果如下:

      .{'matched_paths': ["root['mikezhou']"], 'matched_values': ["root['info']['author']['tag']"]}
      

      上述示例雖簡單,但如果你足夠聰明,相信應該已經能從中Get核心思路了:針對一些動態事先無法預料的值,可以通過借助正則表達式來匹配校驗,具體如何校驗,取決于你的正則表達式如何描述。

      三、最后一個小技巧:DeepDiff 黑名單

      在實際做接口測試斷言時,有時對象順序不一樣,但是實際情況兩個值還是一樣的,或者是針對全量字段校驗時,想跳過一些特殊的字段校驗(類似黑名單一樣,將不需要校驗的字段,明確指出),為了解決這類問題,Deepdiff也提供了相信的參數,只需要在比較的時候加入:

      • ignore order (忽略排序)
      • ignore string case(忽略大小寫)
      • exclude_paths字段黑名單排除參數即可,原型如下:
      result = DeepDiff(result, expected, view='tree',ignore_order=True,ignore_string_case=True)
      

      示例:

          def test_case_05(self):
              expected_reps = {"datas": {
                  "code": "200",
                  "message": "success"
              },
                  "code": "201",
                  "message": "success"
              }
      
              actual_reps = {"datas": {
                  "code": "201",
                  "message": "failure"
              },
                  "message": "Success",
                  "timestamp": "1614301293"
              }
      
              pprint.pprint(DeepDiff(expected_reps, actual_reps, ignore_order=True,ignore_string_case=True,exclude_paths={"root['timestamp']"}))
      

      上述示例代碼,忽略了排序規則、大小寫問題,并且指定排除timestamp字段校驗。具體的輸出結果如下:

      {'dictionary_item_removed': [root['code']],
       'values_changed': {"root['datas']['code']": {'new_value': '201',
                                                    'old_value': '200'},
                          "root['datas']['message']": {'new_value': 'failure',
                                                       'old_value': 'success'},
                          "root['message']": {'new_value': 'Success',
                                              'old_value': 'success'}}}
      

      四、小結

      通過上述的案例介紹,相信你對DeepDiff的使用有了一個基本認識。在接口自動化測試中,小結一下,使用 DeepDiff 的好處有:

      1. 接口測試的時候,可以直接利用預期結構體(或者稱之為接口契約)與實際返回的結構體(字段、值)進行自動比較,來確定是不是一樣,可以少寫很多代碼。
      2. 數據庫數據比較的時候也是一樣可以,使用 SQL查出結果之后,直接變成 JSON就可以和期望的 JSON對比了。

      本文旨在從另一個視角幫大家提供一些接口測試全量字段校驗的解決思路,更多關于Deepdiff使用技巧,以及更優解的全量字段解決方案(還有很多),歡迎大家積極探索。

      posted @ 2021-05-18 17:49  狂師  閱讀(1710)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 久久精品不卡一区二区| 97久久久精品综合88久久| 国产美女久久久亚洲综合| 国产乱弄免费视频观看| 亚洲精品日韩久久精品| 无码人妻丰满熟妇区毛片| 亚洲性日韩精品一区二区| 亚洲一区二区三区黄色片| 午夜福利国产精品视频| 老熟女高潮一区二区三区| 国产精品久久久久久福利| 久久久久无码精品国产h动漫| 国内精品免费久久久久电影院97| 在线观看热码亚洲av每日更新| 丁香婷婷色综合激情五月| 老男人久久青草av高清| 国产精品日韩深夜福利久久| 久久精品人人做人人爽97| 国产成人午夜福利精品| 91久久亚洲综合精品成人| 国产一区二区三区亚洲精品| 日韩欧美视频一区二区三区| 高清破外女出血AV毛片| 东京热大乱系列无码| 国产欧美日韩高清在线不卡| 狠狠色综合久久丁香婷婷| 中文字幕在线精品人妻| a男人的天堂久久a毛片| 欧美韩中文精品有码视频在线| 天堂…中文在线最新版在线| 日韩精品久久久肉伦网站| 日韩人妖精品一区二区av| 日本另类αv欧美另类aⅴ| 亚洲欧美人成网站在线观看看 | 色综合天天综合天天综| 中文字幕日本六区小电影| 亚洲av无码之国产精品网址蜜芽 | 亚洲一区二区三区18禁| 天堂www在线中文| 精品国产综合一区二区三区| 久久亚洲av成人无码软件|