摘要:面對龐大服務介面群,完備的介面測試覆蓋和業務上下文場景測試看護才有可能保障產品服務的質量和可信。如果你想低成本實現產品和服務的測試高覆蓋和高質量看護,這篇文章將為你提供你想要的。
本文分享自華為雲社群《基於語義感知SBST的API場景測試智慧生成【智慧雲測】》,作者:DevAI。
1 背景
據2022年統計資料,華為雲已釋出商用的雲服務達到220+。以單個服務500+介面數量計算,已商用的雲服務的介面總數高達10W+。每介面引數數量更是平均超過20個,全組合測試會帶來組合爆炸,費時費資源,是不可完成的任務。為在有限的測試投入下保障有效的問題攔截和測試覆蓋,通常需要投入專職測試人員人工設計測試邏輯和測試資料組合,門檻高,依賴業務經驗和自動化開發經驗。而當前主流的API測試自動生成工具,基本採用傳統的隨機測試、Fuzz測試、基於程式碼覆蓋目標引導的SBST等,不感知介面業務語義,只能較好地解決單介面測試生成,對於多服務、多元件介面功能互動、協議互動時序場景、狀態相關場景,生成有效性極差,誤報高,效率低下,導致使用者E2E業務場景看護不足,易遺漏功能互動場景、異常呼叫等測試場景,導致現網問題時有發生,甚至服務中斷。
面對龐大基數的介面群,需要完備的介面測試覆蓋和業務上下文場景測試看護才有可能保障產品服務的質量和可信。
2 API場景級測試智慧生成
(總體流程圖)Semantic-aware & search-based API場景級高度自動生成方法,基於正向API介面定義文件和逆向現網、類生產脫敏導流資料,挖掘介面操作上下文語義依賴和入引數據約束,生成介面操作依賴(概率)圖(ODG),和介面引數約束字典,基於介面定義生成顯性測試oracle, 基於脫敏導流資料探勘生成隱性業務測試oracle。覆蓋操作依賴圖和字典批量迭代生成例項化測試序列下發SUT測試執行,準實時收集測試response並自動判定。依據前序迭代response結果,動態修正更新ODG圖和引數字典以及測試oracle。實現API場景級測試全自動生成、判定、修正、再生成。
迭代過程中輔助以程式碼覆蓋為導引,定向加速測試序列種子變異和優化。全過程極少需要人工介入和確認,是一種L4-L5全自動測試生成方法,能夠實現低成本、低程式碼、低誤報、高質量的覆蓋增強測試能力。
術語解讀:
ODG圖:基於Swagger2.0和OpenAPI3.0.0規範的Rest介面定義文件,正向挖掘API介面操作上下文依賴ODG圖;
OTPG圖:基於現網業務請求流量資料,以使用者、時間、環境等維度,逆向挖掘API介面呼叫時序業務轉移概率圖;
動態修正: 基於動態執行響應碼和響應結果,實現執行時動態更新修正ODG和引數字典,解決靜態依賴資料中的錯挖和漏挖問題;
測試oracle挖掘: 自動挖掘測試斷言,包括響應引數統計分佈和介面入參 vs出參的requires、relational、only one、zero one……數值關係或蘊含關係等常見約束關係,實現響應異常(狀態碼、返回碼、介面定義schema violation)自動檢測和業務依賴違反自動判定。
2.1 測試設計和執行互動模式變革
AS IS是當前測試設計和執行互動模式,多數環節需要人工理解設計文件,測試方案設計(測試邏輯時序設計、測試資料組合設計、測試判定點設計)和測試自動化實現開發,且要求參與人員熟知被測產品或服務業務、介面文件,熟練掌握測試技術、測試自動化框架、測試自動化方法開發。依據經驗先設計、實現、除錯、固化基線化測試用例,再批量按需執行,最後出報告、提單、反饋開發。。。
To Be是API場景測試智慧生成技術帶來的測試變革之後的互動模式,測試人員只需簡單配置生成需要的資料來源(哪些介面定義,哪個時間段的導流資料)即可,其餘測試設計活動、執行活動和判定活動均交由生成工具服務自主挖掘探索完成。最終只需少量人工批量確認結果,按需固化、基線化用例,以便後續迴歸測試。
為有效衡量和舉證測試生成服務的測試生成質量和生成效率,API場景測試智慧生成服務提供了有效性、缺陷攔截、覆蓋率三大維度的指標和趨勢資料
2.2 關鍵技術
2.2.1 API介面操作上下文依賴ODG圖靜態挖掘
API介面操作依賴圖(ODG圖)反映了介面間的操作時序以及介面間引數依賴。通過遍歷ODG圖,可以生成完備的業務場景,以實現業務場景功能互動測試覆蓋。因此,ODG圖的準確性和有效性定了測試生成的質量。
下圖為ODG圖生成的流程圖:
本技術採用兩種規則進行ODG圖的挖掘:
1. 基於介面間出參-入參依賴挖掘
引數匹配:根據引數名稱、型別是否完全一致來建立依賴關係
子串匹配:引數A的名稱是引數B名稱的子串
分詞匹配和編輯距離匹配: 存量介面中存在大量介面的引數命名不符合規範,或關鍵資訊在url資源路徑中,需通過分詞、編輯距離等方式來發現潛在的關係
引數黑名單:部分無實際業務意義但多個介面都包含的引數,如page分頁資訊等,採用新增黑名單的方式過濾
2. 基於對同一資源物件的CRUD操作語義順序依賴挖掘
符合restful規範:Post->Get->Put->Delete的挖掘
不符合restful規範:對URI資訊構建方法對映,如“add-”-> “Post”, “query/get-” -> “Get”, “remove-” -> “Delete”, 對URL的路徑分詞識別是否對同一資源的操作,以實現CRUD語義的依賴挖掘
(以真實業務為例生成的ODG圖)
2.2.2 API介面操作時序上下文依賴OTPG圖挖掘
OTPG圖是對業務場景挖掘的有效補充,我們對脫敏後的導流資料,以使用者/時間/環境等維度,按API介面操作時序及介面間出入參的取值匹配,計算轉移概率,生成OTPG圖。
2.2.3 動態修正技術
在測試生成任務執行過程中,根據場景測試序列sequence例項的結果反饋,動態更新ODG圖和引數字典,更正錯挖和漏挖,進一步提升生成成功率和場景序列的成功請求長度。
Top-Down: 分解請求不通的sequence成多個sub sequence,直到sub sequence請求成功,並更新引數字典
Bottom-Up: 重組請求成功的sub-sequence和字典取值,實現更長長度的sequence的請求成功
(動態修正示意圖)
基於動態修正技術,我們在ICSE 2022發表了題為《MOREST: Model-based RESTful API Testing with Execution Feedback》的會議文章。
2.2.4 測試Oracle挖掘
鑑於隨機引數的生成效率低下,我們引入引數約束,提升引數生成效率。同時為了驗證返回結果,我們引入Oracle挖掘。引數約束是指請求引數間存在的約束關係,如引數A要大於引數B;Oracle是指對於返回結果的約束,如request中的某個引數值等於response中某個引數值。
常見的約束型別如下:
API測試用例生成的在測試oracle挖掘的流程示意圖:
(引數約束&Oracle挖掘示意圖)
現有全自動生成方案只能探測非業務功能相關的顯性問題,例如黑盒oracle:應用crash,白盒oracle: 空指標、記憶體溢位等問題,或者只能通過對比測試的方法來判定結果,不能解決業務相關複雜oracle的生成問題,因此當前對於業務相關oracle仍需大量人工投入設計、補全。
該模組旨在解決測試oracle的生成難題,基於介面定義檔案和現網脫敏導流資料實現介面內/間2-wise 乃至n-wise引數蘊含、數值關係等約束挖掘(隱性oracle),以及狀態碼、schema violation等顯性測試Oracle生成和自動判定。
3 小結
面對雲化產品版本的快速迭代,應用場景日益豐富,產品功能漸趨複雜,完全基於經驗人工設計的介面測試在雲化產品質量保障上越來越捉襟見肘。因此基於介面文件和現網流量資料的智慧API測試生成技術應運而生,實現了單介面與多介面業務場景的雙覆蓋,做到真正幫助測試人員提高工作效率,並有力保障了雲化產品質量。
該生成服務的應用前景:
1. 對於小規模測試團隊或無專職測試人員的全功能團隊或測試小白,可基本實現少人蔘與或無人蔘與的無程式碼化高度自動化Rest 介面正常場景級測試用例生成,自動化執行和判定。
2. 對於有專職測試人員、測試專家的測試團隊,可低成本提升測試場景覆蓋率、缺陷攔截效率,減少測試設計投入。
3. 可以正常場景API測試基礎上實現異常場景 (可靠性測試)和併發場景(效能壓力模型)的全自動化生成,完全替代現有介面fuzz測試,實現介面全場景測試無程式碼化。