天天看點

簡單談一談幂等測試1、什麼是幂等測試2、幂等測試的常見場景3、實作幂等的方式4、如何測試幂等性

1、什麼是幂等測試

幂等是一個抽象的概念,在程式設計中一個幂等操作的特點是其任意多次執行所産生的影響均與一次執行的影響相同,即多次調用方法或者接口不會改變業務狀态,可以保證重複調用的結果和單次調用的結果一緻。幂等測試,則主要是為了驗證同一個請求被執行一次與被執行多次的效果是否是一樣的。

2、幂等測試的常見場景

(1)前端重複送出

使用者在前端送出一些資料給背景服務時,背景需要根據使用者送出的資料在資料庫中建立記錄。如果使用者不小心多點了幾次,後端收到了多次送出,這時就會在資料庫中重複建立多條記錄。這就是接口沒有幂等性帶來的 bug。

(2)接口逾時重試

調用接口時,有可能會因為網絡原因而調用失敗,這時,一般在設計的時候會對接口調用加上失敗重試的機制。如果第一次調用已經執行了一半時,發生了網絡異常。如果沒有幂等處理,這時再次調用時就會因為髒資料的存在而出現調用異常。

(3)消息重複消費

在使用消息中間件來處理消息隊列時,如果消費者突然斷開連接配接,那麼已經執行了一半的消息會重新放回隊列。當消息被重新消費時,如果沒有幂等性,就會導緻消息重複消費時結果異常。

3、實作幂等的方式

對于前端而言:在使用者送出一次操作後,前端将按鈕置灰、隐藏等,可以讓使用者在接口響應之前無法再次送出。當然前端做此校驗也隻能攔截一部分,畢竟可以通過工具重複調用接口,是以幂等主要還是需要後端來實作。後端實作幂等的常見方式如下。

(1)通過token機制

比如使用者在購物送出訂單時,服務端提供一個發送token的接口,服務端生成的token一般放在redis中,前端在送出購物訂單時,先請求擷取token的接口,下單時帶着此token放在請求接口頭部,同時請求後端接口, 服務端在接受到下單接口的token,判斷redis中該token是否存在,如果存在,則代表是第一次請求下單接口,允許下單。下次如果同樣的訂單及token再次下單時,該token不存在,就表示重複送出下單,服務端直接傳回重複下單或其他友好文案。

(2)資料庫去重表

往去重表裡插入資料的時候,利用資料庫的唯一索引特性,保證唯一的邏輯。唯一序列号可以是一個字段,例如訂單的訂單号。

(3)狀态機實作

對于很多業務是有一個業務流轉狀态的,每個狀态都有前置狀态和後置狀态,以及最後的結束狀态。

以訂單為例,已支付的狀态的前置狀态隻能是待支付,而取消狀态的前置狀态隻能是待支付,通過這種狀态機的流轉我們就可以控制請求的幂等。

(4)其他方式

當然還有其他很多方式比如利用redis,加鎖等許多方式,針對不同的業務使用合适的實作幂等的方法。

4、如何測試幂等性

(1)網絡重發,比如在掃碼支付時,商戶在掃碼時,先斷網掃碼一次再重連掃碼。

(2)系統重發,比如接口請求逾時,通過接口補處理機制,觸發新的請求。

(3)消息重發,比如通過某個消息中間件重複推送消息,檢視消費者是否重複消費。

(4)接口重發,比如對同一筆訂單,通過腳本重複送出。

繼續閱讀