為Web應用程式建立測試案例的方法

來源:互聯網
上載者:User
web|程式|建立 您是否正在尋找一種把自動化的測試技術應用到 Web 開發中的方法?那麼不用再找了!JWebUnit 就是為 Web 應用程式建立測試案例的一個開源架構,它可以容易地插入到大多數 Java IDE 中。通過使用一個應用程式範例,描述了產生簡潔測試案例的詳細步驟,軟體工程師 Amit Tuli 對 JWebUnit 進行了介紹。

自動化的測試可以節省重複執行相同測試步驟的時間和精力。本文將介紹 jWebUnit,這是一組 Java 類,用於為 Web 應用程式開發測試案例。jWebUnit 是一個開源項目,可以在 BSD 許可下免費獲得。我將介紹如何下載 JWebUnit 庫、配置 Eclipse 平台來開發 jWebUnit 測試案例,以及如何構建一個樣本測試案例。

JWebUnit 簡介

JWebUnit 以 HttpUnit(一個進行 Web 應用程式自動化的測試的 Java 庫)和 JUnit 單元測試架構為基礎(請參閱 參考資料)。jWebUnit 提供了導航 Web 應用程式的進階 API,並組合了一組斷言,用它們來驗證鏈結接導航、表單輸入項和提交、表格內容以及其他典型商務 Web 應用程式特性的正確性。 jWebUnit 以 JAR 檔案形式提供的,可以很容易地將它插入大多數 IDE 中,jWebUnit 也包含其他必要的庫。

用 HttpUnit 進行測試

對 Web 應用程式自動進行測試意味著跳過 網頁瀏覽器,通過程式來處理 Web 網站。首先,我要介紹 HttpUnit(JWebUnit 的構建塊之一)是如何簡化這項工作的。HttpUnit 可以類比幀、javascript、頁面重新導向 cookie,等等。在將 HttpUnit 用於 JUnit 時,它可以迅速地對 Web 網站的功能進行驗證。

清單 1 顯示了一個用 HttpUnit 編寫的測試案例,它試圖單擊 HttpUnit 首頁上的“Cookbook”連結:

清單 1. 單擊 HttpUnit 首頁上 Cookbook 連結的 HttpUnit 代碼

1 public class HttpUnitTest {2  public static void main(String[] args) {3    try {4      WebConversation wc = new WebConversation();5      WebRequest request =             new GetMethodWebRequest("http://httpunit.sourceforge.net/index.html");6      wc.setProxyServer( "your.proxy.com", 80 );7      WebResponse response = wc.getResponse(request);8      WebLink httpunitLink =             response.getFirstMatchingLink(WebLink.MATCH_CONTAINED_TEXT,"Cookbook");9      response = httpunitLink.click();10      System.out.println("Test successful !!");11    } catch (Exception e) {12      System.err.println("Exception: " + e);13    }14  }15 }
清單 1 中的代碼用 your.proxy.com (第 6 行)串連 Internet。如果存在直接 網際網路連線,那麼可以把這個語句注釋掉。第 8 行的語句在頁面中搜尋包含文本 Cookbook 的 Web 連結。第 9 行的語句用於單擊這個連結。如果找到連結,那麼使用者會看到 Test Successful !這條訊息。

用 JWebUnit 進行的測試更簡單

清單 2 的測試案例用 JWebUnit API 執行和清單 1 相同的任務:

清單 2. 單擊 HttpUnit 首頁上 Cookbook 連結的 JWebUnit 代碼

1 public class JWebUnitTest extends WebTestCase{2  public static void main(String[] args){3    junit.textui.TestRunner.run(new TestSuite(JWebUnitTest.class));4  }5  public void setUp(){6    getTestContext().setBaseUrl("http://httpunit.sourceforge.net");7    getTestContext().setProxyName("webproxy.watson.ibm.com");8    getTestContext().setProxyPort(8080);9  }10  public void testSearch(){11    beginAt("/index.html");12    clickLinkWithText("Cookbook");13  }14 }


如果沒注意清單 2 中特定於 JUnit 的代碼,那麼您可以看到,測試案例現在變得相當整潔、簡練。需要查看的重要的行是第 6 行、第 11 行和第 12 行。

在第 6 行,基本 URL 被設定到 HttpUnit 的首頁中。第 11 行用相對路徑 /index.html 串連網站。第 12 行用於單擊頁面上具有文本 Cookbook 的連結。如果連結有效,那麼 JUnit 會報告成功;否則,JUnit 會報告異常。

JWebUnit API:進一步觀察

每個 JWebUnit 測試的核心都是 net.sourceforge.jwebunit.WebTestCase 類,它代表測試案例。每個測試案例都必須是從這個類擴充而來。(net.sourceforge.jwebunit.WebTestCase 類本身則是從 junit.framework.TestCase 類擴充而來的,它在 JUnit 中代表測試案例。) 表 1 描述了這個類的一些常用方法:

表 1. net.sourceforge.jwebunit.WebTestCase 類的重要方法 另一個重要的類是 net.sourceforge.jwebunit.TestContext。它為測試建立上下文。可以用這個類來處理像 cookie、會話和授權之類的資訊。表 2 顯示了這個類的一些重要方法:

表 2. net.sourceforge.jwebunit.TestContext 類的重要方法
下載 jWebUnit,在 Eclipse 中配置 jWebUnit

JWebUnit 是用純 Java 代碼實現的,所以可以以 JAR 檔案的形式獲得它 (請參閱 參考資料,從中獲得下載連結)。在完成下載之後,請按以下步驟在 Eclipse 平台上配置 JWebUnit 庫:

把下載的檔案 jwebunit-1.2.zip 釋放到臨時目錄中(假設是 C:\temp)。

在 Eclipse 中建立新 Java 項目,將其命名為 jWebUnit。

右擊 Package Explorer 視圖中的 jWebUnit 項目,然後選擇 Properties。

單擊 Java Build Path。單擊 Libraries 標籤中的 Add External JARs。

瀏覽到 C:\temp\jwebunit-1.2\lib 目錄,選擇這個目錄中的所有 JAR 檔案。

單擊 OK。

現在可以在 Eclipse 中的 jWebUnit 項目下開發 jWebUnit 測試案例了。構建應用程式範例

現在就可以查看 jWebUnit API 的實際應用了。我將帶您研究一個應用程式範例,協助您更好地理解 jWebUnit 的真正威力。這個應用程式是一個測試案例,用於開啟一個 Google 搜尋網頁面並搜尋文本 HttpUnit。應用程式需要測試以下情境:

開啟 Google 首頁 http://www.google.com。

確定該頁包含一個名為 q 的表單元素。(在 Google 的首頁上,名為 q 的文字框是接受使用者查詢輸入的文字框。)應用程式用這個元素輸入搜尋參數。

在搜尋文字框中輸入字串 HttpUnit Home,並提交表單。

獲得結果頁,並確定該頁麵包含的連結中包含文本 HttpUnit Home。

單擊包含文本 HttpUnit Home 的連結。

現在測試情境已經就緒,可以編寫 Java 應用程式,用 jWebUnit 實現這些需求了。

第一步是聲明一個從 WebTestCase 擴充而來的類,如清單 3 所示:

清單 3. 聲明測試案例類

public class GoogleTest extends WebTestCase {static String searchLink = "";}


正如我在前面提到過的,jWebUnit 要求每個測試案例都是從 WebTestCase 中擴充而來的。searchLink 儲存傳入的搜尋參數。這個值以命令列參數的形式傳遞給測試案例。

下一步是聲明進入點 —— main() 方法,如清單 4 所示:

清單 4. main() 方法

public static void main(String[] args) {searchLink = args[0];junit.textui.TestRunner.run(new TestSuite(GoogleTest.class));}

main() 方法調用 junit.textui.TestRunner.run() 執行 JTest 測試案例。因為需要運行 GoogleTest 測試案例,所以,作為參數傳遞給 run() 方法的測試套件採用 GoogleTest.class 作為參數。

接下來,JTest 調用 setUp() 方法來設定基本 URL 和代理,如清單 5 所示:

清單 5. 設定
public void setUp() {getTestContext().setBaseUrl("http://www.google.com");getTestContext().setProxyName("proxy.host.com");getTestContext().setProxyPort(80);}

清單 5 把基本 URL 設定為 http://www.google.com。這意味著測試案例的啟動是相對於這個 URL 的。下面兩個語句設定串連到 Internet 的代理主機和代理連接埠。如果是直接連接到 Internet,那麼可以忽略代理設定語句。

現在開始瀏覽網站並輸入搜尋參數。清單 6 顯示了訪問 Web 頁面,然後測試所有情境的代碼:

清單 6. 測試所有情境

public void testSearch() {beginAt("/");assertFormElementPresent("q");setFormElement("q", "HttpUnit");submit("btnG");assertLinkPresentWithText(searchLink);clickLinkWithText(searchLink);}
清單 6 的代碼串連到基本 URL,並相對於 / 開始瀏覽。然後它斷定頁面中包含一個名為 q 的表單元素 —— q 是 Google 首頁上查詢輸入文字框的名稱。下一條語句用值 HttpUnit 設定名為 q 的文字框。

再下一條語言提交表單上名為 btnG 的提交按鈕。(在 Google 的首頁上,名為 btnG 的按鈕是標籤為 Google Search 的按鈕。)表單是在這個對話中提交的,下一頁列出搜尋結果。在結果頁面上,代碼首先檢查是否有一個連結的文本是 HttpUnit Home。如果該連結不存在,那麼測試就以 AssertionFailedError 失敗。如果該連結存在,則測試執行的下一個操作是單擊連結。

運行應用程式範例

現在把應用程式範例投入使用當中:

下載應用程式範例 j-webunitsample.jar 。

在一個目錄中解壓縮 j-webunitsample.jar。例如,如果把它釋放到 C:\temp 中,那麼就要把源檔案和類檔案放在 C:\temp\com\jweb\test 中,而 setclasspth.bat 則放在 C:\temp 中。

編輯 setclasspath.bat:設定 JAR_BASE 指向包含所有必需 JAR 檔案的目錄。例如,如果在 C:\temp 中釋放 jwebunit-1.2.zip 檔案,那麼將 JAR_BASE 設定為 C:\temp\jwebunit-1.2\lib。

開啟命令列提示符,切換到 C:\temp 目錄。

執行 setclasspath.bat。這會設定執行測試案例所需的 CLASSPATH。

用命令 java com.jweb.test.GoogleTest "HttpUnit Home" 運行應用程式。

樣本輸出

在執行了測試案例之後,會在命令列輸出一個測試案例報告。如果測試失敗,報告看起來如清單 7 中所示:

清單 7. 帶有宣告失敗的輸出

C:\temp>java com.jweb.test.GoogleTest "HttpUnit Hwee".FTime: 5.338There was 1 failure:1) testSearch(com.jweb.test.GoogleTest)junit.framework.AssertionFailedError: Link   with text [HttpUnit Hwee] not found in response.at net.sourceforge.jwebunit.WebTester.assertLinkPresentWithText(WebTester.java:618)at net.sourceforge.jwebunit.WebTestCase.assertLinkPresentWithText(WebTestCase.java:244)at com.jweb.test.GoogleTest.testSearch(GoogleTest.java:36)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at com.jweb.test.GoogleTest.main(GoogleTest.java:19)FAILURES!!!Tests run: 1,  Failures: 1,  Errors: 0

正如在清單 7 中可以看到的,可以用 HttpUnit Hwee 作為參數來執行測試案例。這個測試案例遇到斷言的地方會失敗,因為結果頁面中不包含帶有這個文本的連結。由此也就產生了junit.framework.AssertionFailedError。

清單 8 執行時用 HttpUnit Home 作為參數。測試案例找到一個帶有這個文本的連結,所以測試通過了:

清單 8. 成功測試的輸出

C:\temp>java com.jweb.test.GoogleTest "HttpUnit Home".Time: 6.991OK (1 test)

結束語

本文通過討論 jWebUnit 架構的一些突出特性和最重要的類,介紹如何用它建立簡潔的測試案例,讓您對 jWebUnit 架構有一個認識。jWebUnit 還有更多特性可以用在測試案例中。它支援測試 Web 頁面中的連結行數。可以對字串、表或者帶有指定標籤的表單輸入元素是否存在於頁面上進行斷言。此外,jWebUnit 還可以處理 cookie (例如斷言存在某個 cookie、刪除 cookie 等。)測試可以對某個文本之後出現的特定文本的連結進行單擊。 如果想為 Web 應用程式構建快而有效測試案例,jWebUnit 可能是您最好的朋友。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.