首先我們頭腦總中有這樣一個(gè)actionmapping(注意只是假設(shè)的):
<action path=”/longin” type=”Jplateau.strutstestcase.LonginAction”
scope="request"
name="userForm">
<forward name="success" path="/main.jsp"/>
<forward name="login" path="/login.jsp"/>
</action>
有了這樣一個(gè)假設(shè),我們可以從測(cè)試代碼入手:
public class TestLoginAction extends MockStrutsTestCase {
public void setUp() {
super.setUp();
//這里做一些初始化的東西,譬如數(shù)據(jù)庫(kù)連接等
}
public void tearDown() {
super.tearDown();
//這里關(guān)閉你在setup中開(kāi)啟的資源,如關(guān)閉數(shù)據(jù)庫(kù)連接等
}
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
//選擇你要執(zhí)行哪一個(gè)actionmapping?這里用我們剛才做的假設(shè)材料
this. setRequestPathInfo("/login");
//首先要初始化提交數(shù)據(jù):用戶名、密碼
this.addRequestParameter(“usrename”,”Jplateau”);
this.addRequestParameter(“passwd”,”sandy”);
//注意有了這個(gè)之后,你可以從formbean中使用提交以后的用戶名和密碼數(shù)據(jù)了,下//面我會(huì)解釋
//好,初始化數(shù)據(jù)完成以后開(kāi)始執(zhí)行action中的execute(),很簡(jiǎn)單,掉用actionPerform()
this. ActionPerform();
//嚴(yán)正返回是否正確?這里用我們剛才做的假設(shè)材料
this verifyForward(“success”);.
//下面驗(yàn)證登陸成功以后session中是否有用戶的名稱?
String expect_username_from_session=”Jplateau”;
//這里需要插寫(xiě)內(nèi)容,是strutstestcase完全可以在測(cè)試代碼中使用跟真實(shí)action
//中一樣的環(huán)境,譬如可以通過(guò)this.getActionForm()得到相應(yīng)的ActionForm
//可以通過(guò)this.getRequest()得到HttpRequest
//可以通過(guò)this.getSession()得到HttpSession,如下:
String actual_username_from_session=this.getSession().getAttribute(“authentication”);
this. assertEquals(“”, expect_username_from_session, actual_username_from_session);
}
public void testFailureLogin(){
//登陸失敗的測(cè)試在此不寫(xiě)了
}
}
上邊是一個(gè)簡(jiǎn)單的測(cè)試代碼,好,運(yùn)行!他此時(shí)肯定是通不過(guò)的,首先我們的java代碼還沒(méi)有寫(xiě),struts-config.xml還沒(méi)有配,那么,現(xiàn)在你可以現(xiàn)在做這些事情:“用簡(jiǎn)單的做法或代碼讓上邊那個(gè)測(cè)試通過(guò)。”
第三部分:兼容struts1.1開(kāi)發(fā)員
下面說(shuō)寫(xiě)和struts1.1相關(guān)的內(nèi)容:測(cè)試tiles和多模塊!
測(cè)試tiles
假設(shè)我們的actionmapping中有這樣forward到tiles的情況,如下:
//這里有關(guān)struts中tiles的使用不做介紹,請(qǐng)參考相關(guān)資料
<forward name="success" path="/userListLayout"/>
同時(shí)tiles_defs.xml中有相應(yīng)配置:
//其中mainLayout是我在tiles定義的類(lèi)型框架
<definition name="userListLayout" extends="mainLayout">
<put name="body" value="/main.jsp" />
</definition>
那么我們?cè)跍y(cè)試代碼中可以如下測(cè)試tiles
//
this. verifyTilesForward(“success”,”userListLayout”);
測(cè)試多模塊:
關(guān)于多模塊的測(cè)試我希望能在下面代碼的注釋部分給你一個(gè)大概的介紹:
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
//“mymodule”為系統(tǒng)中某個(gè)單獨(dú)模塊的名稱(文件夾的名稱)
setConfigFile("mymodule","/WEB-INF/struts-config-mymodule.xml");
//這個(gè)地方和前面單模塊的例子有些差別,此處有兩個(gè)參數(shù),第一個(gè)參數(shù)是模塊的
//名稱,第二個(gè)參數(shù)的意義和上邊相同;
//和單模塊相比,上邊兩處區(qū)別
this.setRequestPathInfo("/mymodule","/login.do");
this.addRequestParameter("username","Jplateau");
this.addRequestParameter("password","sandy");
this.actionPerform();
this.verifyForward("success");
String expect_username_from_session=”Jplateau”;
String actual_username_from_session=this.getSession().getAttribute(“authentication”);
this. assertEquals(“”, expect_username_from_session, actual_username_from_session);
}
}
參考資源:
1. http://strutstestcase.sourceforge.net
(本篇文章基本上是沿用該篇文檔的思路,英文好的可以閱讀這篇文檔。)
2. Kent Beck 《Test-Driven Development By Example》
3. 本文首發(fā)于本人資料站點(diǎn):http://plateau.sicool.com