簡介:基於 eclipse 的應用非常廣泛,當然也就帶來了對其進行 GUI 自動化 測試的需要。SWTBot 提供了比較完善的 SWT 和 eclipse 富客戶端應用(RCP) 的測試功能,本文詳細的介紹了 SWT 的設計結構和一些特性,並通過一個實例來 說明,如何為您的 eclipse 應用創建和執行基於 SWTBot 的測試用例。
SWTBot 是一個年輕的開源項目,致力於簡化 SWT 和基於 eclipse 的富客戶 端應用的 GUI 測試,平台獨立,功能強大。該項目已經被接納到 eclipse.org 基金會,雖然目前尚處於孵化階段,但已經成功地應用於很多產品的測試了。本 文詳細地介紹了如何配置開發環境,並通過實例、類圖等分析了 SWTBot 的設計 和實現結構。
配置基本的開發環境
本文所使用的開發環境是 Eclipse 3.5 的用於 RCP/Plug-in 開發的套件,您 可以通過在線更新直接安裝最新版本的 SWTBot 插件。
依次選擇 eclipse 菜單項“Help-> Install New Software …”,在彈出 的窗口中添加更新站點,如圖 1 所示,目前的站點地址是 http://download.eclipse.org/technology/swtbot/galileo/dev-build/update -site/
圖 1. 添加更新站點
在可行的插件列表中,如圖 2,分別包括 SWTBot SWT 測試工具、eclipse 測 試工具和 GEF 測試工具,在本文撰寫階段,GEF 功能還沒有真正地集成進來。選 擇您希望安裝的插件,並點擊“Finish”進行安裝。
圖 2. 安裝插件
如果您希望獲取 SWTBot 的源代碼,可以通過 SVN 或者 Git 獲取。
經過上面的步驟,開發環境就已經搭建好了,您是不是有些迫不及待地要嘗試 下 SWTBot 的功能了,我們首先從一個簡單的測試用例開始吧。
創建您的第一個 SWTBot 測試用例
簡單起見,我們就模擬一個為 eclipse 添加更新站點的過程,具體步驟如前 文所描述的安裝 SWTBot 插件的過程。
1. 創建測試工程
首先,您需要創建一個 eclipse 插件工程,把 SWTBot 相關的插件添加到依 賴關系中,詳細信息請參考圖 3
圖 3. 插件依賴關系
2. 新建測試用例
新建一個 Junit 4.x 測試用例,將下面的代碼添加到您的用例中。因為不能 重復添加站點,為了能夠重復執行,例子在最後階段選擇了取消操作。
清單 1. 測試代碼
package myswtbot.test;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.swt.finder.SWTBotAssert;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* My first SWTBot test case which stimulate a scenario
* of adding updating site for the eclipse.
* The update site is for SWT development tools.
*
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class AddUpdateSiteTest {
private static SWTWorkbenchBot bot;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
bot = new SWTWorkbenchBot();
bot.viewByTitle("Welcome").close();
}
@Test
public void testAddUpdateSite() throws Exception {
bot.menu("Help").menu("Install New Software...").click ();
SWTBotShell shell = bot.shell("Install");
shell.activate();
bot.button("Add...").click();
//find the new shell widget by its name
SWTBotShell shell1 = bot.shell("Add Site");
shell1.activate();
bot.textWithLabel("Name:").setText("SWT development tools");
bot.textWithLabel("Location:").
setText("http://www.eclipse.org/swt/updates/3.5");
//verify button status
SWTBotAssert.assertEnabled(bot.button("OK"));
//Cancel it, in order to execute again and again
bot.button("Cancel").click();
bot.button("Cancel").click();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
bot.sleep(5000);
}
}
您可能已經注意到,本文給出的測試用例,單獨指定了 Classloader。SWTBot 的測試用例基於 Junit 4 測試框架,但是不同於 PDE-Junit 測試用例,它需要 利用 SWTBotJunit4ClassRunner 來執行,因為普通的 PDE-Junit 測試用例與被 測試的界面運行在同一個線程,而 SWTBot 測試用例發送給被測界面的一些事件 是阻塞的,如果運行在同一線程會導致測試用例停滯。
3. 執行測試用例
選中要執行的測試用例,選擇 eclipse 的主菜單“Run ->Run Configuration”,操作步驟可能根據您選用的 eclipse 版本會有區別。選擇執 行的應用,具體您可以參考圖片 4。
圖 4. 運行配置
萬事俱備,開始執行用例吧。您可以看到,一個 eclipse 應用被啟動起來, 然後 SWTBot 模擬了如何添加更新站點的工程,並且對一些用戶關注的測試點, 例如,按鈕狀態,文本信息等進行了驗證。從這個用例我們對 SWTBot 有一個簡 單的印象,它采用了 eclipse 插件工程的結構,並采用 Junit4 框架和 eclipse 本身的運行機制,我們將會在下面的章節繼續探討它的更多細節。
SWT 的結構和特性
首先了解一下 SWTBot 的組成,目前 SWTBot 主要包括 3 個部分,分別適用 於 SWT 測試、Eclipse 測試和 GEF 應用測試。SWT 部分可以看作是測試框架的 基礎,提供了 SWT 控件的代理類、查找器、匹配器等。Eclipse 部分提供了對 Perspective/view 等 eclipse 特性的支持,但是實現的結構是基本一致的,您 在開發用例時可以采用同樣的編碼思路。
SWTBot 基本結構
下面的圖 5,說明了 SWTBot 的基本結構,類 SWTBot 提供了各種方法以獲取 目標控件的代理類 (Widgets),出於簡單考慮,這裡僅列出了部分查找器 (Finder)和匹配器(Matcher)實現,查找器按照一定條件來定位目標控件,而 匹配器則是支持了強大的表達式功能,如果您深入查看各種匹配器的實現細節, 就會發現它利用了 Hamcrest 匹配庫,有興趣的話您可以在到 google code上獲 取項目細節。
圖 5. SWTBot 基本結構類圖
更多細節
幾乎全部(目前的版本還有部分未實現的)SWT 控件(Widget),在 SWTBot 中都有對應的代理類,圖 5 僅列出了一個按鈕控件的示例,可以在 org.eclipse.swtbot.swt.finder.widgets 包下找到其他實現。您的 SWT 知識能 夠幫助您很快的熟悉 SWTBot 的結構,圖 6 是 SWT 和 SWTBot 對應類的結構對 比,SWT 中的 Widget 子類對應的代理類擴展了 AbstractSWTBot 抽象類, Control 子類對應的代理類擴展了 AbstractSWTBotControl 類。這些抽象類中實 現了一些測試中通用的方法,如模擬鼠標動作,檢查控件狀態等。
圖 6. SWT 和 SWTBot 部分類的結構對比
驗證點是測試中的一個重要組成部分,單單模擬操作並不能達到測試的目的, 我們需要針對關注的細節添加驗證點。您可以利用 Junit 提供的傳統斷言方式, 也可以使用 SWTBot 額外提供的斷言方法。針對 GUI 測試的特點,SWTBot 框架 在 SWTBotAssert 類中實現了部分斷言方法,我們在 AddUpdateSiteTest 中驗證 按鈕狀態就是利用了其提供的方法,圖 7 提供了具體的介紹,您可以根據需要選 擇常規驗證和正則表達式驗證等等。SWTBot 還提供了快照功能,在用例發生失敗 的時候可以截取屏幕顯示並保存到圖片文件,這樣您就可以直觀的發現導致錯誤 的問題了。
圖 7. SWTBot 斷言方法
您在測試中,可能經常會遇到超時處理、等待其他線程狀態等問題,傳統的方 式是開發人員在代碼裡自己去處理線程的事務,這就無形中增加了學習的難度和 使用的風險。這種隨意的方式,會帶來潛在的問題,比如您自己調用線程 API 去 檢查超時,一旦被測產品行為改變,例如因為不同的操作系統或者代碼變更,這 時您需要去用例中調整超時的參數和代碼,非常不便。SWTBot 可以幫您解決大部 分這種問題,您無需費神去操作線程的細節,圖 8 就是對 SWTBot 的相關實現的 一個說明,通過 ICondition 接口和其實現類,SWTBot 提供了非常完善的操作方 式。如果目前的實現無法滿足您的特定需要,也可以直接調用 Conditions 工廠 類中的方法,自己去創建條件實例。
圖 8. SWTBot 的 IConditions
實際應用的角度
在具體的測試用例開發中,SWTBot 可以作為您操作 SWT 控件的一個入口,如 果您需要測試的是一個普通 eclipse 應用,那麼可以參考前面介紹的 AddUpdateSiteTest 用例那樣,從 SWTWorkbenchBot 對象開始,通過 Bot 對象 的方法找到目標控件,然後通過目標控件的代理對象,您就可以模擬鼠標、鍵盤 等操作了,也可以獲取目標控件的狀態信息。這裡有一些小細節,一般來說,可 以認為 GUI 對象是樹狀結構的,通過指定恰當的父對象作為構造函數的參數,可 以更加快速地找到目標控件,您可以通過這一點提高 SWTBot 的查找效率。
SWTBot API 非常簡單、易用,代碼的可讀性也非常好,您可以看下面圖 9 中 列出的 SWTBot 查找 Button 控件代理類的方法,不要詫異,方法的功能就如您 看到的名字,其他的控件也同樣可以通過 tooltip,text,ID 等簡單條件查找。 由於完善的定位控件的方法,不需要了解查找器或者匹配器的細節就可以完成您 的大多數測試需求。
圖 9. SWTBot 部分方法示例
在執行前面的測試用例的時候,如果您覺得執行的速度太快了,您可以定義腳 本回放的間隔等參數來控制執行速度。SWTBot 提供了簡單易用的配置入口,您可 以通過修改 SWTBotPreferences 類的靜態參數來達到這個目標,一些默認值也可 以通過設置環境變量來修改。
為方便生成腳本,常見的圖形界面測試工具通常支持錄制的方式來創建腳本, 即通過記錄器(Recorder)來記錄您的動作。SWTBot 有一個不是非常完整的記錄 器實現,不幸的是,在最近的版本中(筆者使用的是 2.0),記錄器已經被移出 SWTBot 安裝包,如果您確定自己非常需要記錄器,可能不得不退回到 1.3 版。 不過從圖形界面測試實踐的角度來看,使用記錄器生成的腳本在代碼復用、可維 護性等方面也許並不是一個非常好的方法。拋卻這些測試理論的考慮,現實的問 題是,如果直接書寫腳本,需要有一定的 SWT 控件和 Eclipse 界面知識,比如 ,您可能不了解要測對象具體是什麼類型的。如果您有這樣的困難,可以使用 SWTBot 自帶的 EclipseSpy 視圖(通過熱鍵 CTRL+SHIFT 可以激活該視圖),它 會把您鼠標指到的控件信息詳細的列出來。當然,您也可以借助 SWT Development Tools工具包或者 eclipse 自帶的 Plug-In spy 的幫助來完成測試 用例開發,有關這些工具的使用,您可以參考相關文檔,本文就做進一步介紹了 。
總結
通過前面的介紹,相信您對 SWTBot 的功能已經有了一定的了解,它強大的測 試功能、代碼優異的可維護性、可讀性等令人印象深刻,相信可以作為您測試 SWT、Eclipse 插件和 RCP 應用的一個不錯的選擇。