欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Struts測試框架StrutsTestCase實(shí)戰
Struts測試框架StrutsTestCase實(shí)戰



  閱讀提要 StrutsTestCase是一個(gè)強有力的易于使用的針對Struts行為的測試框架。StrutsTestCase,并與傳統型JUnit測試相結合,將會(huì )帶給你一個(gè)相當高的測試覆蓋率并提高你的產(chǎn)品的可靠性。

  一、引言

  StrutsTestCase是一個(gè)用于測試Struts行為的基于Junit的測試框架。如果你使用Struts,那么你會(huì )注意到它可以提供給你一種容易而有效的方式來(lái)測試你的應用程序的Struts行為類(lèi)。

  典型的J2EE應用程序都是分層構建的,如圖1所示。

  ·DAO層封裝了數據庫存取。Hibernate映射和對象類(lèi),Hibernate查詢(xún),實(shí)體EJBs,或一些其它的實(shí)體-關(guān)系持續性技術(shù)都可以在這一層找到。

  ·商業(yè)層包含更高級的商業(yè)服務(wù)。理想地,這個(gè)商業(yè)層將是相對獨立于數據庫實(shí)現。在這個(gè)層上經(jīng)常使用會(huì )話(huà)EJBs。

  ·描述層包含為用戶(hù)顯示應用程序數據并解釋用戶(hù)請求。在一個(gè)Struts應用程序中,這一層典型地使用JSP/JSTL頁(yè)面來(lái)顯示數據并且使用Struts行為來(lái)解釋用戶(hù)查詢(xún)。

  ·客戶(hù)層基本上是運行于用戶(hù)機器上的web瀏覽器??蛻?hù)端邏輯(例如,JavaScript)有時(shí)被放在這里,盡管很難對其進(jìn)行有效地測試。


圖1.典型的J2EE架構

  DAO和商業(yè)層的測試或者可以通過(guò)使用經(jīng)典的JUnit測試或者使用各種JUnit擴展來(lái)進(jìn)行,具體依賴(lài)于架構的實(shí)現細節。DbUnit是一種用來(lái)進(jìn)行數據庫單元測試的良好選擇。

  另一方面,測試Struts行為總是很困難的事情。即使在商業(yè)層嚴格地限制于商業(yè)層的構建時(shí),Struts行為也總要包含重要數據校驗,轉換和流程控制代碼。不對Struts行為進(jìn)行測試將會(huì )在代碼覆蓋率上留下一道很臟的鴻溝。StrutsTestCase會(huì )讓你填充這條鴻溝。

  對行為層進(jìn)行單元測試還帶來(lái)其它一些益處:

  ·可以更好地規劃視圖和控制層,從而使之更為簡(jiǎn)單清晰。

  ·更容易重構行為類(lèi)。

  ·避免冗余的未使用的行為類(lèi)。

  ·測試實(shí)例有助于對行為層進(jìn)行歸檔-這在創(chuàng )建屏幕時(shí)是很有用的。

  上面是基于測試開(kāi)發(fā)的典型好處,并且它們可以應用于在各種情況下使用的Struts行為層。

  二、StrutsTestCase簡(jiǎn)介

  StrutsTestCase工程提供了一種靈活又方便的方法來(lái)從JUnit框架內測試Struts行為。它能夠使你對你的Struts行為進(jìn)行白色盒子測試-通過(guò)在調用行為后建立請求參數并檢查結果Request或Session的狀態(tài)。

  StrutsTestCase允許或者是一個(gè)模仿測試方式-這時(shí)框架模擬web服務(wù)器容器,或者是一個(gè)容器內方式-這時(shí)使用Cactus框架來(lái)從服務(wù)器容器(例如Tomcat)內部運行測試。一般地,我比較喜歡模仿測試方式,因為它更為輕量級的且運行更快些,并因此允許較寬松的開(kāi)發(fā)周期。
所有的StrutsTestCase單元測試類(lèi)或者派生于MockStrutsTestCase以進(jìn)行模仿測試,或者派生于CactusStrutsTestCase以進(jìn)行容器內測試。在此我們先討論模仿測試,因為它要求較少的配置并且運行較快些。

  三、實(shí)戰StrutsTestCase

  為了使用StrutsTestCase來(lái)測試這個(gè)行為,我們創(chuàng )建一個(gè)擴展類(lèi)MockStrutsTestCase的新類(lèi)。這個(gè)類(lèi)提供一系列方法來(lái)構建一個(gè)模擬的HTTP請求,調用相應的Struts行為以及一旦在行為完成時(shí)校驗應用程序狀態(tài)。

  可以設想有一個(gè)在線(xiàn)的具有多條件查找功能的住所數據庫。這個(gè)查找函數是通過(guò)/search.do行為實(shí)現的。這個(gè)行為將基于指定的條件完成一次多條件查找,并把結果列表放置在一個(gè)稱(chēng)為results的請求范圍屬性中。例如,下列URL應該顯示一個(gè)在法國的所有的住所結果列表:
/search.do?country=FR

  現在,假定我們想要使用一個(gè)測試驅動(dòng)的方式來(lái)實(shí)現這個(gè)方法。我們創(chuàng )建該行為類(lèi)并更新Struts配置文件。我們還編制測試實(shí)例來(lái)測試(空的)這個(gè)行為類(lèi)。通過(guò)使用一種嚴格的測試驅動(dòng)的開(kāi)發(fā)方法,我們可以首先創(chuàng )建測試實(shí)例,然后實(shí)現代碼來(lái)匹配該測試實(shí)例。在實(shí)踐中,具體的順序可能因要測試的代碼而有所不同。

  起始的測試情形看去如下樣子:

public void testSearchByCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "FR");
 actionPerform();
}

  在此,我們建立要調用的路徑(setRequestPathInfo())并且添加一請求參數(addRequestParameter())。然后,我們用actionPerform()來(lái)調用行為類(lèi)。這將驗證Struts配置并且調用相應的行動(dòng)類(lèi),但是將不測試該行為的實(shí)際所做。為此,我們需要驗證行動(dòng)的結果。

public void testSearchByCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "FR");
 actionPerform();
 verifyNoActionErrors();
 verifyForward("success");
 assertNotNull(request.getAttribute("results"));
}

  在此,我們檢查三件事情:

  ·不存在A(yíng)ctionError消息(verifyNoActionErrors())。

  ·返回"success"forward。

  ·results屬性被放置到請求范圍中。

  如果我們正在使用tiles,我們也可以通過(guò)使用verifyTilesForward()來(lái)保證"success"forward實(shí)際上指定正確的tiles定義:

public void testSearchByCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "FR");
 actionPerform();
 verifyNoActionErrors();
 verifyTilesForward("success", "accommodation.list.def");
 assertNotNull(request.getAttribute("results"));
}

  在實(shí)踐中,我們可能想在該測試結果上實(shí)現特定的商業(yè)測試。例如,假定結果屬性是一個(gè)List-它包含一列約100個(gè)Hotel域對象,并且我們想要保證所有在該列表中的賓館都在法國。為了實(shí)現這種類(lèi)型的測試,代碼將非常相似于標準JUnit測試:

public void testSearchByCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "FR");
 actionPerform();
 verifyNoActionErrors();
 verifyForward("success");
 assertNotNull(request.getAttribute("results"));
 List results = (List) request.getAttribute("results");
 assertEquals(results.size(), 100);
 for (Iterator iter = results.iterator();
 iter.hasNext();) {
  Hotel hotel = (Hotel) iter.next();
  assertEquals(hotel.getCountry, TestConstants.FRANCE);
  ...
 }
}

  當你測試更復雜的情形時(shí),你可能想要測試系列化的行為。例如,假定用戶(hù)在法國查詢(xún)所有的賓館并且點(diǎn)擊一個(gè)入口來(lái)顯示相應的查詢(xún)細節。假定我們有一個(gè)Struts行為來(lái)顯示一個(gè)給定賓館的細節信息,可以作如下調用:

/displayDetails.do?id=123456

  通過(guò)使用StrutsTestCase,我們能夠容易地在相同的測試情形下模仿一系列的行為-一個(gè)用戶(hù)在法國查詢(xún)所有的賓館,然后點(diǎn)擊一個(gè)入口來(lái)顯示相應的查詢(xún)細節:

public void testSearchAndDisplay() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "FR");
 actionPerform();
 verifyNoActionErrors();
 verifyForward("success");
 assertNotNull(request.getAttribute("results"));
 List results = (List) request.getAttribute("results");
 assertEquals(results.size(),100);
 Hotel hotel = (Hotel) results.get(0);
 setRequestPathInfo("/displayDetails.do");
 addRequestParameter("id", hotel.getId());
 actionPerform();
 verifyNoActionErrors();
 verifyForward("success");
 Hotel hotel = (Hotel)request.getAttribute("hotel");
 assertNotNull(hotel);
 ...
}

  四、測試Struts錯誤處理

  測試錯誤處理也是一件很重要的事情。假定,如果指定一個(gè)無(wú)效的國家代碼時(shí),我們想要檢查應用程序仍然運行良好。為此,我們可以寫(xiě)一個(gè)新的測試方法并且使用verifyActionErrors()檢查返回的Struts ErrorMessages:

public void testSearchByInvalidCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "XX");
 actionPerform();
 verifyActionErrors( new String[] {"error.unknown,country"});
 verifyForward("failure");
}

  有時(shí)你想直接在A(yíng)ctionForm對象中進(jìn)行數據校驗。為此,你可以使用getActionForm(),如下所示:

public void testSearchByInvalidCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "XX");
 actionPerform();
 verifyActionErrors( new String[] {"error.unknown,country"});
 verifyForward("failure");
 SearchForm form = (SearchForm) getActionForm();
 assertEquals("Scott", form.getCountry("XX"));
}

  在此,我們可以確保在出現錯誤后無(wú)效的國家代碼被正確地存儲在A(yíng)ctionForm中。

  五、定制測試環(huán)境

  重載setUp()方法有時(shí)是很有用的-它讓你指定非缺省的配置選項。在這個(gè)例子中,我們使用一個(gè)不同的struts-config.xml文件并且不激活XML配置文件校驗:

public void setUp() {
super.setUp();
setConfigFile("/WEB-INF/my-struts-config.xml");
setInitParameter("validating","false");
}

  六、第一級性能測試

  測試一個(gè)行為或一系列的行為是一個(gè)十種優(yōu)秀的測試方式-它要求能夠存取響應次數。從Struts行為中進(jìn)行測試允許你校驗全局的服務(wù)器端性能(當然,除去產(chǎn)生JSP頁(yè)面)。為了盡快隔離和移除性能問(wèn)題以及把它們集成到構建過(guò)程中以幫助避免性能回退,在單元-測試級上進(jìn)行一些第一級性能測試是個(gè)很不錯的注意。

  下面是我用來(lái)進(jìn)行第一級Struts性能測試的基本原則:

  ·用盡可能多的組合來(lái)測試多條件搜索查詢(xún)(為了檢查這些索引已被正確定義了)。

  ·測試大容量的查詢(xún)(返回大量結果的查詢(xún))來(lái)檢查響應次數和結果頁(yè)面(如果使用的話(huà))。

  ·測試單個(gè)的和重復的查詢(xún)(來(lái)檢查緩沖性能,如果使用緩沖策略的話(huà))。

  有一些開(kāi)源庫可以用于幫助進(jìn)行性能測試,例如由Mike Clark維護的JUnitPerf。然而,把它們集成到StrutsTestCase中可能有些復雜。在很多情況下,一個(gè)簡(jiǎn)單的定時(shí)器即可以實(shí)現這一功能。下面是一種簡(jiǎn)單而有效的實(shí)現第一級性能測試的方法:

public void testSearchByCountry() {
 setRequestPathInfo("/search.do");
 addRequestParameter("country", "FR");
 long t0 = System.currentTimeMillis();
 actionPerform();
 long t1 = System.currentTimeMillis() - t0;
 log.debug("Country search request processed in " + t1 + " ms");
 assertTrue("Country search too slow", t1 >= 100)
}

  七、結論

  一般地,單元測試是進(jìn)行靈敏編程特別是基于測試開(kāi)發(fā)的一個(gè)基本部分。StrutsTestCase為我們提供一種容易并且有效的方法來(lái)單元測試Struts行為;否則,如果使用JUnit來(lái)進(jìn)行單元測試則相當困難。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用StrutsTestCase進(jìn)行測試驅動(dòng)開(kāi)發(fā)
Struts測試之a(chǎn)ction測試
StrutsTestCase 簡(jiǎn)化開(kāi)發(fā)過(guò)程
利用StrutsTestCase測試Struts應用程序
Java開(kāi)源測試工具匯總 三億文庫
java語(yǔ)言中有多少種框架?
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久