ZStack 自動化測試系統3 基於模型的測試

2021-09-09 05:28:59 字數 3056 閱讀 3315

模型測試系統是zstack-woodpecker中的乙個子專案。通過有限狀態機和行為選擇策略,它可以產生隨機的api操作,一直執行下去,直到遇到乙個缺陷或者預定義的退出條件。zstack依賴模型測試去測試真實世界中難以遇到的邊界用例,在測試覆蓋度方面補充整合測試和系統測試。

測試覆蓋率是乙個判斷乙個測試系統品質的重要指示器。常規測試方**,例如單元測試,整合測試,系統測試,都是由人類邏輯思考構建的,難以覆蓋軟體中的邊界場景。這個問題在iaas軟體中變得更加明顯,因為管理不同的子系統會導致極為複雜的場景。

zstack通過引入基於模型的測試來解決這個問題。它可以產生由隨機api組合構成的場景,會持續執行知道遇到預定義的退出條件或者找到乙個缺陷。作為機器驅動的測試,基於模型的測試可以克服人類邏輯思考的缺陷來執行一些,看起來***邏輯,但是api完全正確的測試,幫助發現難以被人類主導的測試發現的邊界問題。

乙個例子可以幫助理解這個思想。基於模型的測試系統通常在執行大約200個api後暴露乙個bug,在除錯後,我們找到最小重現這個問題的序列是:

建立乙個vm

關閉這個vm

為這個vm的根雲盤建立乙個雲盤快照

從這個vm的根雲盤建立乙個新的資料雲盤快照

銷毀這個vm

建立乙個新的資料雲盤,使用4中的模板

從6中的資料雲盤建立乙個新的雲盤快照

這個操作序列顯然是反邏輯的,我們相信沒有測試者會寫乙個整合測試用例或者系統測試用例這麼做。這就是機器思考閃光的地方,因為它沒有人類的感情,會做人類感覺不合理的事情。在找到這個bug之後,我們生成了乙個回歸測試為以後保障這個問題。

基於模型的測試系統,因為由機器驅動,也被稱為機械人測試。當這個系統執行時,它從乙個模型(在下面幾節中也被稱為階段)移動到另乙個模型,通過執行被動作選擇策略選出的動作(也被稱為操作)。在每乙個模型完成之後,檢查器將會驗證測試結果,測試退出條件。如果任何失敗被發現,或者退出條件被滿足,系統將會退出。否則,它將會移動到下乙個模型,然後重複。

在基於模型的測試的理論中,有許許多多生成測試操作的方式。例如:有限狀態機,自動推導,模型檢驗。我們選擇使用有限狀態機,因為它自然地適合iaas軟體,其中每乙個資源都由狀態驅動。例如,從使用者角度看,vm的狀態像這樣:

在基於模型的測試系統中,每乙個資源的每乙個狀態都預先定義在test_state.py中,看起來像:

通過這種方式,基於模型的測試系統可以保持執行,從乙個階段到另乙個階段,直到遇到預先定義的退出條件或者發現一些缺陷,它可以持續地跑很多天,數以萬次地呼叫api。

當在階段間移動時,基於模型的測試系統需要決定下乙個需要執行的操作是什麼。決定制定器被稱為動作選擇策略,乙個可擴充套件外掛程式的引擎,不同的選擇演算法可以以不同的目的被實現。

當前系統有三種策略:

隨機排程器:最簡單的策略,為當前的階段,從候選動作中隨機地選擇下乙個操作。作為一種很直接的演算法,隨機排程器可能會重複一項操作,而使得其他操作等待。為了緩解這個問題,我們為每乙個操作都增加了乙個權重,這樣測試人員可以為他們想多測試的操作賦予更高的權重。

公平排程器:一種對待每個操作都完全平等的策略,以這樣一種方式補充隨機排程器:每個操作都有平等的機會被執行,保證只要測試週期足夠長,每個操作都會被測試到。

路徑覆蓋排程器:通過歷史資料決定下一步操作的策略。這個策略會記住已經被執行過的所有操作路徑,然後嘗試選擇乙個可以形成新的操作路徑的操作。例如,給定候選操作a,b,c,d,如果前乙個操作時b且路徑ba,bb,bc都已經被執行,策略將會選取d作為下乙個操作,這樣路徑bd將會被測試到。

如上面提及到的,動作選擇策略是乙個可擴充套件外掛程式的引擎,每乙個策略實際上由類actionselector派生來:

乙個隨機排程器的實現例子像這樣:

在啟動基於模型的測試系統之前,退出條件必須被設定好,否則系統將會保持執行,直到乙個缺陷被發現,或者日誌檔案撐爆了測試機器的硬碟。退出條件可以是任何形式的,例如,在執行24小時後退出,在系統有100個eip被建立後退出,在有2個停止的vm、8個執行中的vm時退出。一切都取決於測試者去定義條件,盡可能地增加發現缺陷的機會。

除錯乙個被基於模型的測試系統發現的失敗是很難而且令人沮喪的,大多數的失敗都由大量的操作序列暴露,而且它們通常缺乏邏輯並有著大量的日誌。我們通常手動重現失敗,在痛苦地依照大約500,000行日誌,使用zstack-cli呼叫api 200次後,我們最終意識到這個悲慘的任務不是人類可以做到的。然後我們發明了乙個工具用於重現乙個失敗,通過回放動作日誌(純粹只記錄了關於api的測試資訊)。

乙個動作日誌像這樣:

測試人員可以通過呼叫回放工具重建失敗的環境:

在這篇文章中,我們引入了基於模型的測試系統。由於善於暴露邊界用例中的問題,基於模型的測試系統和整合測試系統、系統測試系統共同作為保衛zstack質量的基礎,使得我們可以以驕傲的自信發布產品。

Selenium自動化測試 python基礎

author 佳期如夢 data 2020 11 06 function python base study 順序 分支 迴圈 語法 if true print true else print else a 2 b 5 if a b print a小於b,a的值是 a else print b s1...

Selenium自動化測試 python基礎07

author 佳期如夢 data 2020 11 20 function 異常處理 注釋的快捷鍵 ctrl 捕獲異常 不存在的變數 import json try print a 用型別去捕捉 except nameerror as msg print msg msg 開啟乙個檔案 不存在的檔案 t...

自動化測試 web自動化測試

自動化 由機器裝置代替人為完成制定目標的過程 優點 提高工作效率 減少勞動力 產品規格同一標準 批量生產 自動化測試 讓程式代替人為去驗證程式功能的過程,即在預設條件下執行程式系統 流程確定 搭建自動化框架 編寫測試用例,將其轉化為soupui 介面 自動化測試指令碼 執行自動化測試指令碼 輸出執行...