基于 SWTBot 进行 Eclipse GUI 自动化测试
背景簡介
在軟件開發(fā)領(lǐng)域,持續(xù)集成和部署對于軟件測試自動化提出了越來越高的要求,基于 Eclipse 應(yīng)用在這一需求中仍然占據(jù)重要的組成部分。目前主流的測試自動化工具主要以錄制回放的功能為主,輔助以腳本的方式實現(xiàn)。然而,基于此的測試方法往往具有測試用例維護復(fù)雜,測試過程容易失敗的問題,這直接影響了測試效率。
SWTBot 作為 Eclipse 官網(wǎng)推薦的自動化測試工具,提供了專業(yè)的類庫以及擴展點,在 Eclipse 應(yīng)用的自動化測試中具有先天的優(yōu)勢。
SWTBot 是基于 Eclipse SWT 的開源的 UI 和功能測試工具,具備簡單易用的 API 支持,對于基于 Eclipse 富客戶端 (Rich Client Platform) 搭建的應(yīng)用具有天然的兼容性,使之能夠幫助用戶快速有效地構(gòu)建特定應(yīng)用的自動化測試框架。
目前,大部分 Eclipse 自動化測試工具主要采用錄制-回放的工作模式創(chuàng)建測試用例,同時通過腳本來維護業(yè)務(wù)邏輯,往往一個測試要涉及到多個腳本的維護,這大大提高了對于測試人員的要求,而錄制-回放的方式也由于其機制的不穩(wěn)定性,往往使得測試無法在特定的時間內(nèi)得到準確的結(jié)果。
SWTBot 自創(chuàng)建至今,已在 Eclipse 社區(qū)得到極大地改進和推廣,使之日趨穩(wěn)定和成熟。本文提出一種基于 XML 描述測試用例、同時支持用戶 UI 操作語言的測試框架,意在能夠:
體系結(jié)構(gòu)
本文基于 SWTBot 的開源框架,擴展其對于 Eclipse 基本控件的支持、封裝和實現(xiàn)操作元語言,改進其效率,實現(xiàn)了一種在較低維護成本下便能夠適應(yīng)新場景的自動化測試框架。同時,本文中提出,所用測試用例基于 XML 進行描述,提供統(tǒng)一的測試描述語言及解析方式。
該自動化測試框架(以下簡稱“該框架”)的體系結(jié)構(gòu)如下圖所示:
圖 1. 基于 SWTBot 的 Eclipse UI 自動化測試框架體系結(jié)構(gòu)
作為該框架的唯一輸入,我們采用 XML 作為統(tǒng)一描述測試用例的語言。在下文中,將介紹我們從特定應(yīng)用中抽象并定義的 XML 元語言及操作,一個復(fù)雜的測試步驟將由若干元語言及操作構(gòu)成,測試步驟的集合構(gòu)成測試用例 (Test Case),測試用例的集合構(gòu)成測試集 (Test Suit)。
該框架最底層包含了 SWTBot 類庫,在該類庫中,實現(xiàn)了對于 Eclipse 基本控件的識別與檢索方式。從下而上,在該框架的倒數(shù)第三層中,我們在 SWTBot 基礎(chǔ)類庫的基礎(chǔ)上,擴展實現(xiàn)了針對特定控件的支持,譬如分頁組合的控件,從而確保在測試執(zhí)行中,可以方便找到特定應(yīng)用中的特定控件。這樣做的好處便在于,不同產(chǎn)品可以復(fù)用已實現(xiàn)的控件,同時擴展所需要的控件。同時,為提高控件檢索的效率,以及支持測試邏輯的實現(xiàn),我們實現(xiàn)了 Utilities 工具集,用來維護測試用例中的標(biāo)準輸入輸出,以及生成測試結(jié)果的源數(shù)據(jù),并且加快執(zhí)行效率。
在該框架的最頂層,是對標(biāo)準輸入 XML 格式的測試用例的支持。通過屬性文件的定義,該框架能夠快速解析在特定目錄下所有測試集,并建立先后執(zhí)行的順序,依次執(zhí)行,同時記錄每個測試步驟的執(zhí)行狀態(tài),并且根據(jù)屬性文件中的定義,判斷遇到錯誤是退出或是繼續(xù)執(zhí)行。
測試用例
基于 XML 的測試用例描述
現(xiàn)在,我們站在一個測試人員的角度來演示一下,利用這個擴展的 SWTBot 測試框架,測試人員的工作將變得多么的簡單。而且,通過使用 XML 作為測試用例的描述工具,更加方便了測試人員撰寫測試用例的過程,大大降低了對測試人員編碼能力的要求,使測試人員能夠?qū)W⒃谧珜?XML 測試用例這一件唯一的事情上。
創(chuàng)建測試工程
第一步,測試人員需要創(chuàng)建一個空的工程。比如,這里測試人員創(chuàng)建了一個名為“com.ibm.team.enterprise.swtbot.sample”的測試工程。緊接著,測試人員又創(chuàng)建一個文件夾 sampleTestsuit 來放置測試描述文件。這個文件夾下包含了一個 Properties 文件夾,用來存放屬性文件。然后,測試人員可以根據(jù)需要添加若干個測試用例 (Test Case),這里我們添加了 2 個測試用例:SampleTestCase1.xml 和 SampleTestCase2.xml。這樣,測試工程就創(chuàng)建好了,它的結(jié)構(gòu)如圖所示:
圖 2:基于 XML 描述的測試工程結(jié)構(gòu)圖
接下來,測試人員所有的工作就是專注在寫 XML 測試用例上。并且,通過 Eclipse 自帶的 XML 編輯器,測試人員甚至都不需要關(guān)心 XML 的語法,只需要在模板里面一步一步添加 Command 并提供相應(yīng)的值即可。
圖 3:用 XML 文件來描述 GUI 測試用例
舉一個例子,假設(shè)測試人員希望在 FirstTestStep 的最后一個 Command 之后再添加一個點擊按鈕的動作。那么他只需要右擊選擇”Add After”,選擇 Command 選項。然后用同樣的方法給這個 Command 命令添加屬性,這真的非常簡單,大大方便了測試人員的工作。
Properties 配置文件
在一個測試工程里,Properties 配置文件定義了一系列的鍵/值對。Propertires 文件的作用有兩個。第一個作用是定義變量,以便可以在 XML 測試用例中引用它們。引用變量的方法也很簡單,通過${變量名} 的格式來引用即可。比如上面的例子中${BUTTON_SUMMIT} 就引用了 sampleTestSuite.properties 文件中定義的變量 BUTTON_SUMMIT,這對于提高 XML 測試用例的移植性和擴展性都很有幫助。Properties 配置文件的第二個作用是外部化,UI 上的所有 Widget 文本都被賦予一對唯一的鍵/值,這樣在 UI 全球化過程中,不同的 Widget 文本根據(jù)不同的語言環(huán)境設(shè)置不同的值,這時候,Properties 文件中定義的這些外部化變量就顯得尤為重要。
圖 4: 測試工程的 Properties 屬性文件
框架實現(xiàn)
SWTBot 作為 Eclipse 官方推薦的 UI 自動化測試工具,它本身是基于 Hamcrest 和 JUnit 來執(zhí)行用 Java 語言寫成的測試用例 (TestCase) 和測試集 (TestSuit)。但是這樣就要求測試人員必須要精通 Java 語言并且能夠熟練掌握 JUnit。由于我們改變了 SWTBot 的執(zhí)行目標(biāo)文件并使之成為我們自定義的 XML 形式的測試用例文件,實現(xiàn)了一個基于 XML 語言的 Eclipse UI 自動化測試框架。這樣,測試人員從此可以擺脫繁重的代碼工作,把工作重心放到實際測試對象的業(yè)務(wù)邏輯上。利用 SWTBot 最核心的測試 UI 的執(zhí)行部件,加上對其核心部件 Finder、Matcher、Widget、Condition 以及 Assert 等的擴展和豐富,構(gòu)成了該框架實現(xiàn)的主要內(nèi)容。
原生 SWTBot 的執(zhí)行原理
在詳細介紹該框架如何實現(xiàn)之前,首先大家需要對 Eclipse 自身的架構(gòu)有一個深入的認識,什么是插件 (Plug-in),什么是擴展點 (Extension Points),什么是擴展 (Extensions),什么是依賴 (Dependencies),什么是 OSGI(開放服務(wù)網(wǎng)關(guān)協(xié)議) 等等。然后需要了解 Eclipse 富客戶端 (RCP) 的主要組成部分工作平臺 (Workbench),視圖 (View),編輯器 (Editor) 和透視圖 (Perspective) 的基本原理和基本操作。這些基礎(chǔ)知識請到參考資料中自行學(xué)習(xí),這里就不再累述。 接下來我們來了解一下 SWTBot 的基本執(zhí)行原理和執(zhí)行順序。我們使用 SWTBot 就是要模擬用戶對于 Eclipse RCP 應(yīng)用的各個部件的操作并且加入驗證點來檢驗操作執(zhí)行的結(jié)果。 SWTBot 本身是 Eclipse 的一個應(yīng)用程序 (Application),只是實現(xiàn)了 Eclipse 本身的一個測試接口 ITestHarness。當(dāng)被測試的應(yīng)用程序啟動以后,Eclipse 就會啟動 SWTBot 這個應(yīng)用程序,來加載通過命令行定制的 JUnit 的測試用例和測試集,接著通過 SWTBot 的 SWTWorkbenchBot 工廠類在被測試程序里面去尋找工作平臺,以及在工作平臺上撿索被測試的部件來初始化對應(yīng)的 SWTBot 部件實例,通過對這個 SWTBot 的部件實例進行相應(yīng)的操作,最后將操作的執(zhí)行結(jié)果返回給 SWTBot 進行驗證。乍一看,整個執(zhí)行過程比較簡單,似乎使用起來也是水到渠成。但是調(diào)用哪一個 SWTBotFactory 工廠類提供的靜態(tài)方法獲得相應(yīng)的被測試控件對應(yīng)的 SWTBot 對象,以及對對象進行操作都需要深入了解富客戶端程序的基本構(gòu)成和操作本質(zhì)。我們的框架簡化了對于控件的檢索和操作,只需要按照我們定義的 XML 元數(shù)據(jù)的規(guī)范指定簡單的 XML 元素和設(shè)置相應(yīng)的屬性值,就可以方便地查找元素、操作元素和設(shè)定測試的驗證點。
基于 SWTBot 基本控件的擴展
我們的框架首先在 SWTBot 的 Finder 組件中加入了對于多層編輯器 (MultipleEditor) 和編輯器里面的每個章節(jié)(Section)的支持。這樣用戶可以方便地有針對性的對這種復(fù)雜的編輯器和章節(jié)進行對應(yīng)的測試操作,而不用像 SWTBot 原來那樣在籠統(tǒng)的一種基本的編輯器里面操作。然后,在 SWTBot 的 Widget 組件中,新加入了對組合部件 (Composite)、滾動表單 (ScrolledForm) 和表單頁面 (FormPage) 等部件的支持。最后,特別在 SWTBot 的 Matcher 組件里增加根據(jù)不同條件尋找部件的方法和豐富了多級右鍵菜單的操作方式,進一步擴展了原來 SWTBot 不能很好支持的領(lǐng)域,大大增強了 SWTBot 在 Eclipse RCP 自動化測試上的測試能力。
圖 5:對 SWTBot 的 Matcher 組件的擴展
圖 6:對 SWTBot 的 Widgets 組件的擴展
提高控件檢索效率的方法
對于 SWTBot 檢索控件的原理,如果大家詳細的研讀過它的源碼,應(yīng)該非常清楚。SWTBot 對于每一個 SWT 的控件都有一個對應(yīng)的 Bot 對象來封裝對于這個控件的操作和獲得控件的屬性及狀態(tài)。同時 SWTBot 有一個 SWTWorkbenchBot 類,它是 SWTBot 里面幾乎所有 Bot 對象的工廠類,是尋找這些 Bot 對象的基本入口。這個工廠類一般都是直接被創(chuàng)建出來,默認檢索控件的路徑就是從 Eclipse RCP 的總工作平臺 (Workbench) 開始,然后從這個工作平臺的所有視圖、菜單、右鍵菜單、工具欄、狀態(tài)欄和編輯器等地方去尋找需要測試和操作的控件對象,進而創(chuàng)建出 Bot 對象。這種控件檢索方式下,執(zhí)行效率肯定很低。我們的自動化框架優(yōu)化了這種籠統(tǒng)的檢索控件的方法,增加一個叫做操作區(qū)域 (Operation Area) 的對象,能夠精確的將檢索開始的地方定位到相應(yīng)控件被包含的視圖或者編輯器,縮小檢索的范圍,增加檢索的準確性,提高了 SWTBot 的運行效率。
清單 1:獲得操作區(qū)域的核心代碼
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?
結(jié)束語
對于做過自動化測試的人員,相信大家都有體會,跟 Web 測試等其它領(lǐng)域比起來,本地 GUI 的自動化測試一直是比較難的部分,一直以來就沒有一種既穩(wěn)定高效又輕量級的 GUI 測試工具出現(xiàn)。另一方面,相比年輕的 Web 領(lǐng)域,本地 GUI 一直還是占據(jù)著軟件開發(fā)市場很大的一部分,尤其是 Eclipse 等富客戶端一直是企業(yè)軟件從業(yè)人員開發(fā)的必備利器。所以,開發(fā)本地 GUI 的自動化測試工具,對于人力成本和時間的節(jié)省也是巨大的。
SWTBot 是開源的基于 Eclipse SWT 的 UI 和功能測試工具,通過這篇文章,相信大家對于我們這個基于 SWTBot 的 GUI 自動化測試框架有了一定的了解。由于只需要專注在寫 XML 測試用例這一件事情上,對于廣大的測試人員開發(fā)出高質(zhì)量可重用的測試用例是有很大幫助的。本系列的第一篇文章暫告一段落,后續(xù)文章將更詳細地介紹基于 SWTBot 擴展的 GUI 自動化的流程細節(jié)和場景,敬請期待。
參考資料
學(xué)習(xí)
- 參考Eclipse SWTBot 開源社區(qū):下載最新版本 SWTBot 并了解最新資訊
- 參考Eclipse SWT 官方主頁:下載 SWT,關(guān)注開源 GUI 框架的動態(tài)
- 參考Eclipse RCP Wiki 頁:關(guān)注 RCP, 了解 Eclipse 平臺最核心的技術(shù)
- 參考OSGI 的官方主頁:面向 Java 的動態(tài)模型系統(tǒng),面向服務(wù)的架構(gòu)
- developerWorks Java 技術(shù)專區(qū):這里有數(shù)百篇關(guān)于 Java 編程各個方面的文章。
轉(zhuǎn)載于:https://www.cnblogs.com/zoucaitou/p/4189929.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的基于 SWTBot 进行 Eclipse GUI 自动化测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Android Sutdio调试NDK
- 下一篇: Python通过Zabbix API获得