在接口測試過程中,用例設計是關鍵中的關鍵,需要重點關注的一些維度
接口測試
什麼是接口
接口就是內部模塊對模塊,外部系統對其他服務提供的一種可調用或者連接的能力的標準,所謂的接口是模塊與模塊之間的一種連接
接口測試
上圖爲一個典型的接口,一個接口通常是有輸入輸出的,輸入就是我們常見的入參,輸出有時有,有時沒有。調用相關接口,接口會執行相關處理邏輯
接口測試的用例設計,主要從輸入和接口處理兩方面考慮:
- 針對輸入,可按照參數類型進行設計
- 針對接口處理,可按照邏輯進行用例設計
- 針對輸出,可根據結果進行分析設計
典型問題
接口測試經常遇到的bug和問題,如下:
- 傳入參數處理不當,導致程序crash
- 類型溢出,導致數據讀出和寫入不一致
- 因對象權限未進行校驗,可以訪問其他用戶敏感信息
- 狀態處理不當,導致邏輯出現錯亂
- 邏輯校驗不完善,可利用漏洞獲取非正當利益等
用例設計
前面說明什麼是接口以及什麼是接口測試,接下來詳細看看如何才能更好的進行接口用例設計
一、參數校驗
對於接口來說,輸入就是入參。常見參數類型有:
- 數值型(int、long、float、double等)
- 字符串類型
- 數組或鏈表
- 結構體
1.1 數值型
數值型參數主要考慮的設計思路
1.1.1 等價類
- 取值範圍內
- 取值範圍外
1.1.2 邊界值
- 取值範圍邊界(邊界最小、最大、邊界最小-1、邊界最大+1等)
- 數據類型邊界(如int類型數據最小、最大)
1.1.3 特殊值
- 0
- 負數
1.1.4 遍歷法
- 取值範圍的所有數值遍歷
栗子
整型: 最大最小值限制、0和負數的限制
浮點型: 最大最小值限制、0和負數的限制、小數點後位數的限制
常見問題
- 特殊值處理不當導致程序異常退出
- 類型邊界溢出
- 取值範圍外值未返回正確的錯誤信息等
1.2 字符串型
字符串型的參數,主要考慮字符串的長度和內容
1.2.1 字符串長度
- 等價類(取值範圍內、取值範圍外)
- 邊界值(規定範圍邊界、類型邊界)
- 特殊值(0、空字符串)
1.2.2 字符串內容
- 特定類型(英文、中文、大小寫等)
- 特殊字符(,.><=$&^%~"*等)
- 敏感字符("法輪功"等)
栗子
空串、空白符號、長度限制校驗、中文、全角半角、特殊字符
常見問題
- 傳入非特定類型程序異常退出
- 超長字符未進行處理,導致存儲、顯示等異常
- 其他用戶可見設置的敏感字
1.3 數組或鏈表類型
參數類型爲數組或鏈表時,主要考慮成員個數和成員內容
1.3.1 成員個數
- 等價類(取值範圍內、取值範圍外)
- 邊界值(規定範圍邊界、個數邊界值)
- 特殊值(0等)
1.3.2 成員內容
- 等價類(合法和非法成員)
- 重複法(重複成員)
常見問題
- 0個item時程序異常退出
- 重複的item處理時未去重導致結果異常等
1.4 結構體
結構體(struct)是一些元素的結合,元素實際也是數值型,字符串型,數組或鏈表
枚舉類型
需要針對枚舉類型進行具體的業務數據邏輯校驗
對象類型
- 整個對象爲null
- 對象不爲null,裏面某個成員爲null
- 空集合
- 集合的最大size校驗
1.5 其他問題
- 必傳參數驗證
- 參數值爲null驗證
二、功能邏輯校驗
接口核心作用在於處理業務邏輯,針對功能邏輯的用例設計分析
2.1 約束條件分析
-
2.1.1 數值限制
等級限制、分數限制、次數限制、時間限制、數量限制、積分限制等 -
2.1.2 狀態限制
登陸狀態、簽到狀態等 -
2.1.3 關係限制
綁定關係、好友關係、授權關係等 -
2.1.4 權限限制
管理員、超級管理員等
約束條件用例設計的意義在於:
用戶進行操作時,在該操作前端進行了約束條件的限制,故用戶無法直接觸發請求該接口,但如果前端有bug或者通過接口請求直接調用,那麼針對這些條件限制十分重要
常見問題
- 約束條件判斷不足,導致用戶可通過特殊手段獲取利益
2.2 操作對象分析
面向對象首先得有對象,業務處理邏輯也是針對對象的,例如用戶線上授課,課件就是操作對象,而課件的元素、屬性也是對象
常見問題
- 用戶可訪問非權限內的其他用戶信息、敏感信息,從而利用這些信息謀取利益
2.3 狀態轉換分析
被測邏輯可以抽象成狀態機,各個狀態之間根據功能邏輯從一個狀態切換到另一個狀態
如果打亂對應的次序,從一個狀態切換到另一個不在它下一狀態集中的狀態,那麼可能出現邏輯問題
栗子
從某狀態改變到新的狀態,依賴特定的轉換接口處理
對於某些轉換接口,其輸入狀態是確定的(比如Fun23,這個函數只能把狀態2轉換爲狀態3,而不能把狀態1轉換爲狀態3)
測試點可以如下設計:
- 狀態爲狀態2,調用接口Fun23(),狀態切換到狀態23
- 狀態爲1,3等,調用接口Fun23(),狀態不能切換
常見問題
- 可通過特殊手段達到原本不能的狀態,從而謀取利益
2.4 時序分析
在一些複雜的活動中,一個活動是由一系列動作按照指定順序進行的,這些動作形成一個動作流,只有按照這個順序依次執行,才能得到預期結果
在在接口測試時,需要考慮如果不按照時序執行,是否會出現問題
常見問題
- 非順序執行後,數據出現異常,可能還會出現程序其他異常
- 通過打亂順序獲取利益
2.5 數據精度分析
在處理業務邏輯時,有時候因爲數據精度問題導致出現計算
數據精度的校驗考慮的數據
-
2.5.1 時間
秒/毫秒、時間戳 -
2.5.2 金額
兩位小數、元/角/分
2.6 用戶體驗
接口屬於模塊之間的調用,有時候前端直接展示接口返回的信息
- 2.6.1 接口返回提示
接口返回錯誤提示是否合理&友好
三、異常校驗
異常校驗涉及服務內部異常、依賴的外部服務異常、依賴的中間件異常等等
3.1 依賴服務
依賴的下游服務調用異常思路
-
3.1.1 調用異常
依賴服務調用拋異常
返回失敗(有明確返回失敗信息、返回null、http沒有返回body、部分成功部分失敗)
返回不同狀態碼的處理 -
3.1.2 調用超時
下游服務調用超時 -
3.1.3 重試機制
服務調用重試機制(重試次數、間隔時長) -
3.1.4 調用校驗
http url的正確性校驗
入參的正確性&完整性校驗(如分頁信息,是否查了多餘信息)
3.2 中間組件
-
3.2.1 拋異常
-
3.2.2 超時
3.3 循環內中斷
輔助手段
需要針對服務及接口對應的依賴服務和中間件(nginx、redis、db、mq、kafka等等)進行梳理,不同情況下的模擬
- 訪問超時和丟包可以使用linux的tc命令來設置
- 服務掛掉可以通過改ip或端口模擬
- 依賴第三方接口的異常返回碼可以用mock模擬
四、數據校驗
接口業務邏輯中關於數據的處理邏輯重中之重,接下來針對數據校驗的幾個方面來說明一些校驗的維度
4.1 數據一致性
-
4.1.1 長度一致性
DB字段和代碼定義類型的長度一致性
DB表字段定義是否合理
上下游系統相同字段的長度一致性
前後端長度一致性驗證
批量接口入參的最大size限制要和需要調用的外部接口的最大size限制兼容 -
4.1.2 多數據源一致性
緩存和DB之間的數據一致性
4.2 冪等校驗
4.3 事務驗證
-
4.3.1 回滾操作
驗證是不是所有寫操作都回滾
重點驗證回滾邏輯的正確性 -
4.3.2 數據源
驗證有沒有一個事務中出現使用兩個數據源
9.3 讀寫分析驗證
-
9.3.1 關注從庫延遲
-
9.3.2 主從配置是否正確
五、場景反推校驗
在設計功能用例時,僅限於接口文檔或瞭解的信息進行用例設計,有時候需要增加一些輔助手段更好的深入測試
5.1 批量處理
- 5.1.1 sql過濾條件
通過sql語句的過濾條件去反推業務場景和開發要篩選的數據是否批量
5.2 重點關注字段
-
5.2.1 sql表字段狀態
sql涉及的表中表示狀態的字段 -
5.2.2 sql表字段刪除狀態
sql涉及的表中表示刪除狀態的字段
檢查思路:過濾條件是否足夠及該過濾的數據有沒有被過濾,比如刪除狀態的數據要不要過濾、禁用狀態的數據要不要過濾
六、日誌檢查
在接口測試時,不僅僅是關注功能是否能正常實現,還需要關注日誌信息是否正確
6.1 必要性
有沒有,需不需要
6.2 準確性
信息夠不夠,有沒有多餘
6.3 日誌級別
日誌級別對不對
6.4 日誌設置
需不需要開關,開關開啓機制
6.5 日誌收集
是否異步收集,性能是否有影響
6.6 敏感性
日誌中有沒有包含敏感信息、用戶信息
七、健壯性
調用鏈路(下游)的接口超時時間合理性
八、併發性能校驗
在接口測試時,性能方面主要關注併發是否導致一些功能邏輯的問題及單個接口的響應時間
8.1 併發死鎖
-
8.1.1 線程死鎖
-
8.1.2 db死鎖
8.2 接口響應時間
-
8.2.1 單接口響應時間
-
8.2.2 批量查詢接口響應時間
-
8.2.3 批量處理接口響應時間
九、安全性驗證
9.1 敏感信息
-
9.1.1 敏感信息不能暴露給用戶
-
9.1.2 url或rsp中不能包含敏感信息
9.2 sql注入
十、sdk版本兼容性
如果依賴sdk,需要重點關注sdk新舊版本的兼容性