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

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

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

    HttpUnit進(jìn)行集成測(cè)試

     

    內(nèi)容摘要

    HttpUnit是一個(gè)集成測(cè)試工具,主要關(guān)注Web應(yīng)用的測(cè)試,提供的幫助類(lèi)讓測(cè)試者可以通過(guò)Java類(lèi)和服務(wù)器進(jìn)行交互,并且將服務(wù)器端的響應(yīng)當(dāng)作文本或者DOM對(duì)象進(jìn)行處理。HttpUnit還提供了一個(gè)模擬Servlet容器,讓你可以不需要發(fā)布Servlet,就可以對(duì)Servlet的內(nèi)部代碼進(jìn)行測(cè)試。本文中作者將詳細(xì)的介紹如何使用HttpUnit提供的類(lèi)完成集成測(cè)試。

    1  HttpUnit簡(jiǎn)介

    HttpUnit是SourceForge下面的一個(gè)開(kāi)源項(xiàng)目,它是基于JUnit的一個(gè)測(cè)試框架,主要關(guān)注于測(cè)試Web應(yīng)用,解決使用JUnit框架無(wú)法對(duì)遠(yuǎn)程Web內(nèi)容進(jìn)行測(cè)試的弊端。當(dāng)前的最新版本是1.5.4。為了讓HtpUnit正常運(yùn)行,你應(yīng)該安裝JDK1.3.1或者以上版本。

    1.1  工作原理

    HttpUnit通過(guò)模擬瀏覽器的行為,處理頁(yè)面框架(frames),cookies,頁(yè)面跳轉(zhuǎn)(redirects)等。通過(guò)HttpUnit提供的功能,你可以和服務(wù)器端進(jìn)行信息交互,將返回的網(wǎng)頁(yè)內(nèi)容作為普通文本、XML Dom對(duì)象或者是作為鏈接、頁(yè)面框架、圖像、表單、表格等的集合進(jìn)行處理,然后使用JUnit框架進(jìn)行測(cè)試,還可以導(dǎo)向一個(gè)新的頁(yè)面,然后進(jìn)行新頁(yè)面的處理,這個(gè)功能使你可以處理一組在一個(gè)操作鏈中的頁(yè)面。

    1.2  和其他商業(yè)工具的對(duì)比

    商業(yè)工具一般使用記錄、回放的功能來(lái)實(shí)現(xiàn)測(cè)試,但是這里有個(gè)缺陷,就是當(dāng)頁(yè)面設(shè)計(jì)被修改以后,這些被記錄的行為就不能重用了,需要重新錄制才能繼續(xù)測(cè)試。

    舉個(gè)例子:如果頁(yè)面上有個(gè)元素最先的設(shè)計(jì)是采用單選框,這個(gè)時(shí)候你開(kāi)始測(cè)試,那么這些工具記錄的就是你的單項(xiàng)選擇動(dòng)作,但是如果你的設(shè)計(jì)發(fā)生了變化,比如說(shuō)我改成了下拉選擇,或者使用文本框接受用戶(hù)輸入,這時(shí)候,你以前錄制的測(cè)試過(guò)程就無(wú)效了,必須要重新錄制。

    而HttpUnit因?yàn)殛P(guān)注點(diǎn)是這些控件的內(nèi)容,所以不管你的外在表現(xiàn)形式如何變化,都不影響你已確定測(cè)試的可重用性。

    更多的關(guān)于httpunit的信息請(qǐng)?jiān)L問(wèn)httpunit的主頁(yè)http://httpunit.sourceforge.net

    2  作者的演示環(huán)境

    系統(tǒng)平臺(tái):Windows 2000 Server

    應(yīng)用服務(wù)器:深圳金蝶的apusic3.0

    開(kāi)發(fā)工具: eclipse 2.1.2

    3  HttpUnit安裝、環(huán)境配置

    3.1  安裝

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

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

    3.2  環(huán)境配置

    作者的演示程序都是在eclipse中開(kāi)發(fā)、執(zhí)行的,所以環(huán)境配置都是以eclipse為例,如果你使用其他的開(kāi)發(fā)工具,請(qǐng)根據(jù)這些步驟進(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è)面的內(nèi)容

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

    WebRequest類(lèi),模仿客戶(hù)請(qǐng)求,通過(guò)它可以向服務(wù)器發(fā)送信息。

    WebResponse類(lèi),模擬瀏覽器獲取服務(wù)器端的響應(yīng)信息。

    4.1  獲取指定頁(yè)面的內(nèi)容

    4.1.1  直接獲取頁(yè)面內(nèi)容

    System.out.println("直接獲取網(wǎng)頁(yè)內(nèi)容:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //向指定的URL發(fā)出請(qǐng)求,獲取響應(yīng)
    WebResponse wr = wc.getResponse( "http://localhost:6888/HelloWorld.html" );
    //用getText方法獲取相應(yīng)的全部?jī)?nèi)容
    //用System.out.println將獲取的內(nèi)容打印在控制臺(tái)上
    System.out.println( wr.getText() );
    

    4.1.2  通過(guò)Get方法訪(fǎng)問(wèn)頁(yè)面并且加入?yún)?shù)

    System.out.println("向服務(wù)器發(fā)送數(shù)據(jù),然后獲取網(wǎng)頁(yè)內(nèi)容:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //向指定的URL發(fā)出請(qǐng)求
    WebRequest req = new GetMethodWebRequest( "http://localhost:6888/HelloWorld.jsp" );
    //給請(qǐng)求加上參數(shù)
    req.setParameter("username","姓名");
    //獲取響應(yīng)對(duì)象
    WebResponse resp = wc.getResponse( req );
    //用getText方法獲取相應(yīng)的全部?jī)?nèi)容
    //用System.out.println將獲取的內(nèi)容打印在控制臺(tái)上
    System.out.println( resp.getText() );
    

    4.1.3 通過(guò)Post方法訪(fǎng)問(wèn)頁(yè)面并且加入?yún)?shù)

    System.out.println("使用Post方式向服務(wù)器發(fā)送數(shù)據(jù),然后獲取網(wǎng)頁(yè)內(nèi)容:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //向指定的URL發(fā)出請(qǐng)求
    WebRequest req = new PostMethodWebRequest( "http://localhost:6888/HelloWorld.jsp" );
    //給請(qǐng)求加上參數(shù)
    req.setParameter("username","姓名");
    //獲取響應(yīng)對(duì)象
    WebResponse resp = wc.getResponse( req );
    //用getText方法獲取相應(yīng)的全部?jī)?nèi)容
    //用System.out.println將獲取的內(nèi)容打印在控制臺(tái)上
    System.out.println( resp.getText() );
    

    大家關(guān)注一下上面代碼中打了下劃線(xiàn)的兩處內(nèi)容,應(yīng)該可以看到,使用Get、Post方法訪(fǎng)問(wèn)頁(yè)面的區(qū)別就是使用的請(qǐng)求對(duì)象不同。

    4.2  處理頁(yè)面中的鏈接

    這里的演示是找到頁(yè)面中的某一個(gè)鏈接,然后模擬用戶(hù)的單機(jī)行為,獲得它指向文件的內(nèi)容。比如在我的頁(yè)面HelloWorld.html中有一個(gè)鏈接,它顯示的內(nèi)容是TestLink,它指向我另一個(gè)頁(yè)面TestLink.htm. TestLink.htm里面只顯示TestLink.html幾個(gè)字符。

    下面是處理代碼:

    System.out.println("獲取頁(yè)面中鏈接指向頁(yè)面的內(nèi)容:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //獲取響應(yīng)對(duì)象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/HelloWorld.html" );
    //獲得頁(yè)面鏈接對(duì)象
    WebLink       link = resp.getLinkWith( "TestLink" );
    //模擬用戶(hù)單擊事件
    link.click();
    //獲得當(dāng)前的響應(yīng)對(duì)象
    WebResponse   nextLink = wc.getCurrentPage();
    //用getText方法獲取相應(yīng)的全部?jī)?nèi)容
    //用System.out.println將獲取的內(nèi)容打印在控制臺(tái)上
    System.out.println( nextLink.getText() );
    

    4.3  處理頁(yè)面中的表格

    表格是用來(lái)控制頁(yè)面顯示的常規(guī)對(duì)象,在HttpUnit中使用數(shù)組來(lái)處理頁(yè)面中的多個(gè)表格,你可以用resp.getTables()方法獲取頁(yè)面所有的表格對(duì)象。他們依照出現(xiàn)在頁(yè)面中的順序保存在一個(gè)數(shù)組里面。

    [注意] Java中數(shù)組下標(biāo)是從0開(kāi)始的,所以取第一個(gè)表格應(yīng)該是resp.getTables()[0],其他以此類(lèi)推。

    下面的例子演示如何從頁(yè)面中取出第一個(gè)表格的內(nèi)容并且將他們循環(huán)顯示出來(lái):

    System.out.println("獲取頁(yè)面中表格的內(nèi)容:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //獲取響應(yīng)對(duì)象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/HelloWorld.html" );
    //獲得對(duì)應(yīng)的表格對(duì)象
    WebTable webTable = resp.getTables()[0];
    //將表格對(duì)象的內(nèi)容傳遞給字符串?dāng)?shù)組
    String[][] datas = webTable.asText();
    //循環(huán)顯示表格內(nèi)容
    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)+"列的內(nèi)容是:"+datas[i][j]);
    ++j;
    }
    ++i;
    }
    

    4.4  處理頁(yè)面中的表單

    表單是用來(lái)接受用戶(hù)輸入,也可以向用戶(hù)顯示用戶(hù)已輸入信息(如需要用戶(hù)修改數(shù)據(jù)時(shí),通常會(huì)顯示他以前輸入過(guò)的信息),在HttpUnit中使用數(shù)組來(lái)處理頁(yè)面中的多個(gè)表單,你可以用resp.getForms()方法獲取頁(yè)面所有的表單對(duì)象。他們依照出現(xiàn)在頁(yè)面中的順序保存在一個(gè)數(shù)組里面。

    [注意] Java中數(shù)組下標(biāo)是從0開(kāi)始的,所以取第一個(gè)表單應(yīng)該是resp.getForms()[0],其他以此類(lèi)推。

    下面的例子演示如何從頁(yè)面中取出第一個(gè)表單的內(nèi)容并且將他們循環(huán)顯示出來(lái):

    System.out.println("獲取頁(yè)面中表單的內(nèi)容:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //獲取響應(yīng)對(duì)象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/HelloWorld.html" );
    //獲得對(duì)應(yīng)的表單對(duì)象
    WebForm webForm = resp.getForms()[0];
    //獲得表單中所有控件的名字
    String[] pNames = webForm.getParameterNames();
    int i = 0;
    int m = pNames.length;
    //循環(huán)顯示表單中所有控件的內(nèi)容
    while(i<m){
    System.out.println("第"+(i+1)+"個(gè)控件的名字是"+pNames[i]+
    ",里面的內(nèi)容是"+webForm.getParameterValue(pNames[i]));
    ++i;
    }
    

    5  如何使用httpunit進(jìn)行測(cè)試

    5.1  對(duì)頁(yè)面內(nèi)容進(jìn)行測(cè)試

    httpunit中的這部分測(cè)試完全采用了JUnit的測(cè)試方法,即直接將你期望的結(jié)果和頁(yè)面中的輸出內(nèi)容進(jìn)行比較。不過(guò)這里的測(cè)試就簡(jiǎn)單多了,只是字符串和字符串的比較。

    比如你期望中的頁(yè)面顯示是中有一個(gè)表格,它是頁(yè)面中的第一個(gè)表格,而且他的第一行第一列的數(shù)據(jù)應(yīng)該是顯示username,那么你可以使用下面的代碼進(jìn)行自動(dòng)化測(cè)試:

    System.out.println("獲取頁(yè)面中表格的內(nèi)容并且進(jìn)行測(cè)試:");
    //建立一個(gè)WebConversation實(shí)例
    WebConversation wc = new WebConversation();
    //獲取響應(yīng)對(duì)象
    WebResponse   resp = wc.getResponse( "http://localhost:6888/TableTest.html" );
    //獲得對(duì)應(yīng)的表格對(duì)象
    WebTable webTable = resp.getTables()[0];
    //將表格對(duì)象的內(nèi)容傳遞給字符串?dāng)?shù)組
    String[][] datas = webTable.asText();
    //對(duì)表格內(nèi)容進(jìn)行測(cè)試
    String expect = "中文";
    Assert.assertEquals(expect,datas[0][0]);
    

    5.2  對(duì)Servlet進(jìn)行測(cè)試

    除了對(duì)頁(yè)面內(nèi)容進(jìn)行測(cè)試外,有時(shí)候(比如開(kāi)發(fā)復(fù)雜的Servlets的時(shí)候),你需要對(duì)Servlet本身的代碼塊進(jìn)行測(cè)試,這時(shí)候你可以選擇HttpUnit,它可以提供一個(gè)模擬的Servlet容器,讓你的Servlet代碼不需要發(fā)布到Servlet容器(如tomcat)就可以直接測(cè)試。

    5.2.1  原理簡(jiǎn)介

    使用httpunit測(cè)試Servlet時(shí),請(qǐng)創(chuàng)建一個(gè)ServletRunner的實(shí)例,他負(fù)責(zé)模擬Servlet容器環(huán)境。如果你只是測(cè)試一個(gè)Servlet,你可以直接使用registerServlet方法注冊(cè)這個(gè)Servlet,如果需要配置多個(gè)Servlet,你可以編寫(xiě)自己的web.xml,然后在初始化ServletRunner的時(shí)候?qū)⑺奈恢米鳛閰?shù)傳給ServletRunner的構(gòu)造器。

    在測(cè)試Servlet時(shí),應(yīng)該記得使用ServletUnitClient類(lèi)作為客戶(hù)端,他和前面用過(guò)的WebConversation差不多,都繼承自WebClient,所以他們的調(diào)用方式基本一致。要注意的差別是,在使用ServletUnitClient時(shí),他會(huì)忽略URL中的主機(jī)地址信息,而是直接指向他的ServletRunner實(shí)現(xiàn)的模擬環(huán)境。

    5.2.2  簡(jiǎn)單測(cè)試

    本實(shí)例只是演示如何簡(jiǎn)單的訪(fǎng)問(wèn)Servlet并且獲取他的輸出信息,例子中的Servlet在接到用戶(hù)請(qǐng)求的時(shí)候只是返回一串簡(jiǎn)單的字符串:Hello World!.

    1. Servlet的代碼如下:

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

    2. 測(cè)試的調(diào)用代碼如下:

    //創(chuàng)建Servlet的運(yùn)行環(huán)境
        ServletRunner sr = new ServletRunner();
        //向環(huán)境中注冊(cè)Servlet
        sr.registerServlet( "myServlet", MyServlet.class.getName() );
        //創(chuàng)建訪(fǎng)問(wèn)Servlet的客戶(hù)端
        ServletUnitClient sc = sr.newClient();
        //發(fā)送請(qǐng)求
        WebRequest request   = new GetMethodWebRequest( "http://localhost/myServlet" );
        //獲得模擬服務(wù)器的信息
        WebResponse response = sc.getResponse( request );
        //將獲得的結(jié)果打印到控制臺(tái)上
        System.out.println(response.getText());
        

    5.2.3  測(cè)試Servlet的內(nèi)部行為

    對(duì)于開(kāi)發(fā)者來(lái)說(shuō),僅僅測(cè)試請(qǐng)求和返回信息是不夠的,所以HttpUnit提供的ServletRunner模擬器可以讓你對(duì)被調(diào)用Servlet內(nèi)部的行為進(jìn)行測(cè)試。和簡(jiǎn)單測(cè)試中不同,這里使用了InvocationContext獲得該Servlet的環(huán)境,然后你可以通過(guò)InvocationContext對(duì)象針對(duì)request、response等對(duì)象或者是該Servlet的內(nèi)部行為(非服務(wù)方法)進(jìn)行操作。

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

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

    [注意]

    在測(cè)試Servlet的之前,你必須通過(guò)InvocationContext完成Servlet中的service方法中完成的工作,因?yàn)橥ㄟ^(guò)newInvocation方法獲取InvocationContext實(shí)例的時(shí)候該方法并沒(méi)有被調(diào)用。

    6  總結(jié)

    本文中,作者詳細(xì)的演示和介紹了如何使用HttpUnit提供的類(lèi)來(lái)進(jìn)行集成測(cè)試,主要實(shí)現(xiàn)以下操作:

    1. 模擬用戶(hù)行為向服務(wù)器發(fā)送請(qǐng)求,傳遞參數(shù)
    2. 模擬用戶(hù)接受服務(wù)器的響應(yīng)信息,并且通過(guò)輔助類(lèi)分析這些響應(yīng)信息,結(jié)合JUnit框架進(jìn)行測(cè)試
    3. 使用HttpUnit提供的模擬Servler容器,測(cè)試開(kāi)發(fā)中的Servlet的內(nèi)部行為

    參考資料

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

    posted on 2007-10-16 14:07 leoli 閱讀(244) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): test


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計(jì)

    常用鏈接

    留言簿(6)

    隨筆分類(lèi)

    隨筆檔案(17)

    文章分類(lèi)(86)

    收藏夾(3)

    flex blog

    good site

    java blog

    my friend

    tools

    抓蝦

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产一级一毛免费黄片| 18禁超污无遮挡无码免费网站国产 | 久久一本岛在免费线观看2020| 亚洲中文字幕久久精品蜜桃| 亚洲AV无码专区电影在线观看| 青青草国产免费久久久91| 全免费a级毛片免费看| 青青青视频免费观看| 亚洲男人的天堂网站| 亚洲色图综合网站| 亚洲一区二区三区自拍公司| 四虎永久在线精品免费影视| 97人妻无码一区二区精品免费| 免费在线观看一级片| 国产97视频人人做人人爱免费| 校园亚洲春色另类小说合集| 精品久久亚洲中文无码| 久久亚洲精品无码AV红樱桃| 国产精品亚洲片在线| 久久久久一级精品亚洲国产成人综合AV区| 精品久久洲久久久久护士免费| 国产免费看JIZZ视频| 69国产精品视频免费| 日韩av无码久久精品免费| 中文字幕手机在线免费看电影| 日韩在线视频线视频免费网站| 亚洲av无码一区二区三区在线播放 | 亚洲一区AV无码少妇电影| 亚洲精品中文字幕麻豆| 亚洲天堂中文字幕| 亚洲国产精品自在在线观看| 久久精品国产精品亚洲艾| 亚洲av永久无码制服河南实里| 亚洲成在人线av| 国产AV无码专区亚洲Av| 亚洲AV永久无码精品成人| 国产亚洲综合网曝门系列| 久久国产亚洲精品麻豆| 亚洲AV成人片色在线观看高潮| 久久精品国产亚洲AV嫖农村妇女 | 日韩大片免费观看视频播放|