解決多通道測試的挑戰(zhàn)
多通道 描述的是具有多個(gè)界面的應(yīng)用程序。隨著我們從桌面發(fā)展到基于 Web 的計(jì)算甚至是移動(dòng)計(jì)算,多通道越來越常見。由于設(shè)備(平板、手機(jī)、 筆記本電腦、臺式計(jì)算機(jī))以及與設(shè)備交互方式(特定于設(shè)備的 “應(yīng)用程序”、瀏覽器和傳統(tǒng)的客戶端應(yīng)用程序)的組合,同一個(gè)應(yīng)用程序的界面越來越多。比如,使用相同業(yè)務(wù)邏輯的面向 Web 應(yīng)用程序、移動(dòng)應(yīng)用程序甚至是一個(gè) CLI(命令行界面)的銀行應(yīng)用程序。由于面向服務(wù)的架構(gòu) (SOA) 和 Web 服務(wù)日益流行,在很多情況下,集成者要做的工作就是把服務(wù)與新的前端重新組合。但業(yè)務(wù)邏輯(亦稱服務(wù))則保持相同。
以開發(fā)團(tuán)隊(duì)重用代碼來減少維護(hù)成本并提高生產(chǎn)效率相同的方式,要跟上開發(fā)團(tuán)隊(duì),測試團(tuán)隊(duì)就需要一些方法來重用測試場景并實(shí)現(xiàn)自動(dòng)化。
應(yīng)對多通道測試的挑戰(zhàn)
幾年前,我是一名自動(dòng)化測試架構(gòu)師,負(fù)責(zé)為具有多個(gè)界面的兩個(gè)(而不是一個(gè))應(yīng)用程序構(gòu)建所有的自動(dòng)化。二者都有遺留的 “本地” 用戶界面,使用的是 Microsoft Windows 32 位 MFC (Microsoft Foundation Class) 控件、一個(gè)使用了 JavaScript 的 Web 界面、ASP 和 JSP(Active Server Pages 和 JavaServer Pages)、一個(gè)新的(更新的)Eclipse SWT (Standard Widget Toolkit) 界面以及一個(gè)命令行界面。當(dāng)然,不可能找到對所有這些界面均有效的自動(dòng)化工具,但我們可以暫時(shí)將其放到一邊。
編程時(shí),您往往會(huì)專注于通 過促進(jìn)重用減少需要維護(hù)的代碼量。有了面向?qū)ο蟮木幊毯椭貥?gòu),很少有理由需要在多個(gè)地方具有相同的代碼了。但是需要設(shè)計(jì)一個(gè)架構(gòu),這樣我就可以考慮如何從 一個(gè)單一的測試自動(dòng)化代碼庫解決多個(gè)界面的測試。首先,盡管它們是同一個(gè)應(yīng)用程序的所有界面,但并不是所有的界面都會(huì)浮現(xiàn)相同的功能,更不用說使用同樣的 方式了。但也有許多以客戶為中心的場景(用例),這對跨所有界面進(jìn)行測試很有意義。
然而,負(fù)責(zé)設(shè)計(jì)測試用例和測試計(jì)劃的測試團(tuán)隊(duì)沒有以這種方式考慮他們的測試。事實(shí)上,他們是分離的,并根據(jù)他們所要處理的界面以豎井方式分離。構(gòu)建并測試了該 CLI 的團(tuán)隊(duì)認(rèn)為他們只需要少量的客戶場景測試。他們主要集中于單元測試, 并沒有真正考慮通過 CLI 的一個(gè)客戶流。負(fù)責(zé) Eclipse UI 的測試團(tuán)隊(duì)想要大量的 UI 特性和自動(dòng)化的功能。他們有一長串需要執(zhí)行的測試用例,要實(shí)現(xiàn)這個(gè)目標(biāo),需要完全專注于客戶流。但是,我們?yōu)槭裁淳筒荒苁褂糜芍黝}專家 (SME) 為應(yīng)用程序煞費(fèi)苦心完成的用來測試所有界面的這些信息呢?
一種層次結(jié)構(gòu)方式
使用 面向?qū)ο蟮木幊?(OOP) 的典型測試自動(dòng)化框架一般會(huì)抽象化控制集的實(shí)現(xiàn)細(xì)節(jié),而不是通過控件表達(dá)的概念性操作。這實(shí)際上是許多商業(yè) GUI 自動(dòng)化工具使用的方式。例如,所有文本字段會(huì)接受文本,用 setText(string) 方法定義一個(gè)文本字段類,并在此應(yīng)用程序的所有版本上使用它。但這并不適用于跨界面構(gòu)建自動(dòng)化測試的所有情況。當(dāng)一個(gè) GUI 使用單選按鈕而另一個(gè)使用復(fù)選框時(shí)會(huì)發(fā)生什么呢?您實(shí)際上不能對于相同操作依靠于同一界面。以下顯示了這種傳統(tǒng)的 OOP 方式。
圖 1. GUI 控制層次結(jié)構(gòu)
在我們的示例中,界面的差異很大,但所代表的操作和業(yè)務(wù)流程則實(shí)質(zhì)上相同。為了最大化重用,我們選定了一個(gè)業(yè)務(wù)邏輯層次結(jié)構(gòu)(參見圖 2)以跨多個(gè)界面重用測試場景。這不僅能最大化我們的代碼重用,還意味著將會(huì)依賴測試工具來管理 GUI 界面,而這正是他們的設(shè)計(jì)初衷。圖 2 顯示了此方式,您可能已經(jīng)識別出了這個(gè)抽象工廠模式。
圖 2. 業(yè)務(wù)邏輯層次結(jié)構(gòu)
圖 3. 抽象類的代碼示例
Query 是一個(gè)抽象類,收集創(chuàng)建和執(zhí)行查詢所需的有趣數(shù)據(jù),以及有趣操作,如運(yùn)行、創(chuàng)建、編輯和重命名。重命名方法需要新名稱的額外參數(shù),但當(dāng)它成功后,會(huì)自動(dòng)更 新此查詢對象的名稱值。在這個(gè)級別對用戶界面沒有假設(shè)。用戶界面的細(xì)節(jié)只在特定于界面的具體類內(nèi)表達(dá)。要在一個(gè)給定的界面上執(zhí)行,需要在運(yùn)行時(shí)為每個(gè)界面 實(shí)例化一個(gè)具體類并調(diào)用此操作,具體類似于如下所示:
Query myQuery = (parent_location, findRecords); myQuery.rename(renamedQuery); |
基于應(yīng)用程序的框架
定義用來描述測試所需操作的抽象業(yè)務(wù)邏輯類的一個(gè)后果是可以將所定義的方法重組成新的流。此外,還可以指定在運(yùn)行時(shí)運(yùn)行哪個(gè)界面。這是一個(gè)強(qiáng)大的組合,可以完成幾件事情:
● 針對此應(yīng)用程序的操作只定義一次
● GUI元素只被發(fā)現(xiàn)和處理一次
● 為一個(gè)界面設(shè)計(jì)的測試場景可以在另一個(gè)界面上運(yùn)行
● 因重用的增加,維護(hù)顯著減少
當(dāng)然,這其中的訣竅是在每個(gè)要測試的界面內(nèi)如何對任何給定的操作進(jìn)行編碼。這需要面對大量的工作,但在一個(gè)界面完成后,有許多測試腳本可用于任何其他的界面。而這就是必須為每個(gè)后續(xù)界面要實(shí)現(xiàn)的全部步驟:
● 添加在該界面上執(zhí)行操作所需的實(shí)際步驟
● 補(bǔ)充此框架來涵蓋其他界面內(nèi)所沒有的任何功能
清單 1 是與 Eclipse 視圖交互的一個(gè)示例代碼。
清單 1. 與 Eclipse 視圖交互的代碼
Perspective resource = new Perspective("Resource"); Perspective general = new Perspective("General"); app.start(); EclipseView bookmarks = new EclipseView("Bookmarks", resource); EclipseView explorer = new EclipseView("Project Explorer",general); resource.open(); resource.reset(); bookmarks.open(); explorer.open(); bookmarks.switchTo(); explorer.switchTo(); bookmarks.maximize(); bookmarks.restore(); bookmarks.minimize(); bookmarks.restore(); bookmarks.close(); resource.reset(); app.exit(); |
采用這種方法可以降低維護(hù)成本,并能確保對于 GUI 的任何部分,在自動(dòng)化測試代碼內(nèi)都只需在一個(gè)地方進(jìn)行調(diào)整。但這種方法的好處只有在 CLI 上實(shí)現(xiàn)了進(jìn)行業(yè)務(wù)邏輯的具體步驟之后才會(huì)變得真正清晰。
負(fù)責(zé)測試該特性的團(tuán)隊(duì)已宣布 “完成”,且沒有明顯的缺陷。自動(dòng)化的實(shí)現(xiàn)是為了為未來版本確保一個(gè)回歸測試套件。但是當(dāng)我們運(yùn)行用來針對此 CLI 實(shí)現(xiàn)測試 GUI 的測試腳本時(shí),就會(huì)發(fā)現(xiàn) 50 多個(gè)缺陷!這些都是重要的缺陷,肯定會(huì)被我們的客戶發(fā)現(xiàn)。
作為測試人員,我們總是很興奮能首先發(fā)現(xiàn)缺陷,因?yàn)樵缙诎l(fā)現(xiàn)問題能明顯節(jié)約成本。另外,構(gòu)建不只能驗(yàn)證產(chǎn)品穩(wěn)定性的測試自動(dòng)化也很令人興奮。同樣重要的就是信譽(yù)、既有的顧客滿意度,以及此測試自動(dòng)化所帶來的整體質(zhì)量改進(jìn)方面的商業(yè)利益。
如今的多通道測試
在上述的項(xiàng)目過程中,我們可以在運(yùn)行時(shí)只選擇一個(gè)界面。一個(gè)測試腳本必須是完全自動(dòng)化的,且必須要有為每個(gè)需要測試的界面實(shí)現(xiàn)的一個(gè)完整的業(yè)務(wù) 邏輯操作集。這種方式在當(dāng)時(shí)是合理的也是可以接受的,這是因?yàn)樽罱K用戶一般不會(huì)在一組操作期間從一個(gè)桌面客戶端切換到一個(gè) Web 客戶端。
但時(shí)過境遷。現(xiàn)在考慮一個(gè)可能開始于 Web 客戶端、穿過一個(gè)移動(dòng)應(yīng)用程序、然后再回到 Web 的測試場景,甚或是一個(gè)針對數(shù)據(jù)庫后端的獨(dú)立驗(yàn)證已不再符合實(shí)際了。
考慮這樣一個(gè)場景:有人在 eBay 競價(jià)。使用一個(gè)臺式計(jì)算機(jī)和瀏覽器(Web 客戶端)對商品進(jìn)行搜索和研究更容易。一旦決定了想要的商品,就可以進(jìn)行競價(jià)。您可以離開計(jì)算機(jī),并在您的智能手機(jī)收到一個(gè)通知,告知您競價(jià)勝出,于是您 從手機(jī)上更新出價(jià)。當(dāng)贏得競價(jià)時(shí),您再回到計(jì)算機(jī)前,在瀏覽器中輸入付款信息。
這是一個(gè)測試場景,與其從屏幕上此界面的一個(gè)部分(使用屏幕抓取或?qū)ο髮傩裕┲序?yàn)證交易的成功,還不如直接使用數(shù)據(jù)庫并檢查記錄。這種獨(dú)立于界 面的驗(yàn)證更健壯,也更穩(wěn)定。我們可以把這種方式稱為 “混合” 測試場景。并且,從理論上來說,當(dāng)自動(dòng)化一些產(chǎn)品區(qū)域太難(或過于昂貴)時(shí),混合場景應(yīng)該允許混合進(jìn)手動(dòng)測試執(zhí)行來提高測試覆蓋率。
所以,我已經(jīng)開始幻想如何能實(shí)現(xiàn)這樣一個(gè)流,于是我將不同的界面和操作實(shí)現(xiàn)拼裝成一個(gè)能在界面之間無縫移動(dòng)的復(fù)雜流。可以肯定的是,的確存在挑 戰(zhàn),并且挑戰(zhàn)可能會(huì)不可逾越。而了解了當(dāng)運(yùn)行時(shí)環(huán)境受制約時(shí)哪些數(shù)據(jù)在操作間移動(dòng)則會(huì)相對簡單得多。而當(dāng)跨越界面時(shí),哪些數(shù)據(jù)可能需要在操作間傳輸則不能 立即清晰。使用上面的示例,將需要先登錄到一個(gè) Web 客戶端和移動(dòng)電話。身份驗(yàn)證明顯是個(gè)問題,但實(shí)現(xiàn)這些混合測試場景注定會(huì)有很多并發(fā)問題。
posted on 2013-06-03 13:31 順其自然EVO 閱讀(502) 評論(0) 編輯 收藏 所屬分類: 測試學(xué)習(xí)專欄 、管理方向