Tellurium自動測試框架是一款針對web應用、基于UI模塊的自動測試平臺。UI模塊是由一組復合的UI對象以嵌套的形式組成,比如,Google的搜索UI模塊可以表示成:
ui.Container(uid: "GoogleSearchModule", clocator: [tag: "td"], group: "true"){
InputBox(uid: "Input", clocator: [title: "Google Search"])
SubmitButton(uid: "Search", clocator: [name: "btnG", value: "Google Search"])
SubmitButton(uid: "ImFeelingLucky", clocator: [value: "I'm Feeling Lucky"])
}
Tellurium框架還定義了一套全新的領域特定語言來進行web測試,比如對于Google搜索模塊,你可以使用下面的DSL來完成一次搜索測試:
type "GoogleSearchModule.Input", "Tellurium test"
click "GoogleSearchModule.Search"
waitForPageToLoad 30000
目前Tellurium已經發布0.6.0版本,InfoQ中文站Tellurium的方方面面,特地郵件采訪了Tellurium的創始人方劍先生:
1、請介紹一下您自己,以及所從事的工作?
我的名字是方劍,曾經在上海讀書和工作多年。2000年在美國佐治亞理工(Georgia Institute of Technology)求學。畢業后在一家美國公司做軟件開發工作,從事企業級應用(Enterprise Applications)開發,主要負責服務器端框架的設計和開發,商業應用服務(Business Services)的開發, 和一些軟件規范的制定。此外,我還有很強的人工智能和計算機網絡方面的研究背景。
2、您開始做Tellurium這樣一個自動化測試框架,是基于怎樣的考慮呢?我看到有特色的兩點是使用UI module-based這樣的描述塊來定義待測的UI,以及使用DSL來表述測試代碼,還有哪些與以往框架不同的設計思想,緣起是什么呢?
在2007年,我們公司開始注意到Selenium測試框架。由于我們用敏捷開發方法(Agile development),在Scrum隊伍中,每個人的角色開始變得多樣性了。我有個工作(Task)是用Selenium去測試我們的一個應用程序(是用Dojo Javascript框架寫的)。應該說在當時,Selenium是一個開創性的框架,如果用他們的復制和重播模式(record and replay)很容易產生測試腳本。但一旦我開始用Selenium,我發現它還是有一些缺點和不便之處。主要測試腳本是對代碼的更新很脆弱(Fragile)。 但是在一個敏捷開發的環境下,一般都有階段性的用戶接受測試(User Acceptance Test),由于程序一直更新,Selenium測試腳本的維護變成一個很頭痛的問題。而且,對于很多企業級應用,復制和重播模式本身不太適用,比喻我們有很多數據格(Data Grid),它的內容本身是動態的。其他的問題包括Selenium測試腳本不是結構化的,你可以看到處有XPath,這更增加了維護的困難。因此,我們決定開發一個在Selenium之上的框架來解決這些問題。我做的第一個版本是通過Spring框架和物體工廠(Object Factory)來產生UI元素(Element),使得框架能把UI元素的表達和測試代碼分開,自動處理Javascript事件,并在一定程度上能處理動態網頁內容。
由于這個框架用XML來配置UI元素,使用起來并不是很方便。在2008年,我用Groovy重寫了整個框架并變成一個開源項目(open source project)。新的版本主要有三個大的改變。首先是采用UI Module(UI模塊)描述塊來定義待測的UI。這樣做的好處是系統自動生成運行時的Locator,即使你改變了其中的一些元素,框架本身會生產新的 Locator來適應這種改變。而且框架側重一個集合的元素,而不是單個元素,這樣使得我們可以利用元素之間的關系來幫助我們定位他們在DOM中的位置。此外,這樣也增加了重用性,比如,我們可以定義一些Tellurium Widget,在你的測試代碼中可以直接定義這個Widget,而不需要重新定義一個個的單個元素。第二個大的變化是用DSL來寫測試代碼。這樣增加了表達性使得用戶很容易寫和維護測試代碼。Tellurium測試代碼可以用Java, Groovy, 或純DSL腳本來寫。Tellurium本身也支持JUnit和TestNG測試框架。另一個大的變化是開始用UI模板(UI templates)來表述動態網頁內容,例如數據格(Data Grid)。這樣使得Ajax應用程序的測試變得可行和容易。
3、 Tellurium主要有那些子項目構成?
Tellurium主要是由Tellurium Core, Tellurium Engine, Tellurium Widget Extensions, 和Tellurium UI Module Plugin(TrUMP)子項目構成。Tellurium Core主要是處理DSL和動態生成Locator. Tellurium Engine是測試驅動模塊,目前還是利用Selenium Core. Tellurium Widget Extensions包括一些DOJO和ExtJS Javascript框架的可重用Widget模塊。這些Widget被編譯成一個jar文件方便用戶調用。TrUMP是一個Firefox plugin來自動生成UI Module。
另外,Tellurium還提供兩個參考子項目(Reference Projects),分別為JUnit和TestNG項目,來給用戶示范如何創建Tellurium測試項目和如何使用Tellurium的各種功能。
除此之外,Tellurium還提供了Tellurium Maven Archetypes,使得用戶可以用一個Maven命令可以創建自己的Tellurium測試項目。
4、介紹一下Tellurium的代碼貢獻者們吧?
我主要是負責Tellurium的整體設計和很大一部分的代碼編程。除我之外,現在還有四個來自美國和英國的隊友(team members)。Vivek Mongolu主要負責TrUMP的UI設計和實現。Matt Senter主要負責Maven支持,包括代碼的編譯,發布,和Maven Repository的維護。Haroon Rasheed參加了Tellurium參考項目(Tellurium Reference Projects)的開發,Selenium Grid的支持和其他的維護工作。Mikhail Koryak參于了TrUMP的開發工作,他是jQuery方面的專家,負責Tellurium的jQuery支持。現在參與Tellurium Engine的開發。