軟件測試中使用HttpUnit進(jìn)行集成測試
[內容摘要] HttpUnit是一個(gè)集成測試工具,主要關(guān)注Web應用的測試,提供的幫助類(lèi)讓測試者可以通過(guò)Java類(lèi)和服務(wù)器進(jìn)行交互,并且將服務(wù)器端的響應當作文本或者DOM對象進(jìn)行處理。HttpUnit還提供了一個(gè)模擬Servlet容器,讓你可以不需要發(fā)布Servlet,就可以對Servlet的內部代碼進(jìn)行測試。本文中作者將詳細的介紹如何使用HttpUnit提供的類(lèi)完成集成測試。
關(guān)鍵詞: httpunit 集成測試
1 HttpUnit簡(jiǎn)介
HttpUnit是SourceForge下面的一個(gè)開(kāi)源項目,它是基于JUnit的一個(gè)測試框架,主要關(guān)注于測試Web應用,解決使用JUnit框架無(wú)法對遠程Web內容進(jìn)行測試的弊端。當前的最新版本是1.5.4。為了讓HtpUnit正常運行,你應該安裝JDK1.3.1或者以上版本。
1.1 工作原理
HttpUnit通過(guò)模擬瀏覽器的行為,處理頁(yè)面框架(frames),cookies,頁(yè)面跳轉(redirects)等。通過(guò)HttpUnit提供的功能,你可以和服務(wù)器端進(jìn)行信息交互,將返回的網(wǎng)頁(yè)內容作為普通文本、XML Dom對象或者是作為鏈接、頁(yè)面框架、圖像、表單、表格等的集合進(jìn)行處理,然后使用JUnit框架進(jìn)行測試,還可以導向一個(gè)新的頁(yè)面,然后進(jìn)行新頁(yè)面的處理,這個(gè)功能使你可以處理一組在一個(gè)操作鏈中的頁(yè)面。
1.2 和其他商業(yè)工具的對比
商業(yè)工具一般使用記錄、回放的功能來(lái)實(shí)現測試,但是這里有個(gè)缺陷,就是當頁(yè)面設計被修改以后,這些被記錄的行為就不能重用了,需要重新錄制才能繼續測試。
舉個(gè)例子:如果頁(yè)面上有個(gè)元素最先的設計是采用單選框,這個(gè)時(shí)候你開(kāi)始測試,那么這些工具記錄的就是你的單項選擇動(dòng)作,但是如果你的設計發(fā)生了變化,比如說(shuō)我改成了下拉選擇,或者使用文本框接受用戶(hù)輸入,這時(shí)候,你以前錄制的測試過(guò)程就無(wú)效了,必須要重新錄制。
而HttpUnit因為關(guān)注點(diǎn)是這些控件的內容,所以不管你的外在表現形式如何變化,都不影響你已確定測試的可重用性。
更多的關(guān)于httpunit的信息請訪(fǎng)問(wèn)httpunit的主頁(yè) http://httpunit.sourceforge.net/
2 作者的演示環(huán)境
系統平臺:Windows 2000 Sercver
應用服務(wù)器:深圳金蝶的apusic3.0
開(kāi)發(fā)工具: eclipse 2.1.2
說(shuō)明: 所有的代碼請下載作者提供的code.jar文件。
3 HttpUnit安裝、環(huán)境配置
3.1 安裝
1. 到HttpUnit的主頁(yè) http://httpunit.sourceforge.net 下載最新的包文件,當前的最新版本是1.5.4。/
2. 將下載。Zip包解壓縮到c:/httpunit(后面將使用%httpunit_home%引用該目錄)
3.2 環(huán)境配置
作者的演示程序都是在eclipse中開(kāi)發(fā)、執行的,所以環(huán)境配置都是以eclipse為例,如果你使用其他的開(kāi)發(fā)工具,請根據這些步驟進(jìn)行環(huán)境配置。
1. 啟動(dòng)eclipse,建立一個(gè)java工程
2. 將%httpunit_home%/lib/*.jar; %httpunit_home%/jars/*.jar加入到該java工程的Java build Path變量中
4 如何使用httpunit處理頁(yè)面的內容
WebConversation類(lèi)是HttpUnit框架中最重要的類(lèi),它用于模擬瀏覽器的行為。其他幾個(gè)重要的類(lèi)是:
WebRequest 模仿客戶(hù)請求,通過(guò)它可以向服務(wù)器發(fā)送信息
WebResponse 模擬瀏覽器獲取服務(wù)器端的響應信息
4.1 獲取指定頁(yè)面的內容
4.1.1 直接獲取頁(yè)面內容
clearcase/" target="_blank" >cccccc>System.out.println("直接獲取網(wǎng)頁(yè)內容:"); // 建立一個(gè)WebConversation實(shí)例 WebConversation wc = new WebConversation(); // 向指定的URL發(fā)出請求,獲取響應 WebResponse wr = wc.getResponse( " http://localhost:6888/HelloWorld.html " ); // 用getText方法獲取相應的全部?jì)热? // 用System.out.println將獲取的內容打印在控制臺上 System.out.println( wr.getText() ); |
4.1.2 通過(guò)Get方法訪(fǎng)問(wèn)頁(yè)面并且加入參數
System.out.println("向服務(wù)器發(fā)送數據,然后獲取網(wǎng)頁(yè)內容:");
//建立一個(gè)WebConversation實(shí)例 //用getText方法獲取相應的全部?jì)热? |
4.1.3 通過(guò)Post方法訪(fǎng)問(wèn)頁(yè)面并且加入參數
System.out.println("使用Post方式向服務(wù)器發(fā)送數據,然后獲取網(wǎng)頁(yè)內容:");
//建立一個(gè)WebConversation實(shí)例 //用getText方法獲取相應的全部?jì)热? |
大家關(guān)注一下上面代碼中打了下劃線(xiàn)的兩處內容,應該可以看到,使用Get、Post方法訪(fǎng)問(wèn)頁(yè)面的區別就是使用的請求對象不同。
4.2 處理頁(yè)面中的鏈接
這里的演示是找到頁(yè)面中的某一個(gè)鏈接,然后模擬用戶(hù)的單機行為,獲得它指向文件的內容。比如在我的頁(yè)面HelloWorld.html中有一個(gè)鏈接,它顯示的內容是TestLink,它指向我另一個(gè)頁(yè)面TestLink.htm. TestLink.htm里面只顯示TestLink.html幾個(gè)字符。
下面是處理代碼:
//用getText方法獲取相應的全部?jì)热? |
4.3 處理頁(yè)面中的表格
表格是用來(lái)控制頁(yè)面顯示的常規對象,在HttpUnit中使用數組來(lái)處理頁(yè)面中的多個(gè)表格,你可以用resp.getTables()方法獲取頁(yè)面所有的表格對象。他們依照出現在頁(yè)面中的順序保存在一個(gè)數組里面。
[注意] Java中數組下標是從0開(kāi)始的,所以取第一個(gè)表格應該是resp.getTables()[0],其他以此類(lèi)推。
下面的例子演示如何從頁(yè)面中取出第一個(gè)表格的內容并且將他們循環(huán)顯示出來(lái):
System.out.println("獲取頁(yè)面中表格的內容:");
//建立一個(gè)WebConversation實(shí)例 WebConversation wc = new WebConversation(); //獲取響應對象 WebResponse resp = wc.getResponse( " http://localhost:6888/HelloWorld.html " ); //獲得對應的表格對象 WebTable webTable = resp.getTables()[0]; //將表格對象的內容傳遞給字符串數組 String[][] datas = webTable.asText(); //循環(huán)顯示表格內容 int i = 0 ,j = 0; int m = datas[0].length; int n = datas.length; while (i<n){ j=0; while(j<m){ System.out.println("表格中第"+(i+1)+"行第"+(j+1)+"列的內容是:"+datas[j]); ++j; } ++i; } |
原文轉自:http://kjueaiud.com