HttpUnit簡介

jopen 11年前發布 | 29K 次閱讀 HttpUnit 單元測試

對httpunit的概念是一片茫然,google了一下。

1.下載網址

目前版本是1.6.2,網上新版本的介紹中文的很罕見,找了兩個比較舊的相關信息copy過來,僅僅為了有個粗略的印象。

文1

HttpUnit從根本上說并不是單元測試。它更接近于功能測試。使用HttpUnit編寫的Web應用程序測試并不對應用程序代碼的片段做測試,而是在外部詢問Web服務器并檢查接收的響應。
HttpUnit的WebClient(抽象類)/WebConversation扮演了諸如Web瀏覽器之類的角色: 維護客戶端狀態——包括諸如cookies、相關URL以及頁面框架設置之類的持續響應頭,并且允許某個用戶發送請求到指定資源和得到響應。
下面這個例子假設訪問一個需要登陸的站點,對于登陸部分所做的測試。

import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebForm;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;

import junit.framework.TestCase;

/**

  • @author davis
    *
  • TODO To change the template for this generated type comment go to
  • Window - Preferences - Java - Code Style - Code Templates
    /
    public class TestSample extends TestCase {

      WebConversation conversation;
      
      /

       @see TestCase#setUp()
      
    /
      protected void setUp() throws Exception {
        conversation = new WebConversation();    
      }
      
      private WebResponse goToPrivatePage() throws Exception {
        return conversation.getResponse("http://localhost:8080/myreport/reportGroup.action");
      }
      
      public void testLogin() throws Exception {
        WebResponse response = this.goToPrivatePage();
        //驗證是否在登陸頁面
        assertLoginPage(response);
        //使用不正確的用戶名和密碼登陸
        response = login(response, "xxx", "xxx");
        assertLoginPage(response);
        
        //檢查錯誤信息
        String pageStr = response.getText();
        assertTrue(pageStr.indexOf("用戶名和密碼不正確") > -1);
        
        //正確登陸
        response = login(response, "test", "test");
    //檢查已經不在登陸頁面
        assertTrue(!response.getTitle().equals("Login"));
      }
      
      public void assertLoginPage(WebResponse response) throws Exception {
        //驗證頁面的標題一般是一個快速的驗證是否在正確頁面的方法
        assertEquals("成功登陸", "Login", response.getTitle());
      }
      
      public WebResponse login(WebResponse loginPage, String userName, String pass) throws Exception {
        WebForm form = loginPage.getForms()[0];
        WebRequest loginRequest = form.getRequest();
        loginRequest.setParameter("userName", userName);
        loginRequest.setParameter("password", pass);
        return conversation.getResponse(loginRequest);
      }
    }

    然后在Eclipse中將這個測試Run/Junit Test就可以了,是不是很簡單Smile

    btw:最新的HttpUnit 1.5.4已經支持JavaScript了。 </span>
    </span></div>

    文2

    使用HttpUnit進行集成測試

    [內容摘要] HttpUnit是一個集成測試工具,主要關注Web應用的測試,提供的幫助類讓測試者可以通過Java類和服務器進行交互,并且將服務器端的響應當作文本或者DOM對象進行處理。HttpUnit還提供了一個模擬Servlet容器,讓你可以不需要發布Servlet,就可以對Servlet的內部代碼進行測試。本文中作者將詳細的介紹如何使用HttpUnit提供的類完成集成測試。

    關鍵詞: httpunit 集成測試
    1 HttpUnit簡介
    HttpUnit是SourceForge下面的一個開源項目,它是基于JUnit的一個測試框架,主要關注于測試Web應用,解決使用JUnit框架無法對遠程Web內容進行測試的弊端。當前的最新版本是1.5.4。為了讓HtpUnit正常運行,你應該安裝JDK1.3.1或者以上版本。
    1.1 工作原理
    HttpUnit通過模擬瀏覽器的行為,處理頁面框架(frames),cookies,頁面跳轉(redirects)等。通過HttpUnit提供的功能,你可以和服務器端進行信息交互,將返回的網頁內容作為普通文本、XML Dom對象或者是作為鏈接、頁面框架、圖像、表單、表格等的集合進行處理,然后使用JUnit框架進行測試,還可以導向一個新的頁面,然后進行新頁面的處理,這個功能使你可以處理一組在一個操作鏈中的頁面。
    1.2 和其他商業工具的對比
    商業工具一般使用記錄、回放的功能來實現測試,但是這里有個缺陷,就是當頁面設計被修改以后,這些被記錄的行為就不能重用了,需要重新錄制才能繼續測試。
    舉個例子:如果頁面上有個元素最先的設計是采用單選框,這個時候你開始測試,那么這些工具記錄的就是你的單項選擇動作,但是如果你的設計發生了變化,比如說我改成了下拉選擇,或者使用文本框接受用戶輸入,這時候,你以前錄制的測試過程就無效了,必須要重新錄制。
    而HttpUnit因為關注點是這些控件的內容,所以不管你的外在表現形式如何變化,都不影響你已確定測試的可重用性。

    更多的關于httpunit的信息請訪問httpunit的主頁http://httpunit.sourceforge.net/
    2 作者的演示環境
    系統平臺:Windows 2000 Sercver
    應用服務器:深圳金蝶的apusic3.0
    開發工具: eclipse 2.1.2

    說明: 所有的代碼請下載作者提供的code.jar文件。
    3 HttpUnit安裝、環境配置
    3.1 安裝

  • 到HttpUnit的主頁http://httpunit.sourceforge.net下載最新的包文件,當前的最新版本是1.5.4。/
  • 將下載。Zip包解壓縮到c:/httpunit(后面將使用%httpunit_home%引用該目錄)
    3.2 環境配置
    作者的演示程序都是在eclipse中開發、執行的,所以環境配置都是以eclipse為例,如果你使用其他的開發工具,請根據這些步驟進行環境配置。
  • 啟動eclipse,建立一個java工程
  • 將%httpunit_home%/lib/.jar; %httpunit_home%/jars/.jar加入到該java工程的Java build Path變量中
    4 如何使用httpunit處理頁面的內容
    WebConversation類是HttpUnit框架中最重要的類,它用于模擬瀏覽器的行為。其他幾個重要的類是:
    WebRequest  模仿客戶請求,通過它可以向服務器發送信息
    WebResponse 模擬瀏覽器獲取服務器端的響應信息
    4.1 獲取指定頁面的內容
    4.1.1 直接獲取頁面內容</span></p>

    System.out.println("直接獲取網頁內容:");
    // 建立一個WebConversation實例
      WebConversation wc = new WebConversation();
    // 向指定的URL發出請求,獲取響應
      WebResponse wr = wc.getResponse( "http://localhost:6888/HelloWorld.html" );
    // 用getText方法獲取相應的全部內容
    // 用System.out.println將獲取的內容打印在控制臺上
      System.out.println( wr.getText() );
    4.1.2 通過Get方法訪問頁面并且加入參數
    System.out.println("向服務器發送數據,然后獲取網頁內容:");
    //建立一個WebConversation實例
    WebConversation wc = new WebConversation();
    //向指定的URL發出請求
    WebRequest     req = new GetMethodWebRequest( "http://localhost:6888/HelloWorld.jsp" );
    //給請求加上參數 
    req.setParameter("username","姓名");
    //獲取響應對象
    WebResponse   resp = wc.getResponse( req );

    //用getText方法獲取相應的全部內容
    //用System.out.println將獲取的內容打印在控制臺上
    System.out.println( resp.getText() );
    4.1.3 通過Post方法訪問頁面并且加入參數
    System.out.println("使用Post方式向服務器發送數據,然后獲取網頁內容:");
    //建立一個WebConversation實例
    WebConversation wc = new WebConversation();
    //向指定的URL發出請求
    WebRequest     req = new PostMethodWebRequest( "http://localhost:6888/HelloWorld.jsp" );
    //給請求加上參數 
    req.setParameter("username","姓名");
    //獲取響應對象
    WebResponse   resp = wc.getResponse( req );

    //用getText方法獲取相應的全部內容
    //用System.out.println將獲取的內容打印在控制臺上
    System.out.println( resp.getText() );

    大家關注一下上面代碼中打了下劃線的兩處內容,應該可以看到,使用Get、Post方法訪問頁面的區別就是使用的請求對象不同。
    4.2 處理頁面中的鏈接
    這里的演示是找到頁面中的某一個鏈接,然后模擬用戶的單機行為,獲得它指向文件的內容。比如在我的頁面HelloWorld.html中有一個鏈接,它顯示的內容是TestLink,它指向我另一個頁面TestLink.htm. TestLink.htm里面只顯示TestLink.html幾個字符。
    下面是處理代碼:
    System.out.println("獲取頁面中鏈接指向頁面的內容:");
    //建立一個WebConversation實例
    WebConversation wc = new WebConversation();
    //獲取響應對象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/HelloWorld.html" );
    //獲得頁面鏈接對象
    WebLink       link = resp.getLinkWith( "TestLink" );
    //模擬用戶單擊事件
    link.click();
    //獲得當前的響應對象
    WebResponse   nextLink = wc.getCurrentPage();                                          

    //用getText方法獲取相應的全部內容
    //用System.out.println將獲取的內容打印在控制臺上
    System.out.println( nextLink.getText() );
    4.3 處理頁面中的表格
    表格是用來控制頁面顯示的常規對象,在HttpUnit中使用數組來處理頁面中的多個表格,你可以用resp.getTables()方法獲取頁面所有的表格對象。他們依照出現在頁面中的順序保存在一個數組里面。
    [注意] Java中數組下標是從0開始的,所以取第一個表格應該是resp.getTables()[0],其他以此類推。
    下面的例子演示如何從頁面中取出第一個表格的內容并且將他們循環顯示出來:
    System.out.println("獲取頁面中表格的內容:");
    //建立一個WebConversation實例
    WebConversation wc = new WebConversation();
    //獲取響應對象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/HelloWorld.html</a>" );
    //獲得對應的表格對象
    WebTable webTable = resp.getTables()[0];
    //將表格對象的內容傳遞給字符串數組
    String[][] datas = webTable.asText();
    //循環顯示表格內容
    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;
    }
    4.4 處理頁面中的表單
    表單是用來接受用戶輸入,也可以向用戶顯示用戶已輸入信息(如需要用戶修改數據時,通常會顯示他以前輸入過的信息),在HttpUnit中使用數組來處理頁面中的多個表單,你可以用resp.getForms()方法獲取頁面所有的表單對象。他們依照出現在頁面中的順序保存在一個數組里面。
    [注意] Java中數組下標是從0開始的,所以取第一個表單應該是resp.getForms()[0],其他以此類推。
    下面的例子演示如何從頁面中取出第一個表單的內容并且將他們循環顯示出來:
    System.out.println("獲取頁面中表單的內容:");
    //建立一個WebConversation實例
    WebConversation wc = new WebConversation();
    //獲取響應對象
    WebResponse   resp = wc.getResponse( "
    http://localhost:6888/HelloWorld.html" );
    //獲得對應的表單對象
    WebForm webForm = resp.getForms()[0];
    //獲得表單中所有控件的名字
    String[] pNames = webForm.getParameterNames();
    int i = 0;
    int m = pNames.length;
    //循環顯示表單中所有控件的內容
    while(i<m){
    System.out.println("第"+(i+1)+"個控件的名字是"+pNames+",里面的內容是"+webForm.getParameterValue(pNames));
    ++i;
    }
    5 如何使用httpunit進行測試
    5.1 對頁面內容進行測試
    httpunit中的這部分測試完全采用了JUnit的測試方法,即直接將你期望的結果和頁面中的輸出內容進行比較。不過這里的測試就簡單多了,只是字符串和字符串的比較。
    比如你期望中的頁面顯示是中有一個表格,它是頁面中的第一個表格,而且他的第一行第一列的數據應該是顯示username,那么你可以使用下面的代碼進行自動化測試:
    System.out.println("獲取頁面中表格的內容并且進行測試:");
    //建立一個WebConversation實例
    WebConversation wc = new WebConversation();
    //獲取響應對象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/TableTest.html" );
    //獲得對應的表格對象
    WebTable webTable = resp.getTables()[0];
    //將表格對象的內容傳遞給字符串數組
    String[][] datas = webTable.asText();
    //對表格內容進行測試
    String expect = "中文";
    Assert.assertEquals(expect,datas[0][0]);
    5.2 對Servlet進行測試
    除了對頁面內容進行測試外,有時候(比如開發復雜的Servlets的時候),你需要對Servlet本身的代碼塊進行測試,這時候你可以選擇 HttpUnit,它可以提供一個模擬的Servlet容器,讓你的Servlet代碼不需要發布到Servlet容器(如tomcat)就可以直接測試。
    5.2.1 原理簡介
    使用httpunit測試Servlet時,請創建一個ServletRunner的實例,他負責模擬Servlet容器環境。如果你只是測試一個 Servlet,你可以直接使用registerServlet方法注冊這個Servlet,如果需要配置多個Servlet,你可以編寫自己的 web.xml,然后在初始化ServletRunner的時候將它的位置作為參數傳給ServletRunner的構造器。
    在測試Servlet時,應該記得使用ServletUnitClient類作為客戶端,他和前面用過的WebConversation差不多,都繼承自 WebClient,所以他們的調用方式基本一致。要注意的差別是,在使用ServletUnitClient時,他會忽略URL中的主機地址信息,而是直接指向他的ServletRunner實現的模擬環境。
    5.2.2 簡單測試
    本實例只是演示如何簡單的訪問Servlet并且獲取他的輸出信息,例子中的Servlet在接到用戶請求的時候只是返回一串簡單的字符串:Hello World!.

  • Servlet的代碼如下:
    public class MyServlet extends HttpServlet {</span></p>

    public void service(HttpServletRequest req, HttpServletResponse resp)
    throws IOException
    {
    PrintWriter out = resp.getWriter();
    //向瀏覽器中寫一個字符串Hello World!
    out.println("<html><body>Hello World!</body></html>");
    out.close();
    }

     

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