基于 IBM Rational Functional Tester 實現高效的自動化測試日志框架

452111 8年前發布 | 30K 次閱讀 自動化測試 軟件測試

引言

隨著自動化測試覆蓋率的增加,自動化測試項目本身的代碼復雜性也會相應提高。不同于其他軟件開發項目,UI 自動化測試有其特性,它是模擬人手工來執行測試套件,驗證產品質量的一種軟件項目。它通過運行測試套件中的驗證點,判斷驗證點是否通過來驗證是否有缺陷產生;而缺陷的數量和缺陷在不同模塊的分布對軟件產品質量的定性分析和預測很重要。一個良好的自動化日志模塊應該能有效的記錄和反應這些缺陷信息,提供給所有關心質量項目人員他們所需要的質量指標。界面元素的變動和重新識別往往是自動化項目維護成本較高的原因之一,如何高效準確的識別和定位界面元素的變化很重要,一個好的日志模塊應該能準確記錄運行信息,捕獲控件識別的情況,幫助測試開發工程師迅速的定位問題。下面基于 IBM Rational Functional Tester 介紹如何實現一個高效的 UI 自動化測試日志框架。

日志展示

在自動化測試過程中,測試開發人員側重于腳本本身運行成功與否,會從多個角度關注測試腳本的運行狀態:失敗信息提示,待測系統信息,腳本運行服務器信息,測試數據信息。其他質量人員則會從產品角度關注缺陷分布情況和整體的產品質量:測試腳本(通常一個腳本對應一個用例)所屬功能范圍,缺陷總數目,缺陷在各個功能模塊的分布。

日志模塊應該能在運行完畢測試用例以后輸出相應的信息,這些信息可以以全局變量的形式記錄在 Test Logger 當中。每啟動一個 Test Case,相應的初始化一個 Test Logger,記錄這個用例不同維度的測試指標,當一個腳本運行完畢以后,應當自動的把這些信息以用戶期望的形式輸出。在每個 Test Case 里都應當有一個 Test Logger 初始化和終止的方法來初始化和記錄這些信息。

IBM Rational Functional Tester 支持多種類型的日志展示:

  • 文本 - 在 Functional Tester 腳本窗口中顯示 ASCII 格式的日志。
  • HTML - 在您的缺省瀏覽器中顯示 HTML 格式的日志。
  • TPTP - 在 Functional Tester 腳本窗口中顯示使用 TPTP 的日志。
  • XML - 在您的缺省瀏覽器中顯示 XML 格式的日志。
  • Test Manager - 在 Test Manager 的測試日志窗口中顯示 Functional Tester 日志信息。必須關聯 Functional Tester 項目和當前的 Rational 項目,以顯示和管理 Test Manager 中的日志。

通過設置 RFT 首選項(窗口->首選項->功能測試->回放-)日志記錄)可以配置日志的選項,包括日志的顯示類型,是否在腳本運行后自動展示日志,屏幕快照的記錄和顯示,是否記錄 GUI 操作等等。用戶可以根據項目需要進行相應的配置。

圖 1. RFT 配置日志首選項

日志定制化

除了以上幾種標準日志格式外,IBM RFT 還可以創建定制的日志文件,使日志以用戶指定的格式進行展示。創建定制化的日志文件主要有兩個步驟:創建擴展的日志插件以及部署日志插件。RFT 可以通過創建日志插件來擴展擴展點或者編寫特定的方法來定制日志內容和展示,在 RFT 里創建日志插件的步驟如下:

打開 RFT,點擊新建項目->新建插件項目,設定插件名稱,按默認選項點擊完成。插件項目新建成功以后點擊 plugin.xml 進行配置。選中依賴項選項卡->必須的插件->添加插件,在插件中輸入 com.ibm.rational.test.ft.playback, 點擊確定保存。

圖 2. RFT 創建插件項目和配置依賴項

選中配置擴展想選項卡,添加所需的擴展插件。

圖 3. 配置擴展項

在窗口左側窗格的項目文件夾中,選中 plugin.xml 單擊導出,將插件項目導出為可部署的插件和片段,設置導出路徑,即可完成插件的部署工作。

圖 4. 部署擴展的日志插件

日志錯誤信息定位

ITCL(IBM Test Community Leadership)框架是由 QSE(Quality Software Engineering)小組和 IBM 內部的自動化測試開發專家開發和維護的一套框架。此框架自底向上由三層框架構成:測試對象層(Test Object),測試任務層(Test Task),測試用例層(Test Case)。這三層分別只調用下層對象,形成的自動化測試代碼具有良好的松耦合性。

ITCL 框架提供了:

  • 由 appobjects, tasks, testcases 組成的松耦合三層架構。
  • IBM 類包:包括測試腳本可直接調用的 logger, 恢復到特定狀態的 recovery, 對應頁面對象的捕捉器 widget 以及 RFT 里常用的 util 方法。
  • IBM 最佳實踐: 哪些項目適合做自動化, 如何評估復雜度,自動化項目開發管理流程。
  • 集成的 IDE

ITCL 框架提供了從技術到流程的支持,為自動化的實現提供了一個高效的基石。基于 ITCL 框架可以很容易的構建松耦合,易維護的 UI 測試自動化代碼。

圖 5. ITCL 自動化框架

測試對象層主要用于識別待測應用程序的測試元素(按鈕,文本框,下拉框,導航…),主要包括靜態識別和動態識別兩種方式。由于動態識別的靈活性和易維護性,復雜度較高的項目一般采用動態識別的方式來識別對象。動態識別是通過界面元素的特定屬性(包括元素類型,層次結構等等)來識別對象。通過構建一個統一的界面元素識別入口 Object Finder,并在識別入口處插入 Logger 記錄識別的結果,即可記錄所有的界面元素識別情況:正確則在日志中顯示 Pass,錯誤則顯示相應的錯誤識別消息和元素的識別屬性。日志框架通過對界面元素識別情況的記錄可以迅速的幫助測試開發人員定位到由于界面元素識別失敗而造成的失誤,大大減少了調試時間。下面以 RFT 為例說明如何構建一個統一的識別入口以及如何使用 Logger 記錄識別情況(本文僅針對自動化測試中最常用的動態識別)。

測試任務層主要基于測試元素進行各種操作,不同軟件程序的業務邏輯雖然千變萬化,但都基于一套標準的鼠標和鍵盤操作。無論業務邏輯多么復雜,都是基于鼠標點擊,文本輸入,界面導航實現的。根據自動化測試項目的這些特點,將鼠標鍵盤的原子操作提取出來作為 Common Task,并在 Common Task 里插入 Logger 記錄原子操作的正確性即可實現對 Task 層的運行的監控。

本文在 ITCL 基礎上,通過實現對統一的對象識別入口和原子操作入口的監控和日志記錄幫助自動化測試開發人員在開發和維護時迅速的定位錯誤。

圖 6. 基于 ITCL 實現快速錯誤定位

 

界面元素日志定位

動態識別是通過 find 方法和屬性找到相應的對象,頁面元素的屬性可以映射為一個以特定分割符分割的文本串。因此對于任意頁面元素,定義好了其屬性識別串,即可按如下方法來進行頁面元素識別,以 findObjectByProperties 作為唯一對象識別入口,并在其中插入 Logger 記錄識別結果。下圖以頁面登陸為例說明:首先在對象識別庫中(Object Repository)以文本形式記錄登陸框識別屬性,在對象識別時找到相應的屬性識別字符串,調用 setPropertyGroup 解析字符串為屬性組,將屬性組輸入到 find 方法中查找返回對象。如果有相應對象,則 Test Logger 在日志中顯示 Pass,如果沒有識別到相應對象,則顯示 Fail。

清單 1.頁面元素屬性識別字符串

public class ObjRepository{

  // 登陸頁面
public static final String uname = ".gsTextclass=.text,.gsLoginNameId=username";
public static final String uPsd=".gsTextClass=.text,.gsLoginNameId=password";
public static final String loginBtn==".gsLinkClass=.Link,.gsLoginNameId=Login";

 //其他頁面

}</code></pre>

清單 2.通過頁面元素屬性識別字符串識別待測應用程序元素

//根據屬性對查找唯一符合條件的元素,并且記錄查找結果到日志模塊當中
    public TestObject findObjectByProperties(String properties) {
        TestObject to = null;

    try {
        Property[] propGroup = setPropertyGroup(properties);
        TestObject[] tos = getRootTestObject()
                .find(atDescendant(propGroup));
        to = tos[0];
        TestLogger.logPassInfo("Pass- Object( " + properties
                + " ) is not found by ObjFinder);

        return to;
    } catch (Exception e) {
        TestLogger.logErrorInfo("Fail- Object( " + properties
                + " ) is not found by ObjFinder", e);
        return null;
    }
}

    //解析元素識別字符串,將字符串映射為屬性對
      public Property[] setPropertyGroup(String properties) {
    String[] strGroup = properties.split("split symbol");
    Property[] propGroup = new Property[strGroup.length];
    for (int i = 0; i < strGroup.length; i++) {
        String[] propertyPair = strGroup[i].split("=");
        String key = propertyPair[0];
        String value = propertyPair[1];
        propGroup[i] = new Property(key, value);
    }
    return propGroup;
}</code></pre> 

界面操作日志定位

依然以登陸頁面為例,登陸任務會依次調用 Common Task 里的文本輸入方法輸入用戶名和密碼,并調用鼠標點擊動作進行表單信息的提交。Common Task 會繼續調用 Test Logger 里的 loggerForTextInput 執行登陸操作,并往日志里插入文本輸入信息輸入的狀態。成功顯示 Pass,如果失敗則顯示失誤相關的信息,幫助監控所有操作執行的情況和準確定位失誤的位置。

清單 3.界面操作識別定位

//登陸 Task
     public class LoginOps extends LoginOpsHelper {

BrowserOps browserOps = new BrowserOps();
CommonOps commonOps = new CommonOps();
ObjRepository objRepo = new ObjRepository();

public void login(String uname, String psd) {
    commonOps.setText(objRepo.unameText, uname);
    commonOps.setText(objRepo.userPsdText, psd);
    commonOps.clickButton(objRepo.loginBtn);
}
  }

 //Common Task
  public class CommonOps extends CommonOpsHelper {

ObjFinder objectFinder = new ObjFinder();

     //文本輸入  
public void setText(String properties, String text) {
    WTextField wText = new WTextField(
            objectFinder.findTextField(properties));
    TestLogger.loggerForTextInput(wText, properties, text);
}


    //鼠標點擊
public void clickButton(String properties) {
    WButton button = new WButton(objectFinder.findTextField(properties));
    TestLogger.loggerForClickButton(button, properties);
}

    //其他基本操作

   }


 //TestLogger
   public class TestLogger extends TestLoggerHelper {

public void loggerForTextInput(WTextField t, String property,
        String sInputText) {
    try {
        t.setText(sInputText);
        TestLogger.logScriptInfo("Pass - Input Text: " + sInputText
                + " into Text Widget (" + property + " )");
    } catch (Exception e) {
        TestLogger.errorHandler("Fail - Input Text: " + sInputText
                + " into Text Widget (" + property + " )", e);
    }
}</code></pre> 

結束語

本文基于 IBM Rational Functional Tester 實現了高效的自動化測試日志框架,對自動化測試開發人員具有一定的借鑒意義。本文從日志展示和定制化角度說明了如何針對項目不同的人員和項目的情況配置 RFT 日志選項以及如何通過 RFT 定制日志插件。本文也基于 ITCL 框架說明了如何構建日志模塊,通過統一的對象識別入口和動作操作入口的監控,來幫助測試開發人員迅速定位錯誤,高效的開發和調試自動化程序。

 

 

Rational 軟件面向架構師、開發人員和工程師的參考資料

簡介:

訪問 IBM developer Works 中國網站 Rational 專區,獲得關于 IBM Rational 軟件交付平臺(Rational Software Delivery Platform)產品的技術資源和最佳實踐。

IBM developerWorks 時事通訊

簡介:

一份關于 developerWorks 指南、文章、下載、社區活動、網絡廣播和技術講座的電子周刊。

基于 IBM 自動化三層架構設計 web 應用的 RFT 腳本

簡介:

從一個新的角度介紹了基于 Rational Functional Tester 開發的 Web 應用自動化測試框架。這種模式實現了數據和腳本分離,測試單元可以很大程度的復用,提高了腳本的利用率,同時也使腳本的可維護性大大提高。

基于 Eclipse 實現 RFT 擴展驗證工具包

簡介:

Eclipse 實現 RFT 擴展驗證工具包 MVPL 的一些主要功能和相關實現,并且將一些最佳實踐和方法介紹給大家。并輔以一個具體實例來說明問題。

實戰 GUI 產品的自動化測試

簡介:

自動化測試技術是保證產品質量的重要手段。隨著敏捷開發方法的盛行和產品發布周期的縮短,產品對測試的要求也相應提高,因此自動化測試也變得比以前更加重要。在本文中,您將了解我們如何看待自動化測試,又是如何通過 RFT 來實現簡單的測試目標。

 

來自:http://www.ibm.com/developerworks/cn/rational/1611_xux_rft/index.html?ca=drs-

 

 本文由用戶 452111 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!