一Struts測試概述 一個具有良好系統架構的J
EE應用程序至少有三層組成
即表現層
商業層和系統
集成層(包括數據存取以及和其他系統集成)
目前
Struts是應用比較廣泛
實現MVC
模式應用於表現層的一種技術
在這裡面
Struts Action主要用來完成一些簡單的數據校驗
轉換
以及流程轉發控制(注意:這裡流程不是業務規則)
因此在對整個應用程序進行測試時
我們同時也要測試Struts Action
但是
測試Struts Action相對測試簡單的JavaBean是比較困難
因為Struts是運行在Web服務器中
因此要測試Struts Action就必須發布應用程序然後才能測試
我們想象一下
對於一個擁有上千個JSP page和數百甚至數千Java Classes的大規模應用程序
要把他們發布到諸如Weblogic之類的應用服務器再測試
需要多少的時間和硬件資源? 所以這種模式的測試是非常費時費力的
所以
如果有一種辦法能夠不用發布應用程序
不需要Web服務器就能象測試普通Java Class一樣測試Struts Action
那就能極大地加強Struts的可測試性能
使應用程序測試更為容易
簡單快速
現在這個工具來了
這就是StrutsTestCase
二StrutsTestCase 概述 StrutsTestCase 是一個功能強大且容易使用的Struts Action開源測試工具
它本身就是在大名鼎鼎的JUnit基礎上發展起來的
因此通過和JUnit結合使用能極大加強應用程序的測試並加快應用程序的開發
StrutsTestCase提供了兩者測試方式
模仿方式和容器測試方式
所謂模仿方式就是有StrutsTestCase本身來模擬Web服務器
而容器測試方式則需要Web服務器
本文要討論的是前者
原因很簡單
不需要Web服務器就能象測試普通的Java Class一樣測試Struts Action
三准備StrutsTestCase和Struts Action/ActionForm/Config StrutsTestCase是一個開源工具
可以到下載
目前最新版本是
如果你使用Servlet
就下載StrutsTestCase
jar
使用Servlet
的就下載StrutsTestCase
jar
另外StrutsTestCase本身就是從JUnit繼承的
所以你還需要下載JUnit
在本文中
我們用一個簡單的例子來做測試
假設我們有一張表Hotline(country varchar
(
)
pno varchar
(
))
我們要做的是根據輸入條件從這張表檢索相應的記錄
檢索條件是country
Value Object:
package sample;
public class HotlineDTO implements Serializable{
private String country =
;
private String pno =
;
/**
* Method HotlineActionForm
*
*
*/
public HotlineDTO () {
super();
}
public void setCountry(String country) {
untry = country;
}
public void setPno(String pno) {
this
pno = pno;
}
public String getCountry() {
return (untry);
}
public String getPno() {
return (this
pno);
}
}
ActionForm:
package sample;
import org
apache
struts
action
ActionForm;
public class HotlineActionForm extends ActionForm{
private String country =
;
private String pno =
;
/**
* Method HotlineActionForm
*
*
*/
public HotlineActionForm() {
super();
}
public void setCountry(String country) {
untry = country;
}
public void setPno(String pno) {
this
pno = pno;
}
public String getCountry() {
return (untry);
}
public String getPno() {
return (this
pno);
}
}
Action Class:
public class SearchHotlineAction extends Action {
public ActionForward execute(ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response) throws Exception {
String target =
;
try{
//調用HotlineDAO檢索hotline
String country=((HotlineActionForm)form)
getCountry();
List hotlineList = HotlineDAO
getHotlineList(country);
if(hotlineList!=null && hotlineList
size()>
){
request
setAttribute(
hotlineList
hotlineList);
target =
hotlineList
;
}else{
target =
notfound
;
}
}catch(Exception ex){
}
}
Struts Config:
<struts
config>
<form
beans>
<form
bean name=
hotlineActionForm
type=
sample
HotlineActionForm
/>
</form
beans> <action
mappings>
<action path=
/SearchHotline
name=
hotlineActionForm
type=
sample
SearchHotlineAction
scope=
request
validate=
false
>
<forward name=
hotlineList
path=
/hotlineList
jsp
/>
<forward name=
notfound
path=
/searchHotline
jsp
/>
</action>
<action
mappings>
<struts
config>
四初試StrutsTestCase 當采用模擬方式時
所有的StrutsTestCase測試Class都是從MockStrutsTestCase繼承下來的
下面我們就創建一個最簡單的測試Class
public class SearchHotlineAction extends MockStrutsTestCase {
public void setUp()throws Exception{
}
public void tearDown()throws Exception{
}
public void testSearchHotline() throws Exception{
setRequestPathInfo(
/SearchHotline
do
);
addRequestParameter(
country
CN
);
actionPerform();
}
}
上面的Class相信用過JUnit的朋友都很熟悉
好了
一個簡單的測試例子就完成了
如果你用的是Eclipse就選擇Run
Run
JUnit
New就可以直接運行
不需要發布你的程序
不需要任何的Web服務器支持
就可以測試Struts Action
這就是StrutsTestCase帶來的好處
下面簡單地介紹一下它是怎麼工作的
在上面的例子中
我們調用setRequestPathInfo()告訴StrutsTestCase我們要模擬JSP調用SearchHotline
do這個Action
並且調用addRequestParameter()增加了一個參數country
最後調用actionPerform()運行
看到這裡
大家發現一個問題沒有? 在上面Action的源代碼裡我們是通過
String country=((HotlineActionForm)form)
getCountry();
也就是ActionForm來取得輸入的參數值
可我們在testSearchHotline()方法裡並沒有設置ActionForm?
那麼它是怎麼出來的呢? 其實大家如果熟悉Struts的運行流程的話就知道
JSP接受用戶的輸入並發請求時都是類似這樣//hostname/servletName?param
=value
¶m
=value
只是Struts接受到這些參數後再根據Struts Config裡的Action和ActionForm的映射把他們轉為ActionForm後傳給Action的
在上面的例子
我們只是簡單地運行了Action
那麼Action是否正確執行以及返回的結果是不是我們想要的呢?
我們繼續完善一下testSearchHotline()這個Method
public void testSearchHotline() throws Exception{
setRequestPathInfo(
/SearchHotline
do
);
addRequestParameter(
country
CN
);
actionPerform();
verifyNoActionErrors();
verifyForward(
hotlineList
);
assertNotNull(request
getAttribute(
hotlineList
));
List hotlineList = (List) request
getAttribute(
hotlineList
);
for (Iterator it = erator();it
hasNext();){
}
}
我們在actionPerform()後增加了幾行語句來斷定Struts Action是否正確執行
verifyNoActionErrors()
判斷Action裡沒有任何的Action;
verifyForward(
hotlineList
)
判斷Action確實轉發到hotlineList;
assertNotNull(request
getAttribute(
hotlineList
))
判斷Action確實返回了hotlineList並且不為空
到這裡
我們已經基本上討論完了StrutsTestCase的核心部分
從頭到尾
我們沒有發布應用程序
也不需要Web服務器
對我們來講
Struts Action就象普通的Java Class一樣容易調試測試
這就是StrutsTestCase給我們帶來的方便
五深入StrutsTestCase 除了以上我們用到的幾個斷定和校驗方法外
StrutsTestCase還提供了其他幾個方法便於我們測試Struts Action
下面我一一講述
具體的大家可以參考文檔
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屬性
verifyTilesForward/verifyInputTilesForward
和以上類似
應用程序使用到tiles時用的
六關於Webxml和StrutsConfigxml 缺省情況下
StrutsTestCase認為你的Web
xml和struts
config
xml的路徑分別是:
/WEB
INF/web
xml和/WEB
INF/struts
config
xml
假如你的web
xml/struts
config
xml的路徑是d:/app/web/WEB
INF/web
xml(struts
config
xml)的話
就需要把d:/app/web加到classpath
假如你的struts config是strust
config
module
xml
那麼必須調用setConfigFile()設置你的struts config文件
七結束語 J
EE應用程序的測試在開發過程中占有相當重要的位置
利用StrutsTestCase能極大方便你測試基於Struts的應用程序
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28938.html