|
Struts 測試之 action 測試 測試 Struts Action 相對比較困難 , 因為 Struts 是運行在 Web 服務器中 , 因此要測試 Struts Action 就必須發(fā)布應用程序然后才能測試,換言之,我們必須要有 Web 容器的支持 . 我們想象一下 , 對于一個擁有上千個 JSP page 和數百甚至數千 Java Classes 的大規(guī)模應用程序 , 要把他們發(fā)布到諸如 Weblogic 之類的應用服務器再測試 , 需要多少的時間和硬件資源 ? 所以這種模式的測試是非常費時費力的 . 所以 , 如果有一種辦法能夠不用發(fā)布應用程序 , 不需要 Web 服務器就能象測試普通 Java Class 一樣測試 Struts Action, 那就能極大地加強 Struts 的可測試性能 , 使應用程序測試更為容易 , 簡單快速 . 現在這個工具來了 , 這就是 StrutsTestCase. StrutsTestCase 是一個開源工具 , 可以到 http://urceforge.net 下載 . 目前最新版本是 2.1.3, 如果你使用 Servlet2.3 就下載 StrutsTestCase213-2.3.jar, 使用 Servlet2.4 的就下載 StrutsTestCase213-2.4.jar. 另外 StrutsTestCase 本身就是從 JUnit 繼承的 , 所以你還需要下載 JUnit3.8.1. 下面就以一個簡單的 LogonAction 為例測試一下: public class LogonAction extends Action { /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaValidatorForm dynaForm = (DynaValidatorForm)form; String name = (String)dynaForm.get("username"); String password = (String)dynaForm.get("password"); if (name.equals("wangxq") && password.equals("wangxq")){ request.setAttribute("valid_user",form); return mapping.findForward("admin"); } return mapping.findForward("success"); } } LogonAction 的簡單說明:從 Logon 的頁面中輸入用戶名和密碼,在 LogonAction 中作判斷,并且作相應的跳轉。 對其的測試代碼如下: public class LogonActionTest extends MockStrutsTestCase { protected void setUp() throws Exception { super.setUp(); setContextDirectory(new File("WebRoot")); // 設置 WEB-INF 的上級目錄,讓程序可以找到 struts-config.xml 文件 } protected void tearDown() throws Exception { super.tearDown(); } public void testNoParameters(){ setRequestPathInfo("/logon"); actionPerform(); verifyInputForward(); String[] actionErrors = {"errors.required","errors.required"}; verifyActionErrors(actionErrors); verifyInputForward(); } public void testOneParameters(){ setRequestPathInfo("/logon"); addRequestParameter("username","wangxq"); actionPerform(); // 校驗 Action 是否轉發(fā)到 Action Mapping 里的 input 屬性 verifyInputForward(); String[] actionErrors ={"errors.required"}; verifyActionErrors(actionErrors); verifyInputForward(); } public void testSuccessAdmin(){ // 設置 Request 的請求,說明該 Request 請求的是哪一個 Action ,或者說,請求的是哪一個 .do 文件。 setRequestPathInfo("/logon"); // 將參數和其對應的值加入到 request 中,相當于是 action 對應的 formbean 傳過來的值,即用戶在登陸界面輸入的值。 addRequestParameter("username","wangxq"); addRequestParameter("password","wangxq"); // 執(zhí)行這個請求,即執(zhí)行 action 中對應的 execute 方法。 actionPerform(); // 驗證 forward 的名字是否正確,即有沒有跳轉到預期的頁面。 verifyForward("admin"); // 驗證沒有任何的 ActionErrors 。 verifyNoActionErrors(); } public void testSuccessLogon(){ setRequestPathInfo("/logon"); addRequestParameter("username","aaaaaa"); addRequestParameter("password","bbbbbb"); actionPerform(); verifyForward("success"); verifyNoActionErrors(); } } 補充說明其中的一些方法: verifyActionErrors/Messages -- 校驗 ActionActionServlet controller 是否發(fā)送了 ActionError 或 ActionMessage. 參數為 ActionError/Message Key verifyNoActionErrors/Messages -- 校驗 ActionActionServlet controller 沒有發(fā)送 ActionError 或 ActionMessage VerifyForward -- 校驗 Action 是否正確轉發(fā)到指定的 ActionForward. VerifyForwardPath -- 校驗 Action 是否正確轉發(fā)到指定的 URL verifyInputForward -- 校驗 Action 是否轉發(fā)到 Action Mapping 里的 input 屬性 其他的方法可以參考具體的文檔說明。 還有一點需要說明: 關于Web.xml和Struts-Config.xml 缺省情況下 ,StrutsTestCase 認為你的 Web.xml 和 struts-config.xml 的路徑分別是 : /WEB-INF/web.xml 和 /WEB-INF/struts-config.xml 1. 假如你的 web.xml/struts-config.xml 的路徑是 d:/application/web/WEB-INF/web.xml(struts-config.xml) 的話 , 就需要把 d:/ application /web 加到 classpath. 或者更簡單的方法是 setContextDirectory(new File("web")) 這樣就可以找到了。 2. 假如你的 struts config 是 strust-config-module.xml, 那么必須調用 setConfigFile() 設置你的 struts config 文件 深入使用: <action path="/handle" input="/handle.do?method=setUp" name=" handleForm" type=" handleAction" scope="session" parameter="method" validate="true"> <forward name="CurPage" path=" handle "/> </action> 這段配置文件中,使用了 parameter="method" 的配置,這樣在測試的時候就需要設置以下: 測試代碼中應該加入: addRequestParameter("method ","setUp"); 這樣,在執(zhí)行 actionPerform() 時,程序就自動進入 setUp 的方法,執(zhí)行該方法的測試。 |
|
|