為服務(wù)虛擬化增添生命力:有狀態(tài)和狀態(tài)轉(zhuǎn)換測試
在服務(wù)虛擬化中,創(chuàng)建現(xiàn)實的虛擬服務(wù)的關(guān)鍵部分是確保服務(wù)具有狀態(tài)行為,以便可以在測試運行之間保留其狀態(tài)。但是極限是什么?模擬何時會成為過多的模擬?在這篇文章中,了解狀態(tài)轉(zhuǎn)換測試以及如何知道何時需要它。
為了加速功能測試,至關(guān)重要的是必須不受限制地訪問可信賴的現(xiàn)實測試環(huán)境。完整的測試環(huán)境包括被測應(yīng)用程序(AUT)及其所有相關(guān)組件(例如API、第三方服務(wù)、數(shù)據(jù)庫、應(yīng)用程序和其他端點)。
服務(wù)虛擬化使團隊能夠(1)訪問所需的完整測試環(huán)境,包括所有關(guān)鍵的從屬系統(tǒng)組件,以及(2)以分階段的測試環(huán)境無法實現(xiàn)的方式更改這些從屬組件的行為。從而使團隊能夠更快、更完整地進行測試。
狀態(tài)測試
創(chuàng)建現(xiàn)實的虛擬化依賴項的關(guān)鍵部分是有狀態(tài)行為。換句話說,虛擬化依賴項可以在測試運行之間保留其狀態(tài)??紤]一個模擬虛擬購物車組件的示例。一個簡單的API允許從購物車中搜索、添加、檢索和刪除商品。采用無狀態(tài)行為,模擬搜索并將商品保存到購物車不會改變購物車的狀態(tài)。測試從購物車中檢索和刪除數(shù)據(jù)的過程將失敗,因為購物車將保持其初始狀態(tài)(空),如下所示:
但是,如果為虛擬購物車提供了有狀態(tài)行為,則在測試之間保留其狀態(tài)(空或其中有多個項目),并且還根據(jù)被測試應(yīng)用程序的輸入進行更改,您可以開始有意義地測試過程。
使用狀態(tài)測試,虛擬化服務(wù)現(xiàn)在可以將狀態(tài)從空更改為“已添加項目”,并返回適當(dāng)?shù)男畔?。如果將商品添加到購物車,并且AUT查詢購物車,則返回適當(dāng)?shù)臄?shù)據(jù)。使用狀態(tài)測試可以進行更實際的測試,現(xiàn)在查詢購物車將返回添加的項目,如下所示:
總而言之,要擁有可信賴且可重用的虛擬服務(wù),至關(guān)重要的是,它們必須充分模仿真實的服務(wù),以將有意義的結(jié)果返回給被測應(yīng)用程序,這可能需要狀態(tài)測試。
除了虛擬服務(wù)本身的狀態(tài)之外,您可能還需要根據(jù)不同的潛在輸入來模擬狀態(tài)變化,這稱為狀態(tài)轉(zhuǎn)換測試。
什么是狀態(tài)轉(zhuǎn)換測試?
狀態(tài)轉(zhuǎn)換是有限狀態(tài)機的動作組件,定義為:
“……一個抽象機器,在任何給定時間都可以恰好處于有限數(shù)量的狀態(tài)之一。 FSM可以響應(yīng)某些外部輸入而從一種狀態(tài)更改為另一種狀態(tài)。從一種狀態(tài)到另一種狀態(tài)的變化稱為過渡。FSM由其狀態(tài)、其初始狀態(tài)和每個過渡的條件的列表定義。”——維基百科
狀態(tài)機是描述對象的有用方法,通常被明確用作編程模型。在其他情況下,例如我們的購物車,可能會有一個隱式狀態(tài)機來描述其行為。對于上面的購物車示例,請考慮以下狀態(tài)機:
購物車的初始狀態(tài)為空,并且在將商品添加到購物車時,狀態(tài)從“空”轉(zhuǎn)換為“購物車中的商品”。根據(jù)事件(在這種情況下,從購物車中添加或刪除商品)啟動轉(zhuǎn)換。
過渡通常需要先確定條件,例如,僅當(dāng)項目數(shù)再次為零時,才發(fā)生過渡回“空”狀態(tài)的情況。在此示例中,轉(zhuǎn)換通常會執(zhí)行操作,例如增加購物車中的物品計數(shù)。盡管不太可能將購物車編程為狀態(tài)機,但是有一個隱式的購物車可用于定義其行為。
考慮另一個簡單的用戶登錄組件示例,該組件在重試一定次數(shù)后將用戶鎖定:
在登錄組件中,初始狀態(tài)已注銷。只有輸入正確的PIN才能登錄用戶。在定義次數(shù)的登錄嘗試(MAX_RETRIES)之后,該帳戶將被阻止。在這種情況下,帳戶阻止可以被視為最終狀態(tài),因為現(xiàn)在有從其轉(zhuǎn)移的方法。
使用Parasoft Virtualize模擬狀態(tài)
那么,這對測試和虛擬服務(wù)有何幫助?好吧,可以使用Parasoft Virtualize模擬狀態(tài)行為,以便服務(wù)在測試運行之間返回適當(dāng)?shù)捻憫?yīng),以表示AUT期望的實際值。
虛擬化服務(wù)對測試的輸入做出反應(yīng),并根據(jù)需要保留值,從而擴展了捕獲和模擬的測試數(shù)據(jù)的有用性,除非通過有狀態(tài)行為加以增強,否則這些數(shù)據(jù)將保持靜態(tài)。在Parasoft Virtualize中,服務(wù)被虛擬化為“CRUD”(創(chuàng)建、讀取、更新、刪除),以指示其測試數(shù)據(jù)源是持久性的,并且可以在測試過程中根據(jù)需要進行操作。請參見下面的屏幕截圖:
Parasoft Virtualize支持與每個虛擬服務(wù)關(guān)聯(lián)的測試數(shù)據(jù)源(或引擎)中的狀態(tài)行為,該狀態(tài)行為不僅存儲測試數(shù)據(jù),而且還提供CRUD工具以根據(jù)對收到的API請求的反應(yīng)來操縱數(shù)據(jù)。測試日期源中數(shù)據(jù)的這些更新基于輸入事件(如上面狀態(tài)轉(zhuǎn)換圖中討論的那些更新——輸入事件到達,狀態(tài)轉(zhuǎn)換發(fā)生,操作發(fā)生)。
為了支持所有這些,Parasoft Virtualize中的測試數(shù)據(jù)管理工具被配置為基于數(shù)據(jù)源和到達事件執(zhí)行更新:
測試日期源的更新可以是單個數(shù)據(jù)項,也可以是整個對象。該工具還允許您根據(jù)所需的業(yè)務(wù)規(guī)則創(chuàng)建和刪除記錄。實際上,它足夠強大,可以模擬復(fù)雜的行為,這就引出了一個問題:何時進行過多的模擬,過多的模擬?
有狀態(tài)虛擬化的利與弊
使用純虛擬化在測試中非常有幫助,因為它消除了處理真實服務(wù)的復(fù)雜性并隔離了受測應(yīng)用程序。此外,刪除實時服務(wù)意味著可以在多個桌面上同時并行運行測試,而不會影響生產(chǎn)系統(tǒng)或?qū)Ψ?wù)的專用副本的需求。但是,純虛擬服務(wù)器僅返回確認,如“是,已調(diào)用此API”。在很多情況下,這是足夠的,當(dāng)然,直到事實并非如此。隨著越來越復(fù)雜的用例的出現(xiàn),我們需要虛擬化的服務(wù)器來“提高智能”。
使用上面的購物車示例,您的虛擬購物服務(wù)不僅要確認已將商品添加到購物車中,還可以模擬向購物車中添加商品,這對您的虛擬購物服務(wù)更加有用。這樣,確定購物車中物品數(shù)量的查詢將以正確的值成功執(zhí)行。我們還可以模擬“購物車已滿”狀態(tài),如上述狀態(tài)機表示中所述。有狀態(tài)的行為對于使我們的測試獲得更有意義的結(jié)果并增加用例的覆蓋范圍是必要的。
但是有一點使模擬業(yè)務(wù)邏輯變得太復(fù)雜了。虛擬化的目的是減少工作量并提高生產(chǎn)率,因此模擬復(fù)雜性的回報越來越小。界限很難說,但是如果復(fù)雜度遠遠超出了我們的購物車或登錄示例,那么很難證明這一努力的合理性。您如何確定模擬的行為正確?您不希望您的應(yīng)用程序被構(gòu)建為可與模擬服務(wù)一起使用,但實際上卻無法正確地與真實服務(wù)一起使用!驗證仍然需要使用實時服務(wù)(幸運的是,Parasoft的Environment Manager模塊使切換變得容易)。
總結(jié)
有狀態(tài)行為是創(chuàng)建現(xiàn)實的虛擬化服務(wù)的關(guān)鍵部分,有助于隔離測試中的應(yīng)用程序。保留測試之間的測試數(shù)據(jù)狀態(tài)的能力對于更實際和有用的測試是必需的。 Parasoft Virtualize提供了全面的測試數(shù)據(jù)管理解決方案,通過對API調(diào)用的輸入進行有狀態(tài)且基于狀態(tài)的響應(yīng),使虛擬化服務(wù)的生命得以延續(xù)。
應(yīng)當(dāng)謹慎使用模擬,因為模擬復(fù)雜的業(yè)務(wù)邏輯的收益遞減,并且有可能偏離“真實事物”。明智地使用模擬在隔離方面帶來了巨大的好處,這反過來又解除了對實時服務(wù)器的依賴。但是,由于實時服務(wù)器仍在最終驗證中發(fā)揮作用,因此需要諸如Parasoft Virtualize之類的服務(wù)虛擬化工具來無縫支持這些環(huán)境的混合和匹配。