介面測試返回結構對比實現思路記錄

Jerry li發表於2020-09-03

場景:

介面A在固定的請求引數組合下,會返回一個幾乎不變的json 物件。

  • 通常的做法,是對這個物件的每一個引數和值進行逐個斷言;
  • 但如果這個物件基本上都是固定的,而且結構比較複雜,則一條用例中就需要新增非常複雜和冗長的斷言,導致用例維護難度加大。

解決思路:

既然返回值的結構基本上是固定的,那麼我們可以考慮對整個json物件進行斷言。

實現步驟:

  • 1. 儲存一份已人工校驗過是正確的返回值作為模板。
  • 2. 使用同一套引數請求介面,獲取返回值。同時讀取已儲存的返回值模板。
  • 3. 將返回值與模板值進行比較。

比較分為兩步:

  • 1. 將返回值和模板值直接對比,如果完全相等,則用例通過。
  • 2. 如果不完全相等,呼叫Python的 jsondiff 模組對兩個json 進行比較,獲取到一個差值物件。原理是比較兩個json 物件,將兩者的差異欄位取出。通常是一些每次請求隨機生成的ID,或者經常變化的時間戳等欄位。 如模板值為: {'userid':123,'username':'testname','lastlogindate':'2020-09-01'} 而實時返回值為; {'userid':123,'username':'testname','lastlogindate':'2020-09-02'} 則差異物件為: {'lastlogindate':'2020-09-02'}
  • 3. 編寫一個公共方法,獲取差值物件的欄位路徑和名稱。如上面的例子,輸出結果為: [lastlogindate]
  • 4. 將上一步獲取的差異物件值儲存為二級模板。用例執行時最終比較計算出的差異值是否與儲存的模板差異值相同。

將上述比較方法提取為公共方法,並編寫對應的模板提取方法。這樣只需將對應的引數組合和模板名稱,即可通過pytest.mark.paramise 的方式,輕鬆新增不同的測試用例。

相關文章