Struts
測試之
action
測試
???
測試
Struts Action
相對比較困難
,
因為
Struts
是運行在
Web
服務器中
,
因此要測試
Struts Action
就必須發布應用程序然后才能測試,換言之,我們必須要有
Web
容器的支持
.
我們想象一下
,
對于一個擁有上千個
JSP page
和數百甚至數千
Java Classes
的大規模應用程序
,
要把他們發布到諸如
Weblogic
之類的應用服務器再測試
,
需要多少的時間和硬件資源
?
所以這種模式的測試是非常費時費力的
.
所以
,
如果有一種辦法能夠不用發布應用程序
,
不需要
Web
服務器就能象測試普通
Java Class
一樣測試
Struts Action,
那就能極大地加強
Struts
的可測試性能
,
使應用程序測試更為容易
,
簡單快速
.
現在這個工具來了
,
這就是
StrutsTestCase.
StrutsTestCase
是一個開源工具
,
可以到
http://strutstestcase.sourceforge.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
是否轉發到
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");
?????????? //
執行這個請求,即執行
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
是否發送了
ActionError
或
ActionMessage.
參數為
ActionError/Message Key
verifyNoActionErrors/Messages --
校驗
ActionActionServlet controller
沒有發送
ActionError
或
ActionMessage
VerifyForward --
校驗
Action
是否正確轉發到指定的
ActionForward.
VerifyForwardPath --
校驗
Action
是否正確轉發到指定的
URL
verifyInputForward --
校驗
Action
是否轉發到
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");
這樣,在執行
actionPerform()
時,程序就自動進入
setUp
的方法,執行該方法的測試。
?