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!.
1. Servlet的代碼如下:
public class MyServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse resp) } |
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的運行環境 //調用Servlet的非服務方法 //直接通過上下文獲得request對象 //直接通過上下文獲得response對象,并且向客戶端輸出信息 //直接通過上下文獲得session對象,控制session對象
|
[注意] 在測試Servlet的之前,你必須通過InvocationContext完成Servlet中的service方法中完成的工作,因為通過newInvocation方法獲取InvocationContext實例的時候該方法并沒有被調用。
6 總結
本文中,作者詳細的演示和介紹了如何使用HttpUnit提供的類來進行集成測試,主要實現以下操作:
1. 模擬用戶行為向服務器發送請求,傳遞參數
2. 模擬用戶接受服務器的響應信息,并且通過輔助類分析這些響應信息,結合JUnit框架進行測試
3. 使用HttpUnit提供的模擬Servler容器,測試開發中的Servlet的內部行為
文章來源于領測軟件測試網 http://www.k11sc111.com/