基于 SWTBot 进行 Eclipse GUI 自动化测试
背景簡介
在軟件開發領域,持續集成和部署對于軟件測試自動化提出了越來越高的要求,基于 Eclipse 應用在這一需求中仍然占據重要的組成部分。目前主流的測試自動化工具主要以錄制回放的功能為主,輔助以腳本的方式實現。然而,基于此的測試方法往往具有測試用例維護復雜,測試過程容易失敗的問題,這直接影響了測試效率。
SWTBot 作為 Eclipse 官網推薦的自動化測試工具,提供了專業的類庫以及擴展點,在 Eclipse 應用的自動化測試中具有先天的優勢。
SWTBot 是基于 Eclipse SWT 的開源的 UI 和功能測試工具,具備簡單易用的 API 支持,對于基于 Eclipse 富客戶端 (Rich Client Platform) 搭建的應用具有天然的兼容性,使之能夠幫助用戶快速有效地構建特定應用的自動化測試框架。
目前,大部分 Eclipse 自動化測試工具主要采用錄制-回放的工作模式創建測試用例,同時通過腳本來維護業務邏輯,往往一個測試要涉及到多個腳本的維護,這大大提高了對于測試人員的要求,而錄制-回放的方式也由于其機制的不穩定性,往往使得測試無法在特定的時間內得到準確的結果。
SWTBot 自創建至今,已在 Eclipse 社區得到極大地改進和推廣,使之日趨穩定和成熟。本文提出一種基于 XML 描述測試用例、同時支持用戶 UI 操作語言的測試框架,意在能夠:
體系結構
本文基于 SWTBot 的開源框架,擴展其對于 Eclipse 基本控件的支持、封裝和實現操作元語言,改進其效率,實現了一種在較低維護成本下便能夠適應新場景的自動化測試框架。同時,本文中提出,所用測試用例基于 XML 進行描述,提供統一的測試描述語言及解析方式。
該自動化測試框架(以下簡稱“該框架”)的體系結構如下圖所示:
圖 1. 基于 SWTBot 的 Eclipse UI 自動化測試框架體系結構
作為該框架的唯一輸入,我們采用 XML 作為統一描述測試用例的語言。在下文中,將介紹我們從特定應用中抽象并定義的 XML 元語言及操作,一個復雜的測試步驟將由若干元語言及操作構成,測試步驟的集合構成測試用例 (Test Case),測試用例的集合構成測試集 (Test Suit)。
該框架最底層包含了 SWTBot 類庫,在該類庫中,實現了對于 Eclipse 基本控件的識別與檢索方式。從下而上,在該框架的倒數第三層中,我們在 SWTBot 基礎類庫的基礎上,擴展實現了針對特定控件的支持,譬如分頁組合的控件,從而確保在測試執行中,可以方便找到特定應用中的特定控件。這樣做的好處便在于,不同產品可以復用已實現的控件,同時擴展所需要的控件。同時,為提高控件檢索的效率,以及支持測試邏輯的實現,我們實現了 Utilities 工具集,用來維護測試用例中的標準輸入輸出,以及生成測試結果的源數據,并且加快執行效率。
在該框架的最頂層,是對標準輸入 XML 格式的測試用例的支持。通過屬性文件的定義,該框架能夠快速解析在特定目錄下所有測試集,并建立先后執行的順序,依次執行,同時記錄每個測試步驟的執行狀態,并且根據屬性文件中的定義,判斷遇到錯誤是退出或是繼續執行。
測試用例
基于 XML 的測試用例描述
現在,我們站在一個測試人員的角度來演示一下,利用這個擴展的 SWTBot 測試框架,測試人員的工作將變得多么的簡單。而且,通過使用 XML 作為測試用例的描述工具,更加方便了測試人員撰寫測試用例的過程,大大降低了對測試人員編碼能力的要求,使測試人員能夠專注在撰寫 XML 測試用例這一件唯一的事情上。
創建測試工程
第一步,測試人員需要創建一個空的工程。比如,這里測試人員創建了一個名為“com.ibm.team.enterprise.swtbot.sample”的測試工程。緊接著,測試人員又創建一個文件夾 sampleTestsuit 來放置測試描述文件。這個文件夾下包含了一個 Properties 文件夾,用來存放屬性文件。然后,測試人員可以根據需要添加若干個測試用例 (Test Case),這里我們添加了 2 個測試用例:SampleTestCase1.xml 和 SampleTestCase2.xml。這樣,測試工程就創建好了,它的結構如圖所示:
圖 2:基于 XML 描述的測試工程結構圖
接下來,測試人員所有的工作就是專注在寫 XML 測試用例上。并且,通過 Eclipse 自帶的 XML 編輯器,測試人員甚至都不需要關心 XML 的語法,只需要在模板里面一步一步添加 Command 并提供相應的值即可。
圖 3:用 XML 文件來描述 GUI 測試用例
舉一個例子,假設測試人員希望在 FirstTestStep 的最后一個 Command 之后再添加一個點擊按鈕的動作。那么他只需要右擊選擇”Add After”,選擇 Command 選項。然后用同樣的方法給這個 Command 命令添加屬性,這真的非常簡單,大大方便了測試人員的工作。
Properties 配置文件
在一個測試工程里,Properties 配置文件定義了一系列的鍵/值對。Propertires 文件的作用有兩個。第一個作用是定義變量,以便可以在 XML 測試用例中引用它們。引用變量的方法也很簡單,通過${變量名} 的格式來引用即可。比如上面的例子中${BUTTON_SUMMIT} 就引用了 sampleTestSuite.properties 文件中定義的變量 BUTTON_SUMMIT,這對于提高 XML 測試用例的移植性和擴展性都很有幫助。Properties 配置文件的第二個作用是外部化,UI 上的所有 Widget 文本都被賦予一對唯一的鍵/值,這樣在 UI 全球化過程中,不同的 Widget 文本根據不同的語言環境設置不同的值,這時候,Properties 文件中定義的這些外部化變量就顯得尤為重要。
圖 4: 測試工程的 Properties 屬性文件
框架實現
SWTBot 作為 Eclipse 官方推薦的 UI 自動化測試工具,它本身是基于 Hamcrest 和 JUnit 來執行用 Java 語言寫成的測試用例 (TestCase) 和測試集 (TestSuit)。但是這樣就要求測試人員必須要精通 Java 語言并且能夠熟練掌握 JUnit。由于我們改變了 SWTBot 的執行目標文件并使之成為我們自定義的 XML 形式的測試用例文件,實現了一個基于 XML 語言的 Eclipse UI 自動化測試框架。這樣,測試人員從此可以擺脫繁重的代碼工作,把工作重心放到實際測試對象的業務邏輯上。利用 SWTBot 最核心的測試 UI 的執行部件,加上對其核心部件 Finder、Matcher、Widget、Condition 以及 Assert 等的擴展和豐富,構成了該框架實現的主要內容。
原生 SWTBot 的執行原理
在詳細介紹該框架如何實現之前,首先大家需要對 Eclipse 自身的架構有一個深入的認識,什么是插件 (Plug-in),什么是擴展點 (Extension Points),什么是擴展 (Extensions),什么是依賴 (Dependencies),什么是 OSGI(開放服務網關協議) 等等。然后需要了解 Eclipse 富客戶端 (RCP) 的主要組成部分工作平臺 (Workbench),視圖 (View),編輯器 (Editor) 和透視圖 (Perspective) 的基本原理和基本操作。這些基礎知識請到參考資料中自行學習,這里就不再累述。 接下來我們來了解一下 SWTBot 的基本執行原理和執行順序。我們使用 SWTBot 就是要模擬用戶對于 Eclipse RCP 應用的各個部件的操作并且加入驗證點來檢驗操作執行的結果。 SWTBot 本身是 Eclipse 的一個應用程序 (Application),只是實現了 Eclipse 本身的一個測試接口 ITestHarness。當被測試的應用程序啟動以后,Eclipse 就會啟動 SWTBot 這個應用程序,來加載通過命令行定制的 JUnit 的測試用例和測試集,接著通過 SWTBot 的 SWTWorkbenchBot 工廠類在被測試程序里面去尋找工作平臺,以及在工作平臺上撿索被測試的部件來初始化對應的 SWTBot 部件實例,通過對這個 SWTBot 的部件實例進行相應的操作,最后將操作的執行結果返回給 SWTBot 進行驗證。乍一看,整個執行過程比較簡單,似乎使用起來也是水到渠成。但是調用哪一個 SWTBotFactory 工廠類提供的靜態方法獲得相應的被測試控件對應的 SWTBot 對象,以及對對象進行操作都需要深入了解富客戶端程序的基本構成和操作本質。我們的框架簡化了對于控件的檢索和操作,只需要按照我們定義的 XML 元數據的規范指定簡單的 XML 元素和設置相應的屬性值,就可以方便地查找元素、操作元素和設定測試的驗證點。
基于 SWTBot 基本控件的擴展
我們的框架首先在 SWTBot 的 Finder 組件中加入了對于多層編輯器 (MultipleEditor) 和編輯器里面的每個章節(Section)的支持。這樣用戶可以方便地有針對性的對這種復雜的編輯器和章節進行對應的測試操作,而不用像 SWTBot 原來那樣在籠統的一種基本的編輯器里面操作。然后,在 SWTBot 的 Widget 組件中,新加入了對組合部件 (Composite)、滾動表單 (ScrolledForm) 和表單頁面 (FormPage) 等部件的支持。最后,特別在 SWTBot 的 Matcher 組件里增加根據不同條件尋找部件的方法和豐富了多級右鍵菜單的操作方式,進一步擴展了原來 SWTBot 不能很好支持的領域,大大增強了 SWTBot 在 Eclipse RCP 自動化測試上的測試能力。
圖 5:對 SWTBot 的 Matcher 組件的擴展
圖 6:對 SWTBot 的 Widgets 組件的擴展
提高控件檢索效率的方法
對于 SWTBot 檢索控件的原理,如果大家詳細的研讀過它的源碼,應該非常清楚。SWTBot 對于每一個 SWT 的控件都有一個對應的 Bot 對象來封裝對于這個控件的操作和獲得控件的屬性及狀態。同時 SWTBot 有一個 SWTWorkbenchBot 類,它是 SWTBot 里面幾乎所有 Bot 對象的工廠類,是尋找這些 Bot 對象的基本入口。這個工廠類一般都是直接被創建出來,默認檢索控件的路徑就是從 Eclipse RCP 的總工作平臺 (Workbench) 開始,然后從這個工作平臺的所有視圖、菜單、右鍵菜單、工具欄、狀態欄和編輯器等地方去尋找需要測試和操作的控件對象,進而創建出 Bot 對象。這種控件檢索方式下,執行效率肯定很低。我們的自動化框架優化了這種籠統的檢索控件的方法,增加一個叫做操作區域 (Operation Area) 的對象,能夠精確的將檢索開始的地方定位到相應控件被包含的視圖或者編輯器,縮小檢索的范圍,增加檢索的準確性,提高了 SWTBot 的運行效率。
清單 1:獲得操作區域的核心代碼
1 OAType oaType = oa.getType(); 2 String id = ModelUtil.getLastOutputValue(oa.getID(), lastStepOutput); 3 String title = ModelUtil.getLastOutputValue(oa.getText(), 4 lastStepOutput); 5 SWTBotWorkbenchPart<? extends IWorkbenchPartReference> oaPart = null; 6 if (OAType.VIEW == oaType) { 7 oaPart = bot.showView(id, title); 8 } else if (OAType.EDITOR == oaType || OAType.TEXTEDITOR == oaType) { 9 if (null != id && id.length() > 0) { 10 oaPart = bot.editorById(id); 11 } 12 if (null == oaPart && null != title) { 13 oaPart = bot.editorByTitle(title); 14 } 15 if (OAType.TEXTEDITOR == oaType && null != oaPart 16 && oaPart instanceof SWTBotEditor) { 17 oaPart = ((SWTBotEditor) oaPart).toTextEditor(); 18 } 19 } else if (OAType.EEMULTOPLE_EDITOR == oaType) { 20 if (null != id && id.length() > 0) { 21 oaPart = bot.multipageEEEditorById(id); 22 } 23 if (null == oaPart && null != title) { 24 oaPart = bot.multipageEEEditorByTitle(title); 25 } 26 if (null == oaPart && null == title && null == id) { 27 oaPart = bot.getActiveEditor(); 28 } 29 } else if (OAType.PERSPECTIVE == oaType) { 30 SWTBotPerspective perspective = null; 31 if (null != id && id.length() > 0) { 32 perspective = bot.perspectiveById(id); 33 } 34 if (null == oaPart && null != title) { 35 perspective = bot.perspectiveByLabel(title); 36 } 37 if (null != perspective && !perspective.isActive()) { 38 perspective.activate(); 39 EESWTBotAssert.assertPerspectiveActivate(perspective); 40 if (null != title && title.length() > 0) { 41 Assert.assertEquals( 42 "The founded operation area is not exepcted.", 43 title, perspective.getLabel()); 44 } 45 } 46 } 47?
結束語
對于做過自動化測試的人員,相信大家都有體會,跟 Web 測試等其它領域比起來,本地 GUI 的自動化測試一直是比較難的部分,一直以來就沒有一種既穩定高效又輕量級的 GUI 測試工具出現。另一方面,相比年輕的 Web 領域,本地 GUI 一直還是占據著軟件開發市場很大的一部分,尤其是 Eclipse 等富客戶端一直是企業軟件從業人員開發的必備利器。所以,開發本地 GUI 的自動化測試工具,對于人力成本和時間的節省也是巨大的。
SWTBot 是開源的基于 Eclipse SWT 的 UI 和功能測試工具,通過這篇文章,相信大家對于我們這個基于 SWTBot 的 GUI 自動化測試框架有了一定的了解。由于只需要專注在寫 XML 測試用例這一件事情上,對于廣大的測試人員開發出高質量可重用的測試用例是有很大幫助的。本系列的第一篇文章暫告一段落,后續文章將更詳細地介紹基于 SWTBot 擴展的 GUI 自動化的流程細節和場景,敬請期待。
參考資料
學習
- 參考Eclipse SWTBot 開源社區:下載最新版本 SWTBot 并了解最新資訊
- 參考Eclipse SWT 官方主頁:下載 SWT,關注開源 GUI 框架的動態
- 參考Eclipse RCP Wiki 頁:關注 RCP, 了解 Eclipse 平臺最核心的技術
- 參考OSGI 的官方主頁:面向 Java 的動態模型系統,面向服務的架構
- developerWorks Java 技術專區:這里有數百篇關于 Java 編程各個方面的文章。
轉載于:https://www.cnblogs.com/zoucaitou/p/4189929.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的基于 SWTBot 进行 Eclipse GUI 自动化测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Android Sutdio调试NDK
- 下一篇: 加载的图片还会有未来吗?