程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Tellurium自動化測試框架介紹

Tellurium自動化測試框架介紹

編輯:關於JAVA

Tellurium自動化測試框架是由方劍在2007年6月創建的用於測試Web應用的框架,並在2008年6月移步到Google Code成為一個開源項目。它會定期發布版本,當前版本號是0.7.0。項目的核心已經歷時兩年,並繁衍出了多個子項目,包括:UDL、Core、Engine、Widget擴展、 Maven Archetype、Trump、Tellurium IDE、TelluriumWorks以及參考項目。

這個框架是從Selenium框架發展而來,但又具有不同的測試理念。大多數Web測試框架,比如Selenium,主要致力於單獨的UI元素。而Tellurium恰好相反,它把多個UI元素看作一個Widget整體,並將其稱作UI module。

拿Google搜索的UI做個例子,這個界面用Tellurium表示成如下這樣:

ui.Container(uid: "GoogleSearchModule",clocator: [tag: "td"]){
  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"])
}

正如你在例子中看到的,UI module是嵌套的UI元素、tag以及attribute的集合。Tellurium在采用了UI module之後,更具表述性,對變化的響應也更加智能化。同時它也可以很容易地表示動態Web內容,並易於維護。

這個框架由以下組件組成:

Trump——一個Firefox插件,全稱是Tellurium UI Module Plugin,它可以在用戶選擇待測Web頁面上的UI元素後,自動生成UI module。

Tellurium IDE——另外一個Firefox插件,可以記錄用戶操作,並生成Tellurium測試腳本,包括UI module的定義、用戶的動作以及斷言。測試腳本是用Groovy寫成的。

TelluriumWorks——一個單獨的Java Swing應用,用於編輯和運行Tellurium測試腳本。另外還在開發一個針對IntelliJ IDEA的IDE插件。

JavaScript Widget Extensions——針對流行JavaScript框架的擴展,比如Dojo和jQuery UI。這樣用戶就可以在項目中引用發布的Tellurium jar文件,並在UI module定義中,把UI widget當作一個普通的Tellurium對象。

特性

主要特性包括:

UI module清楚地表示了待測的UI。在Tellurium的測試代碼中,並沒有直接使用定位器(locator)。而是使用uid對象來引用UI元素,從而更具表現力。比如:

type "GoogleSearchModule.Input","Tellurium test"
click "GoogleSearchModule.Search"

使用UI屬性而不是固定的定位器來描述UI。實際的定位器將會在運行時生成。如果屬性改變了,新的運行時定位器也會由框架自動重新生成。Tellurium從而可以按需自適應UI的變化。

Tellurium 0.7.0中的Santa算法通過一次定位整個的UI module,從而進一步提高測試的智能性。此外還使用了UI module部分匹配機制,在一定程度上適應屬性的變化。

采用了Tellurium UI模板和Tellurium UID描述語言(UDL)來表示動態的web內容。

框架實行UI module和測試代碼的分離,從而有利於重構。

比如,UI和對應的測試方法定義在分離的Groovy類中。這樣,測試代碼就和UI module解耦了。

另外該框架還:

使用抽象的UI對象來封裝Web UI元素

支持Widget以實現可重用性

為UI定義、動作和測試提供一門DSL

支持組定位,從而一次定位一組UI組件

包括CSS選擇器支持,以改善在IE中的測試速度

提供定位器緩存和命令集來提高測試速度

支持數據驅動測試

對比Selenium和Tellurium

Selenium Web測試框架是最流行的開源自動化web測試框架之一。它是一款獨創性的框架,提供了很多獨一無二的特性和優勢,比如:基於浏覽器的測試、Selenium Grid以及使用Selenium IDE來“錄制和回放”用戶的動作。

然後,Selenium有點問題。拿下面這段測試代碼舉個例子:

setUp("http://www.google.com/","*chrome");
selenium.open("/");
selenium.type("q","Selenium test");
selenium.click("//input[@value='Google Search' and @type='button']");

如果有人不是很熟悉Google的搜索頁面,他能根據這段代碼,說出頁面的UI是什麼樣子的嗎?定位器q在這裡是什麼意思呢?

萬一因為Web的變化,XPath //input[@value='Google Search' and @type='button']變成無效的了,怎麼辦?更有可能發生的是,這段代碼需要逐行檢查才能找出那幾行需要更新的代碼。

萬一這段測試代碼裡面有幾十上百個定位器怎麼辦?使用Selenium IDE生成測試代碼,這可能在一開始比較容易,但歸納和重構起來就很困難了。

重構會是一個比從頭生成新測試代碼更乏味的過程。原因在於硬編碼的定位器和使用的測試代碼耦合太緊密了。因為測試代碼沒有結構化,維護代碼就變得異常困難。

作為一個低層次Web測試驅動框架,Selenium是一個很好的框架。然而,它需要投入更多的努力才能創建出智能的測試代碼。

Tellurium就是為解決Selenium中的大多數問題而誕生的。

Tellurium同時被設計用來解決Selenium的其他弱點。比如,IE性能一直是Selenium突出的問題。Tellurium的解決方案是,使用CSS選擇器來作為缺省的定位器。定位器由UI module自動生成,並改善了測試速度。

另外,在采用了Tellurium UI module緩存以及基於新的Tellurium引擎的命令集之後,測試速度得到進一步的提升。Tellurium還支持對Ajax應用的測試:Tellurium的List和Table UI對象被用來在運行時表示動態Web內容。而option對象則被用來在運行時表示同一Web元素的兩個不同UI。

與Selenium一樣,Tellurium可以用來測試任何基於HTML DOM結構的Web應用。

測試方法

Tellurium采用一種新的方式,通過UI module的概念來進行自動化測試。使用對象封裝Web UI的元素,因此不再需要手動生成和重構UI的定位器。UI module是個簡單的復合UI對象,由嵌套的基本UI對象組成。

這個框架可以在兩種模式下運行。第一種模式是作為Selenium框架的wrapper來工作。也就是說,Tellurium core基於UI module中的UI對象屬性,生成運行時定位器。生成的運行時定位器然後通過Tellurium擴展傳遞給Selenium core來調用。

Tellurium還在開發它自己的驅動引擎,即Tellurium Engine,以更好更有效地支持UI module。

首先,Tellurium Core把UI module轉換成JSON的表示形式。

然後在使用UI module時,JSON表示的數據被第一次傳遞給Tellurium Engine。

接著Tellurium Engine使用Santa算法,定位整個UI module,並將其存在緩存中。

在接下來的調用中,會直接使用緩存的UI module,而不需要重新定位了。

此外,Tellurium Core把多條命令合並成一條批處理命令,叫做宏命令,然後在一次調用中把這條批處理發送給Tellurium Engine。這樣可以減少請求/響應帶來的延遲。

下面這個例子,使用了該項目網站上的問題搜索UI,來表述框架背後的思想。

我們從為問題搜索的UI定義UI module開始吧:

ui.Form(uid: "issueSearch",clocator: [action: "list",method: "GET"]) {
  Selector(uid: "issueType",clocator: [name: "can",id: "can",direct:
  "true"])
  TextBox(uid: "searchLabel",clocator: [tag: "span",text: "for"])
  InputBox(uid: "searchBox",clocator: [type: "text",name: "q",id: "q"])
  SubmitButton(uid: "searchButton",clocator: [value: "Search",direct:
  "true"])
}

然後使用下面這個測試方法:

public void searchIssue(String type,String issue){
  select "issueSearch.issueType",type
  keyType "issueSearch.searchBox",issue
  click "issueSearch.searchButton"
  waitForPageToLoad 30000
}

如果有一天,你需要把Selector修改成輸入框,那我們只需要更新對應的UI module:

ui.Form(uid: "issueSearch",clocator: [action: "list",method: "GET"]) {
  InputBox(uid: "issueType",clocator: [name: "can",direct: "true"])
  TextBox(uid: "searchLabel",clocator: [tag: "span",text: "for"])
  InputBox(uid: "searchBox",clocator: [type: "text",name: "q",id: "q"])
  SubmitButton(uid: "searchButton",clocator: [value: "Search",direct: "true"])
}

然後修改命令:

select "issueSearch.issueType",type

為:

type "issueSearch.issueType",type

其余則保持不變。

如果有動態的Web內容,比如Google Books的網站,它包含了一個圖書分類的列表,每個分類中包含一個圖書列表。針對這樣UI的UI module會出奇的簡單:

ui.Container(uid: "GoogleBooksList",clocator: [tag: "table",id: "hp_table"]) {
  List(uid: "subcategory",clocator: [tag: "td",class: "sidebar"],separator:
  "div") {
  Container(uid: "{all}") {
  TextBox(uid: "title",clocator: [tag: "div",class: "sub_cat_title"])
  List(uid: "links",separator: "p") {
   UrlLink(uid: "{all}",clocator: [:])
      }
  }
     }}

Tellurium UID描述語言為定義動態Web內容提供了更多的靈活性。我們來看個復雜點的例子。

ui.StandardTable(uid: "GT",clocator: [id: "xyz"],ht: "tbody"){
  TextBox(uid: "{header: first} as One",clocator: [tag: "th",text: "one"],self:
  true)
  TextBox(uid: "{header: 2} as Two",clocator: [tag: "th",text: "two"],self: true)
  TextBox(uid: "{header: last} as Three",clocator: [tag: "th",text: "three"],
  self: true)
  TextBox(uid: "{row: 1,column -> One} as A",clocator: [tag: "div",class: "abc"])
  Container(uid: "{row: 1,column -> Two} as B"){
  InputBox(uid: "Input",clocator: [tag: "input",class: "123"])
  Container(uid: "Some",clocator: [tag: "div",class: "someclass"]){
   Span(uid: "Span",clocator: [tag: "span",class: "x"])
   UrlLink(uid: "Link",clocator: [:])
   }
    }
  TextBox(uid: "{row: 1,column -> Three} as Hello",clocator: [tag: "td"],self:
  true)
  }

在這個例子中,我們是使用元數據“first”、數字和“last”來指定header的位置。元數據“{row: 1,column -> One} as A”意味著我們例子中的UI元素——一個TextBox,處於第一行,並和header“One”處在同一列。測試代碼很干淨,比如:

getText "GT.A"
keyType "GT.B.Input",input
click "GT.B.Some.Link"
waitForPageToLoad 30000

未來計劃

Tellurium是一個年輕而且創新的項目,它具有許多來自開發團隊和用戶社區的新穎思想。Tellurium希望在以下領域繼續發展:

Tellurium 0.7.0已經實現了一個新的使用jQuery的測試驅動引擎。這個引擎的主要特性包括:UI module組定位、UI module緩存、命令集處理、用jQuery重新實現的Selenium API以及新的Tellurium API。Tellurium會繼續開發這個新引擎直至完備。

Tellurium IDE module插件0.8.0 RC1剛剛發布,它包含了很多新的特性。錄制和生成測試腳本的Tellurium IDE的RC版本也已發布。它們是Tellurium成功的關鍵,因此會得到持續的改進。除了Trump和Tellurium IDE,Tellurium還在計劃改善TelluriumWorks,讓它可以編輯、完成語法檢查,並運行Tellurium DSL測試腳本。

Tellurium作為雲測試工具是另外一個非常重要的發展方向。項目團隊正在計劃重新考慮整個架構,使其可以更直接地並行執行測試。通過P2P技術,只需最少的管理,就讓測試服務器在雲的環境中具備自組織和自協調的能力,這是件極具挑戰性的工作。

Tellurium框架還希望發展的其他領域包括:

創建可重用的Dojo、ExtJS和jQuery UI Tellurium widget。這樣可以讓其他人只需要在自己的項目中包含對應的jar文件,就可以重用這些widget。

支持行為驅動測試。

Web安全測試

支持其他的語言,比如Ruby

關於作者

方劍畢業於喬治亞理工學院,電子和計算機工程專業博士學位。他的工作是某IT公司的高級軟件工程師,致力於設計和實現企業級應用軟件。他是Tellurium自動化測試框架項目的創建者。

查看英文原文:http://www.infoq.com/articles/tellurium_intro

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved