程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 如何使用Eclipse TPTP測試Web應用的方法與擴展

如何使用Eclipse TPTP測試Web應用的方法與擴展

編輯:關於JAVA

在這種情況下,Eclipse Test and Performance Tools Platform(TPTP)就應運而生了。TPTP 項目成立於 2004 年 8 月,被列為 Eclipse 的頂級項目,它是一種軟件體系架構以及幾個擴展了 Eclipse 平台的組件,它在 Eclipse 平台上提 供了測試、性能和監視工具,其源碼開放並且工具是可擴展的,任何廠商或開發人員都可以創建新工具或者對現有工具進行 改進。一些 Java、C 和 C++ 開發人員可以使用 TPTP 為其他開發人員構建獨特的工具,也可以將 TPTP 提供的工具和 Eclipse 的其他特性組合起來,構建和部署供用戶使用的應用程序。下圖即 TPTP 在 Eclipse 整體架構中的位置。

圖 1.TPTP 在 Eclipse 架構中的位置

本文著重介紹 TPTP 對 Web 測試行為自動記 錄並自動生成測試腳本以及自動生成 TPTP 下的 JUnit 測試腳本的過程。此外,作者分析了這種方法的不足並提出了利用 已有框架進行 Web 應用測試的擴充方法及其應用。

TPTP 整體結構

簡單地說,TPTP 就是“構建一個通用的 可擴展的基於標准的工具平台,軟件開發人員可以在這個平台上創建專用的可互操作的測試和性能工具”。TPTP 分為四個 子項目:TPTP Platform Project、Testing Tools Project、Tracing and Profiling Tools Project、Monitoring Tools Project。其中核心和提供基礎服務的是 Platform 子項目,其余三個子項目都是建立在此基礎之上。Testing Tools 是提 供測試用的工具,Tracing and Profiling Tools 是提供跟蹤和分析的工具,Monitoring Tools 是提供實時監控的工具。 基於這些現成的平台和工具,我們也很容易開發自己定制的測試、分析、和監控工具。

以下是 TPTP 的當前版本包 括核心工具和三種核心衍生工具的詳細介紹。

TPTP Platform

TPTP 為 UI 開發、數據收集、基於規則的數據 查詢以及應用程序的控制提供了基礎代碼。例如,TPTP 提供了其他工具可以重用和擴展的許多向導。它還提供了編程接口 和一個守護進程,以便幫助從正在運行的本地或遠程進程中收集數據。

TPTP Testing Tools

這個項目是在 TPTP 之上構建的,提供了對應用程序進行各種自動化測試所需的其他服務。當前版本支持 JUnit 自動測試、一種指向和點 擊腳本編程系統(用於進行手工測試並記錄結果)和一個用於測試 Web 應用程序的自動化系統,包括一個可以記錄和回放 Web 浏覽會話並對結果進行驗證的記錄器。在 Eclipse V4.1 版本之後還包括一個圖形用戶界面(GUI)記錄器,它可以記 錄和回放基於 SWT 的界面中的鼠標和鍵盤事件。

TPTP Monitoring Tools

這個項目對來自日志文件或來自應 用程序收集的統計數據的數據進行收集、分析和圖形顯示。

TPTP Tracing and Profiling Tools

這個項目也 擴展了 TPTP,用來收集和分析正在運行的應用程序中的資源使用數據,包括 CPU 和內存。這個跟蹤工具還允許與正在運行 的進程進行交互。例如,可以手工地實施垃圾收集並檢查剩余的對象池,從而尋找和修復內存“洩漏”。

下圖是 TPTP 這四個子項目的相互協作關系:

圖 2.TPTP 架構圖

由於 TPTP 的功能覆蓋面太廣,僅以一篇文 章無法進行全面介紹,而目前業界最流行的就是對 Web 應用的開發和測試,因此本文只把注意力放在 Testing Tools 子模 塊上,並且著重介紹 HTTP test 和浏覽器recording 部分。

應用介紹:自動記錄並生成測試腳本的 Web 應用測試

在介紹 TPTP 具體應用之前,需要在 Eclipse 上安裝好 TPTP 插件。您可以在官方網站上一起下載: http://www.eclipse.org/TPTP/home/downloads。

自動記錄 URL 腳本、生成 TPTP 測試腳本、並進行測試的過程。

第一步:選擇 File -> New -> Other,會彈出一個 Eclipse 框架的 Dialog Wizard,在 Test 目錄下選擇 “Test From Recording”, 點擊“Next”。如下圖所示:

圖 3. 建立新工程“Test From Recording”

第二步:彈出 Dialog Wizard 第二頁,選擇“HTTP Recording”,點擊“Next”;彈出第三頁,為生成的測試文件選擇一個工程目錄,並 且填寫記錄文件和生成 TPTP 測試文件的名稱,點擊“Finish”。如下圖所示:

圖 4. 生成 testsuite 工程目錄和 生成文件名

此時程序會啟動本機系統默認的浏覽器,並根據其句柄和端口記錄其 send 和 receive 的 HTTP 數據包。用戶對 浏覽器的任何操作,包括所有浏覽的站點、發送的請求和接收到的 Web 頁面,都會被實時的動態存儲在 <test name>.rec 記錄文件中。

第三步:關閉浏覽器或者點擊 Test Recorder 的“停止”按鈕結束記錄。記錄停止後 TPTP 根據記錄文件(<test name>.rec)生成 TPTP 自己的測試文件,即:<test name>.testsuite。

Testsuite 文件是一個序列化的 XML 文件,它是 TPTP 自身設計的腳本文件,是一個測試集合的基本單位。我們可 以雙擊打開 <test name>.testsuite 文件(如圖 5),可以看到所有浏覽過的 HTTP Request 列表,點擊“More” 可以進入每一個 Loop 或者 Testcase 中修改,修改 HTTP Request 相關的各種信息。這個 testsuite 文件在 TPTP 中可 以作為 test 文件直接運行,並且記錄自己的 log,具體操作方法為:選中 testsuite 文件,由菜單選擇 Run->Test。 本文不對此進行詳細說明,讀者可自行嘗試。

由 testsuite 向 TPTP JUnit 轉換的過程。

首先打開“Test Navigator”視圖(Eclipse 中,“Window->Show View->Other”選擇“Test 目錄下的 Test Navigator”),在 “Test Navigator”視圖中右鍵點擊 testsuite 文件,選擇“Generate”,如下圖:

圖 5. 由 testsuite 生產 Java 測試文件

然後,在彈出的 Dialog Wizard 對話框中,選擇生產 Java 文件的工程和所在目錄,點擊“Finish”。Eclipse 會自動切換視圖到“Package Explorer”,展示在大家面前的就是根據 testsuite 生產的 TPTP JUnit 文件。

這個 自動生成的 Java 文件可以直接在 TPTP 下運行,並產生自己的 log。其特點是既保留了原本 JUnit 的底層實現又結合了 現在 TPTP testsuite 的特點。

自動生產 Java 測試腳本的缺陷

自動記錄所生成的測試腳本往往不能滿足實 際的工作需要,因為在測試工作中我們經常需要對返回的頁面內容進行分析或驗證。為了達到實際測試工作的要求,我們需 要對 TPTP 的測試腳本進行一些客戶化的修改。要理解這個過程並利用其進行自己的測試驗證工作,就必須要弄清楚 TPTP 生產的這兩種文件的結構。下圖所示就是 testsuite 文件的基本結構:一個 testsuite 包括很多 Loop,每個 Loop 中又 包含有多個 Http Request;每個 HTTP Request 可以看成一個 case,當然也可以把整個 loop 甚至 testsuite 看成一個 case。在 TPTP 中,我們可以控制 Loop 的次數、可以修改每個 HTTP Request 或者 Loop 甚至整個 testsuite。

圖 6.testsuite 內部結構

由 testsuite 生成的 Java 測試腳本,是以 JUnit 為基礎,從 JUnit 的基本測試類繼承而來的 TPTP 自己的 JUnit 測試類 - HyadesTestCase,其中的測試方法對於 JUnit 的固有類進行了進一步的繼承和封裝。由於這個自動生成的 Java 文件是由 testsuite 腳本而來,所以它的結構與 testsuite 相對應,大致結構如下圖:

圖 7.TPTP 產生的 JUnit 文件結構

testsuite 中每一個 Loop 和 HTTP Request 在生成的 Java 測試文件中都有映射;同時,這個 Java 測試文件還會派生出一系列公共的方法,供每個 test 調用。其中 有一個最基本的公共方法 executeRequest,它是每個 test 調用的公共斷言,負責執行每個 HTTP Request 以及其斷言。 下面是一段公共方法調用代碼示例。

protected void executeRequest(HttpRequest request) throws Exception {
 ……
  HttpResponse response = m_httpExecutor[nUser].execute(request);
 ……
//If (response.getCode() < 400) then the request has failed.
assertTrue(text, response.getCode() < 400 && response.getCode() > 0);
}

從上面的代碼可以看出,每 個 test 斷言的依據僅僅是判斷了 response 的 getCode 代碼:

assertTrue(text, response.getCode() < 400 && response.getCode() > 0);

並沒有對返回的具體內容做出任何判斷,這對於 tester 來說基本 上是毫無用處的,因為真正的測試中往往要求對返回的頁面上一個具體字符串進行驗證。而每一個 TPTP 自動生成的 Java 測試腳本中所有 HTTP test 都僅使用上面這個方法來做驗證,所以這個自動生成的腳本用處就很有限。為了更好的利用 TPTP 來進行 Web 測試,我們需要自己手動修改其斷言方法。

但是,在這個類中的 response 對象並非 JUnit 公共 的 HttpResponse 對象,而是 TPTP 自己封裝在 org.eclipse.hyades.test.http.runner 包中的 HttpResponse 類。所以 我們只能對 TPTP 的 HttpResponse 類進行定制。

研究了 org.eclipse.hyades.test.http.runner 包內的源代碼之 後,不難看出,在 HttpExecutor 類中,其實是可以取得整個 HTTP 協議返回的內容的,但是在 TPTP 定義的執行過程中對 其返回內容進行了取捨,只提取了 HTTP Content-Type 的內容並將其封裝在 HttpResponse 對象中。因此如果使用 TPTP 封裝的 HttpResponse 類,就無法取得服務器端返回的全部內容,從而無法對內容進行驗證。

在 HttpResponse 類 的最初設計中,要求把 Web 服務器端返回的所有內容都保存在這個類的 body 屬性中。但是由於 TPTP 的自動化生成需求 ,這個 body 屬性暫時沒有用處,TPTP 的開發團隊也就暫時沒有實現這個功能,所以目前不能從 HttpResponse 對象中讀 出返回頁面的內容。

一種簡單的解決辦法:擴展 TPTP

對於內容驗證的缺陷,最直接的辦法是等待 TPTP 新 版本的發布,可惜的是由於 Eclipse TPTP 項目計劃的原因,我們幾乎等不到這麼一個版本了。在目前的情況下,我們還可 以自己動手來修改源文件以實現我們的需求。

我們從 executeRequest 方法作為入口進行分析,其大致調用結構圖 如下。

圖 8. 執行 HTTP 測試過程靜態類圖

通過研究,不難發現,服務器端返回值的處 理是在 HttpRequestHandler 類中的 getServerResponse 方法中進行的,因此我們只要在具體測試項目的源代碼中重寫這 個方法即可;同時我們還要覆蓋調用該方法的 HttpExecutor 類。本文給出一個比較簡單的實現。

分別構造上面兩 個類的子類:DHttpRequestHandler 和 DHttpExecutor,並覆蓋相關方法。代碼如下(省略部分請參考 TPTP 源代碼裡的實 現):

DHttpRequestHandler:參考源碼

package org.eclipse.hyades.test.http.runner.internal.exec; 
 public class DHttpRequestHandler extends HttpRequestHandler { 
……
    // 這裡我們覆蓋 HttpRequestHandler 的 getServerResponse 方法
    public boolean getServerResponse(HttpRequest request, HttpResponse response, \
    InputStream inputStream, int bufSize){ 
        ……
        // 將讀到的返回消息放入 content 字符串
        String content = null;
        while ((bytes_read = inputStream.read(buffer)) != -1){ 
            content.append( new String(buffer, 0, bytes_read, "UTF8") ); 
            ……
        } 
        // 設置 response 對象的 body 屬性內容為 content 字符串
        response.setBody( content.toString() ); 
    } 
 }

DHttpExecutor:參考源碼

package org.eclipse.hyades.test.http.runner; 
 public class DHttpExecutor extends HttpExecutor { 
    ……
    // 這裡我們覆蓋 HttpExecutor 的 execute 方法
    public HttpResponse execute(HttpRequest request) throws Exception 
    { 
        ……
        // 將原來的 HttpRequestHandler 類替換為我們修改後的 DHttpRequestHandler 類
        if (httpRequestHandler == null){ 
            httpRequestHandler = new DHttpRequestHandler(); 
            ……
        } 
 } 
……
 }

最後,將以上重寫的類封裝到測試項目中。在對自動生成的 TPTP JUnit 測試文件進行修改時,如果需要對 HTTP 返回的內容進行驗證,就可以把 HttpExecute 對象替換自己寫的 DHttpExecute 類對象,這樣返回的內容就可以由 DHttpExecute 對象的 getBody() 方法得到。在此基礎上可以實現對具體返回內容的驗證。由於只是簡單的繼承了 TPTP 兩 個原有類,所以不會對其它 TPTP 的測試腳本有所影響。

TPTP 開源工具框架應用展望

以上對於 TPTP 的應 用和擴展也許有一定局限性,但通過這些實踐我們可以更充分的理解 TPTP 作為一個測試平台的強大功能和可擴展性。TPTP 這個測試平台給我們提供了豐富的工具,更重要的是,它是一個開源的框架,我們可以通過對其本身的研究來汲取營養,可 以挖掘其本身的一些功能模塊來從事我們的應用,更可以把另外一個測試環境下的腳本移植成在 TPTP 上可執行的 Java 語 言腳本。如何更好的利用這個開源的平台,是一個值得研究的問題。

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