<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    輕松

    記述我學習java的里程

    常用鏈接

    統計

    積分與排名

    友情鏈接

    最新評論

    使用HttpUnit進行集成測試

    內容摘要

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

    應用服務器:深圳金蝶的apusic3.0

    開發工具: eclipse 2.1.2

    3  HttpUnit安裝、環境配置

    3.1  安裝

    1. 到HttpUnit的主頁http://httpunit.sourceforge.net下載最新的包文件,當前的最新版本是1.5.4。

    2. 將下載的Zip包解壓縮到c:/httpunit(后面將使用%httpunit_home%引用該目錄)

    3.2  環境配置

    作者的演示程序都是在eclipse中開發、執行的,所以環境配置都是以eclipse為例,如果你使用其他的開發工具,請根據這些步驟進行環境配置。

    1. 啟動eclipse,建立一個java工程
    2. 將%httpunit_home%/lib/*.jar; %httpunit_home%/jars/*.jar加入到該java工程的Java build Path變量中

    4  如何使用httpunit處理頁面的內容

    WebConversation類是HttpUnit框架中最重要的類,它用于模擬瀏覽器的行為。其他幾個重要的類是:

    WebRequest類,模仿客戶請求,通過它可以向服務器發送信息。

    WebResponse類,模擬瀏覽器獲取服務器端的響應信息。

    4.1  獲取指定頁面的內容

    4.1.1  直接獲取頁面內容

    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" );
    //獲得對應的表格對象
    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[i][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[i]+
       ",里面的內容是"+webForm.getParameterValue(pNames[i]));
       ++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!.

    1. Servlet的代碼如下:

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

    2. 測試的調用代碼如下:

    //創建Servlet的運行環境
    ServletRunner sr = new ServletRunner();
    //向環境中注冊Servlet
    sr.registerServlet( "myServlet", MyServlet.class.getName() );
    //創建訪問Servlet的客戶端
    ServletUnitClient sc = sr.newClient();
    //發送請求
    WebRequest request   = new GetMethodWebRequest( "http://localhost/myServlet" );
    //獲得模擬服務器的信息
    WebResponse response = sc.getResponse( request );
    //將獲得的結果打印到控制臺上
    System.out.println(response.getText());
    

    5.2.3  測試Servlet的內部行為

    對于開發者來說,僅僅測試請求和返回信息是不夠的,所以HttpUnit提供的ServletRunner模擬器可以讓你對被調用Servlet內部的行為進行測試。和簡單測試中不同,這里使用了InvocationContext獲得該Servlet的環境,然后你可以通過InvocationContext對象針對request、response等對象或者是該Servlet的內部行為(非服務方法)進行操作。

    下面的代碼演示了如何使用HttpUnit模擬Servlet容器,并且通過InvocationContext對象,測試Servlet內部行為的大部分工作,比如控制request、session、response等。

    //創建Servlet的運行環境
    ServletRunner sr = new ServletRunner();
    //向環境中注冊Servlet
    sr.registerServlet( "InternalServlet", InternalServlet.class.getName() );
    //創建訪問Servlet的客戶端
    ServletUnitClient sc = sr.newClient();
    
    //發送請求
    WebRequest request   = new GetMethodWebRequest( "http://localhost/InternalServlet" );
    request.setParameter("pwd","pwd");
    //獲得該請求的上下文環境
    InvocationContext ic = sc.newInvocation( request );
            
    //調用Servlet的非服務方法
    InternalServlet is = (InternalServlet)ic.getServlet();
    is.myMethod();
         
    //直接通過上下文獲得request對象
    System.out.println("request中獲取的內容:"+ic.getRequest().getParameter("pwd"));
         
    //直接通過上下文獲得response對象,并且向客戶端輸出信息
    ic.getResponse().getWriter().write("haha");
         
    //直接通過上下文獲得session對象,控制session對象
    //給session賦值
    ic.getRequest().getSession().setAttribute("username","timeson");
    //獲取session的值
    System.out.println("session中的值:"+ic.getRequest().getSession().getAttribute("username"));
              
    //使用客戶端獲取返回信息,并且打印出來
    WebResponse response = ic.getServletResponse();
    System.out.println(response.getText());
    

    [注意]

    在測試Servlet的之前,你必須通過InvocationContext完成Servlet中的service方法中完成的工作,因為通過newInvocation方法獲取InvocationContext實例的時候該方法并沒有被調用。

    6  總結

    本文中,作者詳細的演示和介紹了如何使用HttpUnit提供的類來進行集成測試,主要實現以下操作:

    1. 模擬用戶行為向服務器發送請求,傳遞參數
    2. 模擬用戶接受服務器的響應信息,并且通過輔助類分析這些響應信息,結合JUnit框架進行測試
    3. 使用HttpUnit提供的模擬Servler容器,測試開發中的Servlet的內部行為

    參考資料

    1. HttpUnit幫助  http://httpunit.sourceforge.net
    2. JUnit幫助  http://junit.org/index.htm

    posted on 2005-01-27 09:56 輕松 閱讀(17436) 評論(7)  編輯  收藏 所屬分類: Junit相關

    評論

    # re: 使用HttpUnit進行集成測試 2005-08-11 16:59 Bosh

    不錯,淺顯易懂! 不知道大家在開發Web App的時候,一般都如何組織單體測試? 是前后端分開嗎?(比如:前端采用Httpunit或者其他的?,后端采用JUnit) 有什么好的經驗教訓請不吝賜教!:)  回復  更多評論   

    # re: 使用HttpUnit進行集成測試 2007-05-09 10:01 xpy

    5.2.2 簡單測試的我通過了,5.2.3 測試Servlet的內部行為,你沒有給InternalServlet類啊 ,測試不通過,不給分。呵呵。  回復  更多評論   

    # re: 使用HttpUnit進行集成測試 2007-08-02 09:55 anna

    5.2.3 測試Servlet的內部行為有錯嗎?
      回復  更多評論   

    # re: 使用HttpUnit進行集成測試 2009-04-30 15:22 hello

    很不錯
      回復  更多評論   

    # re: 使用HttpUnit進行集成測試 2009-09-02 10:30 shc

    寫得相當簡潔明了!  回復  更多評論   

    # 怎樣處理Xml? 2010-04-15 10:57 higkoo

    直接使用上述方法訪問Xml的時候,拿不到Xml內容。  回復  更多評論   

    # re: 使用HttpUnit進行集成測試 2011-09-28 11:21 路過

    為什么我在測試鏈接的時候,link.click()之后的currentPage不是鏈接的頁面而是原始頁面呢  回復  更多評論   

    主站蜘蛛池模板: 日本免费网站视频www区| 日韩激情淫片免费看| 91亚洲精品麻豆| 日本成人在线免费观看| 国产免费黄色无码视频 | 国产AV无码专区亚洲精品| 国产免费的野战视频| 免费无遮挡无码视频在线观看| 久久久久亚洲AV片无码| 在线日韩av永久免费观看| 国产成人AV免费观看| 亚洲中文无码永久免| 亚洲av中文无码乱人伦在线播放| 免费看国产精品3a黄的视频| 免费成人在线视频观看| 欧美亚洲精品一区二区| 亚洲综合图片小说区热久久| 亚洲男人av香蕉爽爽爽爽| 国产成人无码免费看视频软件 | 婷婷国产偷v国产偷v亚洲| 精品无码一区二区三区亚洲桃色| 破了亲妺妺的处免费视频国产| 污污网站免费观看| 国产亚洲精品国产福利在线观看 | 亚洲国产精品久久久久秋霞小 | 青青草原亚洲视频| 日韩免费一区二区三区| 91九色老熟女免费资源站| 国产精品免费大片一区二区| 中文字幕无码亚洲欧洲日韩| 在线免费观看亚洲| 亚洲精品成人无码中文毛片不卡| 日本一道高清不卡免费| 亚洲人成电影网站免费| 日韩精品久久久久久免费| sss在线观看免费高清| 国产亚洲综合久久| 一区二区亚洲精品精华液| 亚洲国产精品日韩在线| 午夜亚洲国产理论秋霞| 亚洲韩国精品无码一区二区三区 |