創(chuàng)建一個有效的GUI自動化框架
一個良好的自動化測試框架應(yīng)該具備靈活的,與應(yīng)用程序無關(guān)的,與技術(shù)無關(guān)和不過時的特點。本文強調(diào)的準(zhǔn)則可以幫助開發(fā)者深層分析測試方案中的代碼。這種能力已經(jīng)被證明在多個自動化項目上是有效的。
“自動化框架”這個術(shù)語已經(jīng)為軟件測試領(lǐng)域所熟知。盡管很多人都把它與應(yīng)用在基于UI自動化的技術(shù)聯(lián)系起來,但是它幾乎總是被濫用于那些參與測試領(lǐng)域。這大部分的原因是由于大家對自動化框架的應(yīng)用領(lǐng)域有誤解。它應(yīng)該不僅僅像Coded UI那樣,只是一個單純的UI技術(shù)。
現(xiàn)在,市場上有很多商業(yè)性的和開源的測試自動化框架。使用這些框架的主要問題在于調(diào)整他們的學(xué)習(xí)曲線和滿足自動化項目的要求的困難性。雖然有一些廣泛應(yīng)用的遺留框架,但是他們還是有很多缺點。
他們?nèi)狈`活性,再使用昂貴的第三方產(chǎn)品——或者,添加一個單純的現(xiàn)有用戶界面技術(shù),但不提供額外的價值。
一個良好的自動化測試框架應(yīng)該具備靈活的,與應(yīng)用程序無關(guān)的,與技術(shù)無關(guān)和不過時的特點。它應(yīng)該支持一個易于安裝和使用的結(jié)構(gòu)化和模塊化的編程模型。說“易于使用”,我們是假設(shè)和期望用戶是有經(jīng)驗的軟件開發(fā)人員。自動化是發(fā)展和正確的軟件工程技能,對于計劃和成功得實施一套自動化是有需要的。
開發(fā)一個基于UI功能自動化系統(tǒng)背后的想法是,運用這一框架來提高代碼的可重用性、穩(wěn)定性和可維護(hù)性。該代碼應(yīng)該是容易編寫、調(diào)試、部署和運行,發(fā)生失敗應(yīng)該易于分析。不管你使用Ranorex,Coded UI,Telerik或Selenium
作為底層自動化技術(shù),設(shè)計和實現(xiàn)自動化的解決方案都應(yīng)該是相同的。我們選擇去建議和實施的范式和模式是任何開發(fā)項目的最佳實踐,但他們對于UI自動化尤其有用。
我們已經(jīng)在外面公司對幾個不同的項目創(chuàng)建了自動化框架。在一些類似的模式中,我們可以提取其中的相同之處。這些項目的主要問題與方法和可重用性的不同相關(guān)。除此之外,不同的團(tuán)隊通過使用不同的自動化工具來測試應(yīng)用程序功能,這也導(dǎo)致了整體的難度。
一般來說,一個自動化框架可以被定義為一套可以為自動化軟件測試提供支持的假設(shè)、概念和工具。它有以下的功能:
﹒定義自動化測試腳本的方法
﹒提供建立聯(lián)系機(jī)制SUT(測試系統(tǒng))
﹒執(zhí)行測試和報告結(jié)果
﹒減少自動化項目啟動時間
﹒建立一個共同的標(biāo)準(zhǔn)
基本原則
讓我們假設(shè)我們有一個具有豐富的用戶界面和大量的控制的復(fù)雜的應(yīng)用程序,但它只有兩個屏幕。應(yīng)用程序是復(fù)雜的事實可能意味著它可以有幾十個手動功能測試例子。所有這些使用相同的兩個屏幕。那么,我們怎樣才能增加這樣的測試解決方案的可維護(hù)性
分層架構(gòu)模式
把軟件系統(tǒng)體系結(jié)構(gòu)分解為單獨的一層的想法是非常普遍的。第一個是邏輯展示層面,,第二個是業(yè)務(wù)邏輯層面,第三個層次是負(fù)責(zé)數(shù)據(jù)存儲。使用這種模式可以降低應(yīng)用程序的維護(hù)成本從每一層內(nèi)的組件可以改變而不影響其他的水平。同樣的方法可以應(yīng)用于測試系統(tǒng)。
測試代碼可以分為三層:
·為UI自動化工具訪問被測系統(tǒng)的接口層
·邏輯功能層
·測試用例層
每一層執(zhí)行某項任務(wù)時都有一個降低測試的費用維護(hù)和促進(jìn)創(chuàng)造一個新的測試的共同的目標(biāo)。
圖1:架構(gòu)原型,測試系統(tǒng)的多層體系結(jié)構(gòu)
Page Object
根據(jù)每個單獨的測試案例來創(chuàng)建單獨的測試邏輯、業(yè)務(wù)庫和UI Map,為我們提供了特殊能力來修改當(dāng)前測試用例。
讓我們假設(shè)我們的應(yīng)用程序是web郵件服務(wù)Gmail,并且兩個屏幕之一是登錄屏幕。登錄流程被所有測試用例中所使用。(例如,為了得到第二個屏幕,您需要執(zhí)行首先登錄到應(yīng)用程序)。
圖2:谷歌郵件登錄
讓我們假定UI中有一些東西改變了,但是不合邏輯的。在我們的特定情況下,每個登錄進(jìn)入Gmail的現(xiàn)在需要輸入驗證碼。
圖3:谷歌郵件登錄與驗證碼
這意味著每個測試案例現(xiàn)在應(yīng)該更新為新的登錄流程。但是一般來說,這只符合邏輯地更新一段代碼。此時Page Object和功能方法模式的作用就顯而易見。如果只有一個頁面對象宣布登錄屏幕和一個登錄方法,只需要兩個參數(shù)(即登錄名和密碼),然后只有身體的登錄功能方法需要更新,以涵蓋所有情況下與這種變化有關(guān)。
頁面的無縫銜接
頁面的無縫銜接的實現(xiàn)背后的想法是,在頁面對象的所有方法返回另一個頁面對象類實例(下一個SUT上下文頁面)。例如,登錄方法在我們的樣例返回主應(yīng)用程序默認(rèn)的屏幕。它使一系列步驟的功能測試用例編寫一個接一個,使這種用方法去鏈接。因此,業(yè)務(wù)方法本身就能夠通過IDE的智能感知,為測試腳本的開發(fā)人員的代碼提出建議。
面向切面編程
面向切面編程實現(xiàn)方面似乎是很有價值的,特別是如果你需要用特定方法到try-catch塊,或?qū)憟蟾嫒罩緱l目進(jìn)入/退出方法。這種方式,包含面向切面實現(xiàn)方面有助于提高自動化代碼,使它更具可讀性和可以理解的。
構(gòu)建/運行時驗證
自動化框架也經(jīng)常建議企業(yè)標(biāo)準(zhǔn)。大多數(shù)開發(fā)人員常將同樣的自動化方案應(yīng)用在不同的項目上,這是一個十分棘手的問題。所以,自動化框架可以提供一系列設(shè)施,去驗證在商業(yè)程序庫或者功能測試中的方法是否是最佳方案。
有不同的方法可進(jìn)行驗證:
·使用IDE擴(kuò)展/插件等可能設(shè)置自定義構(gòu)建的規(guī)則(例如:ReSharper, StyleCop for Visual Studio)
·編寫自己的ID擴(kuò)展名
·編寫一個機(jī)制,可以驗證測試是否包含預(yù)期的屬性在運行,如果有什么不正確的在運行,它將因描述性的錯誤而失敗。
以下提供一些可被驗證的項目的簡單列表:
·測試腳本的命名
·有適當(dāng)?shù)淖⑨?描述
·業(yè)務(wù)方法的返回值/參數(shù)
·解決方案分層 (確認(rèn)不會有交叉層次訪問沖突在自動化代碼中出現(xiàn))。
·自動化測試框架的硬件支持
顯然,該框架不能只包括最佳實踐。沒有人能夠在沒有任何基礎(chǔ)設(shè)施來支持他們的情況下繼續(xù)做下去。以下提供的是一些有助于更好的理解自動化框架實現(xiàn)的指引。
首先我們需要以某種方式運行測試。在大多數(shù)情況下,單元測試框架是用于運行功能測試和衡量結(jié)果。有了各種技術(shù)/語言的支持,能夠為功能測試代碼和持續(xù)集成(CI)系統(tǒng)完美的結(jié)合提供了多種選擇的單元測試框架。
為測試運行加載配置
測試配置很大程度上取決于SUT域和測試細(xì)節(jié)。例如,在大多數(shù)測試流的所有配置(如參數(shù)、遠(yuǎn)程連接服務(wù)器等)可以只是在測試腳本中寫死的。
在數(shù)據(jù)驅(qū)動的測試中, 當(dāng)相同的測試可以使用不同的配置(例如,輸入?yún)?shù))多次運行的情況下,單元測試框架還提供從外部存儲設(shè)備讀取數(shù)據(jù)測試腳本。
因此,如果需要自定義配置加載的實現(xiàn)你的自動化框架的話,您需要仔細(xì)反復(fù)檢查。
報告測試結(jié)果
報告測試結(jié)果/調(diào)試測試信息是自動化框架的最重要的功能之一。
有以下幾個原因:
﹒報告分析簡化了測試應(yīng)用程序/故障排除,所以你的報告的信息越多,它提供的支持越好。
﹒報告是所有的項目經(jīng)手人觀察到的結(jié)果。
如果你想跟蹤測試執(zhí)行在一段時間內(nèi)的一些動態(tài)變化,你應(yīng)該運用額外的設(shè)備將測試結(jié)果永久地保存到數(shù)據(jù)庫,這樣就可以作比較。
別忘了把一些花俏的東西放進(jìn)報告表示層(xml / html),如公司標(biāo)志、結(jié)構(gòu)化輸出等。這些事情能夠極大地改善你的管理。如果你提供一個“時間”報告,圖表也需要高度重視。
驗證
再者,大多數(shù)單元測試框架已經(jīng)有一套支持在測試腳本中執(zhí)行Assert/Verify的機(jī)制。這是一個很好創(chuàng)建自己的驗證機(jī)制的實踐,以便:
﹒從一個特定的單元測試框架中抽象用例斷言
﹒為你的需求定制一套驗證方法
﹒添加特定的邏輯到您的驗證方法,讓您的驗證結(jié)果自動寫入報告
切面
自動化測試解決方案在不同的項目中大多是類似的。所以為現(xiàn)有解決方案增加自動化框架工具應(yīng)該是個簡單的事情。如果你想為現(xiàn)有項目提供更多實用價值,使用框架來減少遷移工作是很重要的。
這方面確實很有幫助。只需添加一個方面屬性定義到一個測試項目,一會兒你就會有一個廣泛的報告機(jī)制在您的測試解決方案中激活!當(dāng)然,它的實現(xiàn)需要一些高級方面,但這絕對是值得的。
關(guān)鍵詞
你可能覺得有趣的是,我們在這篇文章中沒有提及任何關(guān)鍵字驅(qū)動框架。關(guān)鍵字市場另一組可用的解決方案,包括商業(yè)的和開源的。可以肯定的是,已經(jīng)有成百上千的自定義關(guān)鍵字驅(qū)動框架存在。但是,我們發(fā)現(xiàn)他們是并不完整的。原因如下:
﹒他們沒有解決測試腳本的可維護(hù)性。他們中的大多數(shù)介紹是大量重復(fù)的。
﹒把關(guān)鍵字驅(qū)動框架緊密地綁定到特定的自動化工具(或者是一個UI自動化工具)的一部分,這使得在解決方案開發(fā)沒有變化。
結(jié)論
在本文中,我們描述了我們在自動化框架的實現(xiàn)中的一些經(jīng)驗。這篇文章強調(diào)的一些原則可以提供在深度上分析測試方案的代碼的能力,并被證明在多個自動化項目中是有效的。作為一個例子,其中一個我們已經(jīng)開發(fā)了大約500個業(yè)務(wù)場景與110個測試用例,每個測試用例平均30步驟(請注意,一步也可以由幾個業(yè)務(wù)方法調(diào)用)。所描述的方法使我們能夠達(dá)到每一個業(yè)務(wù)場景36倍的平均可重用性。
這是由你來決定你的自動化項目使用什么框架。也許這將是一個簡單的記錄/回放頁面工具與一群或者是一組關(guān)鍵字驅(qū)動腳本的表格。但是,當(dāng)涉及到自動化的一百多的測試用例時,您需要證明較高的成熟度級別來實現(xiàn)您的測試解決方案的可維護(hù)性。
Oleksandr Reminnyi作為SoftServe Inc的軟件工程師,SoftServe Inc是一家全球領(lǐng)先的外包產(chǎn)品和應(yīng)用開發(fā)公司。Oleksandr Reminnyi負(fù)責(zé)為新的和現(xiàn)有的客戶建立自動化項目和流程。他認(rèn)為,成功和失敗是完全取決于自動化建立過程是否設(shè)定正確的目標(biāo)。他目前正在他的博士學(xué)位致力于研究自動化。
David Krauss擁有超過30年的應(yīng)用經(jīng)驗和產(chǎn)品設(shè)計和交付,與廣泛的編程和跨多個平臺架構(gòu)經(jīng)驗,技術(shù),和語言。精通遺留資產(chǎn)現(xiàn)代化,全球協(xié)作開發(fā)過程,客戶機(jī)/服務(wù)器和網(wǎng)絡(luò)平臺,測試自動化(一個專利自動化,自動化生成一個專利申請中)。二十多年專業(yè)從事自動化測試工具和范例,自動化框架和測試方法。