首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Tellurium 自動化測試框架深度解析:基於 UI Module 的智能化 Web 測試新範式

     編輯:Java 相關知識

前言

Tellurium 自動化測試框架由方劍於 2007 年 6 月創建,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。

核心理念:UI Module

以 Google 搜索頁面為例,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 的集合。採用 UI Module 後,Tellurium 更具表述性,對變化響應更智能,易於表示動態 Web 內容,維護性更強。

框架組件

  • Trump:Firefox 插件(Tellurium UI Module Plugin),用戶選擇待測頁面 UI 元素後自動生成 UI Module。
  • Tellurium IDE:Firefox 插件,記錄用戶操作生成 Tellurium 測試腳本(含 UI Module 定義、用戶動作、斷言),腳本用 Groovy 編寫。
  • TelluriumWorks:獨立 Java Swing 應用,編輯與運行測試腳本;另開發 IntelliJ IDEA IDE 插件。
  • JavaScript Widget Extensions:針對流行 JS 框架(Dojo、jQuery UI)的擴展,專案引用發布的 Tellurium jar,在 UI Module 定義中將 UI widget 視為普通 Tellurium 對象。

主要特性

  • UI Module 清晰表達待測 UI:測試代碼不直接用定位器,而是用 uid 引用 UI 元素,更具表現力。如 type "GoogleSearchModule.Input","Tellurium test"、click "GoogleSearchModule.Search"。
  • 用 UI 屬性而非固定定位器描述 UI:實際定位器運行時生成,屬性變更時框架自動重新生成,自適應 UI 變化。
  • Santa 算法與部分匹配機制:0.7.0 版 Santa 算法一次定位整個 UI Module,提高測試智能性;部分匹配機制適應屬性變化。
  • UI 模板與 UDL 表示動態內容。
  • UI Module 與測試代碼分離:利於重構。UI 與測試方法定義在分離的 Groovy 類中,測試代碼與 UI Module 解耦。
  • 其他特性:抽象 UI 對象封裝 Web 元素、Widget 可重用、DSL 支持定義/動作/測試、組定位一次定位一組組件、CSS 選擇器改善 IE 測試速度、定位器快取與命令集提速、數據驅動測試。

對比 Selenium 與 Tellurium

Selenium 是最流行的開源自動化 Web 測試框架,提供瀏覽器測試、Selenium Grid、IDE「錄製回放」等獨特優勢。但存在問題:

Selenium 測試代碼範例:

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

問題在於:

  • 不熟悉頁面者難以從代碼理解 UI 結構;定位器 q 含義不明。
  • XPath 失效時難以定位需更新代碼行;幾十上百定位器維護極難。
  • Selenium IDE 生成代碼初期容易,但歸納重構困難;硬編碼定位器與測試代碼緊耦合,無結構化,維護異常困難。
  • 作為低層驅動框架不錯,但需投入更多精力創建智能測試代碼。

Tellurium 正是為解決 Selenium 多數問題而生:

  • 解決 IE 性能痛點:用 CSS 選擇器作為預設定位器,由 UI Module 自動生成,提升速度。
  • UI Module 快取與新引擎命令集進一步提速。
  • 支持 Ajax 測試:List、Table UI 對象表示動態內容;option 對象表示同一元素不同 UI。
  • 同樣可測試任何基於 HTML DOM 結構的 Web 應用。

測試方法論

Tellurium 通過 UI Module 概念進行自動化測試,用對象封裝 Web UI 元素,無需手動生成重構定位器。UI Module 是簡單復合 UI 對象,由嵌套基本 UI 對象組成。

兩種運行模式:

  1. 作為 Selenium Wrapper:Tellurium Core 基於 UI Module 中 UI 對象屬性生成運行時定位器,通過擴展傳遞給 Selenium Core 調用。
  2. 自有驅動引擎:Tellurium Engine 更好支持 UI Module。流程:Core 將 UI Module 轉 JSON → 首次使用傳給 Engine → Engine 用 Santa 算法定位整個 UI Module 並緩存 → 後續調用直接用緩存無需重新定位 → Core 將多命令合併為宏命令一次發送給 Engine,減少請求/響應延遲。

實戰範例

範例 1:問題搜索 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 Module 中 Selector 改為 InputBox
type "issueSearch.issueType",type  // 原 select 改為 type
// 其余不變

範例 2:動態 Web 內容 - Google Books

包含圖書分類列表,每分類含圖書列表。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: [:])
            }
        }
    }
}

範例 3:複雜動態表格 - Tellurium UDL

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

未來規劃

  • 新測試驅動引擎:0.7.0 實現基於 jQuery 的新引擎,特性含 UI Module 組定位、緩存、命令集處理、jQuery 重寫 Selenium API 及新 Tellurium API,將持續完善。
  • IDE 生態:Tellurium IDE Module 插件 0.8.0 RC1 發布,含新特性;錄製生成腳本的 IDE RC 版發布;持續改進 Trump、Tellurium IDE、TelluriumWorks(編輯、語法檢查、運行 DSL 腳本)。
  • 雲測試:重新考慮架構使測試更直接並行執行;通過 P2P 技術讓測試服務器在雲環境中自組織、自協調,極具挑戰性。
  • 其他方向:可重用 Dojo、ExtJS、jQuery UI Tellurium widget(引用 jar 即可重用)、行為驅動測試、Web 安全測試、支持 Ruby 等其他語言。

作者簡介

方劍,喬治亞理工學院電子與計算機工程博士,某 IT 公司高級軟體工程師,致力於企業級應用軟體設計實現,Tellurium 自動化測試框架創建者。

英文原文:https://www.infoq.com/articles/tellurium_intro

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved