成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

進(jìn)行Struts應(yīng)用程序單元測(cè)試開發(fā)

開發(fā) 后端
在Struts測(cè)試驅(qū)動(dòng)開發(fā)在減少開發(fā)努力的同時(shí)也改進(jìn)了軟件的開發(fā)質(zhì)量。單元測(cè)試,作為一整套測(cè)試策略的基礎(chǔ),必須是全面的,且要求易于建立和執(zhí)行迅速。

一、引言

測(cè)試驅(qū)動(dòng)開發(fā)在減少開發(fā)努力的同時(shí)也改進(jìn)了軟件的開發(fā)質(zhì)量。單元測(cè)試,作為一整套測(cè)試策略的基礎(chǔ),必須是全面的,且要求易于建立和執(zhí)行迅速。然而,對(duì)執(zhí)行環(huán)境和被測(cè)試類外部代碼的依賴性使我們實(shí)現(xiàn)這些目標(biāo)變得更為復(fù)雜。例如,把應(yīng)用程序發(fā)布到容器將顯著地延長(zhǎng)代碼和測(cè)試的周期;而對(duì)其它類的依賴性通常也會(huì)導(dǎo)致測(cè)試的建立更加復(fù)雜和測(cè)試運(yùn)行速度更為緩慢。
       

集成兩個(gè)流行的測(cè)試框架(StrutsTestCase和EasyMock)來(lái)單元測(cè)試Struts應(yīng)用程序?qū)?huì)更為容易地建立測(cè)試并加快測(cè)試速度。然而,這兩個(gè)框架之間尚存在一些“隔閡”,從而很難把它們理想地集成到一起。在本文中,我將通過(guò)分析兩種方案(一個(gè)面向?qū)ο蟮姆桨负鸵粋€(gè)面向方面的方案)來(lái)探討這個(gè)問(wèn)題。同時(shí),我還將展示面向方面編程(AOP)是如何通過(guò)簡(jiǎn)化一些看起來(lái)很困難的問(wèn)題的解決方案而進(jìn)一步補(bǔ)充面向?qū)ο缶幊?OOP)的。
   

二、集成需要
       

一個(gè)典型的Struts應(yīng)用程序既能夠展示也其所使用的執(zhí)行環(huán)境也會(huì)體現(xiàn)出類之間的依賴性問(wèn)題;這是因?yàn)镾truts行為(Action)是在一個(gè)servlet容器內(nèi)執(zhí)行的,并且典型情況下會(huì)調(diào)用其它的類來(lái)處理請(qǐng)求。模擬對(duì)象測(cè)試方法有助于消除其中不必要的依賴性。借助于繼承自基本JUnit測(cè)試集的MockStrutsTestCase類,StrutsTestCase測(cè)試框架提供了對(duì)servlet容器的一種模擬實(shí)現(xiàn)。這顯然方便了容器外測(cè)試,因而也相應(yīng)地加快了單元測(cè)試周期。另一方面,另一個(gè)測(cè)試框架—EasyMock—進(jìn)一步便利了對(duì)協(xié)作類的動(dòng)態(tài)模擬(Mock)。這個(gè)框架中所提供的模擬能夠用更簡(jiǎn)單的實(shí)現(xiàn)來(lái)代替真正的類,并且添加了校驗(yàn)邏輯以支持單元測(cè)試。
       

非常清楚,把這兩個(gè)框架結(jié)合在一起是非常有益的—Struts應(yīng)用程序便可以在非常真實(shí)的隔離環(huán)境下進(jìn)行測(cè)試。理想情況下,你需要使用下列步驟來(lái)實(shí)現(xiàn)這樣的一個(gè)單元測(cè)試:
   

1.建立MockStrutsTestCase以便模擬servlet容器。
   

2.借助于EasyMock來(lái)模擬行為所依賴的類。
   

3.設(shè)置模擬的期望值。
   

4.把模擬注入到當(dāng)前測(cè)試的行為中。
   

5.繼續(xù)進(jìn)行測(cè)試和校驗(yàn)。
       

注意,上面步驟4中所執(zhí)行的依賴性注入使被測(cè)試的Struts行為遠(yuǎn)離了其真實(shí)的協(xié)作者而與一個(gè)模擬的行為進(jìn)行交互。為了把通過(guò)EasyMock生成的模擬注入到行為中,你需要從測(cè)試類內(nèi)部存取這些行為相應(yīng)的實(shí)例。遺憾的是,這里出現(xiàn)了一種障礙,因?yàn)槲覀儫o(wú)法輕易地從MockStrutsTestCase中實(shí)現(xiàn)這樣的存取。
   

三、OOP方案
       

那么,你該如何從MockStrutsTestCase中存取行為實(shí)例呢?首先,讓我們來(lái)分析一下MockStrutsTestCase和Struts的控制器組件之間的關(guān)系。
       

圖1中展示的關(guān)鍵關(guān)系有可能潛在地導(dǎo)致一種解決上面問(wèn)題的方案。
     

 struts   
       

圖1:此處展示的關(guān)系能夠建立一種OOP方案
       

 .MockStrutsTestCase中提供了一個(gè)public類型的getter方法用于檢索ActionServlet。
       

.ActionServlet有一個(gè)protected類型的getter方法用于實(shí)現(xiàn)RequestProcessor。
       

.RequestProcessor把行為實(shí)例存儲(chǔ)為一個(gè)protected類型的成員。
       

你是否可以子類化ActionServlet和RequestProcessor從而使MockStrutsTestCase能夠存取行為呢?相應(yīng)的結(jié)果調(diào)用鏈看上去應(yīng)該如下所示:

struts"" 

       

注意,在你分析完把MockStrutsTestCase鏈接到Struts行為的調(diào)用序列圖之后,你就會(huì)發(fā)現(xiàn)此方法是行不通的。
       

圖2展示了存在于MockStrutsTestCase和Struts組件之間的關(guān)鍵性交互。
       
   

  struts""   

圖2:存在于MockStrutsTestCase和Struts組件之間的交互
       

圖2展示的問(wèn)題涉及到Struts行為創(chuàng)建的時(shí)序問(wèn)題。到行為內(nèi)部的模擬注入必須在調(diào)用MockStrutsTestCase.actionPerform()之前發(fā)生。然而,此時(shí)這些行為還不可用,因?yàn)橹挥性谡{(diào)用actionPerform()后,Requ

estProcessor才能夠創(chuàng)建這些行為實(shí)例。
       

既然你不能很容易地把行為實(shí)例傳播到MockStrutsTestCase中,那么,為什么不子類化RequestProcessor并重載processActionCreate()方法呢?在這個(gè)重載方法中,你可以存取所有的行為實(shí)例;這樣以來(lái),創(chuàng)建、配置和設(shè)置對(duì)相應(yīng)行為實(shí)例的一個(gè)模擬一下子變得非常直接。因?yàn)閼?yīng)該在執(zhí)行完actionPerform()之后調(diào)用MockControl.verify()方法,所以,你還需要重載processActionPerform()以進(jìn)行此校驗(yàn)調(diào)用。
       

這種方案對(duì)于測(cè)試正規(guī)的Struts應(yīng)用程序是不太適合的。因?yàn)榧词顾械男袨閮H與單個(gè)模擬進(jìn)行交互,測(cè)試一個(gè)行為也有可能要求多個(gè)測(cè)試方法—每個(gè)方法都具有不同的模擬期望。為此,我們建議的方案是:創(chuàng)建不同的RequestProcessor子類,相應(yīng)于每個(gè)子類設(shè)置不同的模擬期望。另外,還需要多個(gè)Struts配置文件來(lái)指定不同的RequestProcessor子類。最終,管理大量的測(cè)試將成為一件令人頭疼的事情。

 

#p#

四、AOP方案
       

因此,我們非常希望,在執(zhí)行某行為之前能夠通過(guò)某種方式實(shí)現(xiàn)在MockStrutsTestCase中使用該行為的實(shí)例。如果你熟悉AOP,那么,你會(huì)立即意識(shí)到它所提供的簡(jiǎn)單方案即能直接滿足這一要求。注意:這里的關(guān)鍵是定義一個(gè)切點(diǎn),由它負(fù)責(zé)捕獲行為執(zhí)行連接點(diǎn);然后通過(guò)一個(gè)before advice把模擬注入到相應(yīng)的行為中。
       

在此,我選擇使用AspectJ框架來(lái)實(shí)現(xiàn)這一方案。當(dāng)然,其它的例如Spring AOP這樣的AOP實(shí)現(xiàn)也應(yīng)該能夠良好工作。不過(guò),Spring AOP還需要一個(gè)額外的步驟—通過(guò)Spring框架中的DelegatingActionProxy類把對(duì)Struts行為的管理委托給Spring。
       

圖3展示了基于AOP方案的單元測(cè)試示例靜態(tài)模型。
     

struts""    
      

圖3:基于AOP方案的單元測(cè)試示例靜態(tài)模型
       

 SimpleAction是一個(gè)Struts行為的子類,同時(shí)與ActionService進(jìn)行協(xié)作。其中,SimpleActionTest派生于MockStrutsTestCase,用來(lái)測(cè)試SimpleAction。
       

SimpleActionTest使用EasyMock創(chuàng)建和建立一個(gè)模擬ActionService。SimpleActionTest還實(shí)現(xiàn)StrutsActionPreExecuteListener接口以便在即將運(yùn)行        SimpleAction的execute方法時(shí)接收通知。作為通知的一部分,SimpleActionTest接收SimpleAction實(shí)例以便注入ActionService模擬。由方面類StrutsActionPreExecuteNotifier負(fù)責(zé)通知任何實(shí)現(xiàn)監(jiān)聽器接口的測(cè)試類,并且使相應(yīng)的行為實(shí)例可用。
       

下面的步驟描述了實(shí)現(xiàn)StrutsActionPreExecuteNotifier的過(guò)程:
       

 ◆首先,由一個(gè)切點(diǎn)選擇相應(yīng)的測(cè)試方法執(zhí)行連接點(diǎn)。另一方面,這個(gè)測(cè)試方法駐留于負(fù)責(zé)監(jiān)聽該行為的預(yù)執(zhí)行事件的測(cè)試類中。另外,這個(gè)切點(diǎn)還會(huì)暴露當(dāng)前執(zhí)行的測(cè)試類對(duì)象: pointcut mockStrutsTest(StrutsActionPreExecuteListener actionTest):
  
        

struts"" 
       

◆然后,由第二個(gè)切點(diǎn)負(fù)責(zé)捕獲上面的行為執(zhí)行連接點(diǎn)。通過(guò)結(jié)合第一個(gè)切點(diǎn),匹配范圍被限制到該行為相應(yīng)的測(cè)試方法的調(diào)用流程的內(nèi)部。這種進(jìn)一步縮小的范圍對(duì)行為執(zhí)行(并非通過(guò)測(cè)試方法激活)起到過(guò)濾作用。最終,方面根本不會(huì)影響到最后生成的代碼。該行為及其相應(yīng)的測(cè)試類實(shí)例都是經(jīng)由切點(diǎn)參數(shù)加以暴露的: pointcut strutsActionExecute(Action action, StrutsActionPreExecuteListener actionTest):
  
       

struts"" 
       

◆最后,由一個(gè)與前一個(gè)切點(diǎn)相關(guān)聯(lián)的before advice負(fù)責(zé)通知測(cè)試類(它們擔(dān)任行為事件的監(jiān)聽器)并且傳遞相應(yīng)于模擬注入的行為實(shí)例:
       
 

struts"" 
       

圖4展示了這些類之間的動(dòng)態(tài)交互情形。
       
    

 struts""   

 圖4:類之間的動(dòng)態(tài)交互
       

注意,圖中從行為到方面的虛線描述了對(duì)行為執(zhí)行連接點(diǎn)的捕獲情況。此時(shí)序圖與第一個(gè)時(shí)序圖比較,其重要區(qū)別正在于行為執(zhí)行之前發(fā)生的三個(gè)步驟:
       

1.一個(gè)切點(diǎn)捕獲行為執(zhí)行連接點(diǎn)(由從SimpleAction指向StrutsActionPreExecuteNotifier的虛線箭頭指出)。
       

2.方面的before advice負(fù)責(zé)通知測(cè)試類并且把相應(yīng)的行為實(shí)例傳遞給它。
       

3.測(cè)試類把模擬對(duì)象注入到即將要開始執(zhí)行的行為實(shí)例中。

#p#

現(xiàn)在,你可以基于前面概括的五個(gè)步驟繼續(xù)編寫行為測(cè)試。下面的代碼展示了相應(yīng)于SimpleActionTest的部分代碼,步驟已在注釋中標(biāo)出。
       

使用MockStrutsTestCase和EasyMock進(jìn)行行為測(cè)試的部分代碼:
       
       

struts"" 

struts"" 

在行動(dòng)及其依賴的服務(wù)之間存在四種可能的復(fù)合關(guān)系:

每個(gè)行為依賴于一個(gè)服務(wù)。

每個(gè)行為依賴于多個(gè)服務(wù)。 

多個(gè)行為依賴于一個(gè)服務(wù)。 

多個(gè)行為依賴于多個(gè)服務(wù)。 

我在此展示的方案能夠比較靈活而且相對(duì)容易地支持上面所有這四種情形,因?yàn)槟M創(chuàng)建、期望值建立以及模擬注入都能夠在單個(gè)的測(cè)試類內(nèi)實(shí)現(xiàn)。

你能夠不借助于監(jiān)聽器接口就可以在StrutsActionPreExecuteNotifier內(nèi)部模擬注入嗎?這看起來(lái)似乎使得測(cè)試類實(shí)現(xiàn)更簡(jiǎn)單一些。然而,實(shí)踐證明,類似早些時(shí)候討論的OOP方案,編寫多個(gè)方面以創(chuàng)建不同的模擬對(duì)象并建立相應(yīng)的不同的模擬期望是非常必要的。另外,在單個(gè)測(cè)試類內(nèi)本地化模擬的創(chuàng)建與安裝(借助于監(jiān)聽技術(shù),這是可能的)將變得更為方便。

五、總結(jié)

對(duì)于我們?cè)诒疚闹兴懻摰募蓡?wèn)題,有人可能會(huì)創(chuàng)造出一套相當(dāng)不錯(cuò)的OOP方案。然而,構(gòu)造這種方案很可能需要對(duì)Struts和StrutsTestCase有深入的理解才行,并且要付出相當(dāng)?shù)呐ΑS绊懕疚闹兴懻摰膬蓚€(gè)測(cè)試框架(StrutsTestCase和EasyMock)緊密集成的主要障礙在于,在Struts行為實(shí)例執(zhí)行之前很難實(shí)現(xiàn)對(duì)它的訪問(wèn)。在認(rèn)識(shí)了導(dǎo)致這種障礙的基本原因之后,AOP方案自然地出現(xiàn)在我們面前。不必再?gòu)?qiáng)求于基于傳統(tǒng)型OOP的那種更復(fù)雜的方案,AOP允許我們把我們的方案更為緊密地映射到問(wèn)題空間。

其實(shí),AOP的真正“魔術(shù)”在于它的連接點(diǎn)模型,它能夠使你“穿越”中間對(duì)象(例如ActionServlet和RequestProcessor)進(jìn)而直指問(wèn)題的核心。借助于AOP技術(shù)中確定橫切關(guān)注點(diǎn)這種非常“節(jié)儉”的方法,開發(fā)者即能夠設(shè)計(jì)出非常直觀而且更為簡(jiǎn)單的解決方案。AOP,這種強(qiáng)有力的編程方法正好彌補(bǔ)了傳統(tǒng)型OOP編程中所存在的不足。如果被恰當(dāng)用于解決適當(dāng)類型的問(wèn)題,那么,AOP有助于改進(jìn)代碼的模塊化,最終會(huì)產(chǎn)生出更為清晰和更易于理解的代碼。最后,非常希望本文不僅有助于你的Struts應(yīng)用程序的單元測(cè)試,而且還吸引你進(jìn)一步探討AOP編程所體現(xiàn)出來(lái)的其它重要優(yōu)點(diǎn)。

您正在閱讀的是《進(jìn)行Struts應(yīng)用程序單元測(cè)試開發(fā)

【編輯推薦】

  1. 在Eclipse中開發(fā)struts應(yīng)用程序
  2. 手把手教你在Eclipse中配置開發(fā)Struts
  3. Eclipse下開發(fā)struts完整解決亂碼問(wèn)題
責(zé)任編輯:張燕妮 來(lái)源: IT168
相關(guān)推薦

2017-01-16 12:12:29

單元測(cè)試JUnit

2017-01-14 23:26:17

單元測(cè)試JUnit測(cè)試

2013-06-04 09:49:04

Spring單元測(cè)試軟件測(cè)試

2023-12-11 08:25:15

Java框架Android

2017-03-23 16:02:10

Mock技術(shù)單元測(cè)試

2011-08-11 13:02:43

Struts2Junit

2011-07-27 13:39:28

iOS GH-Unit 單元測(cè)試

2017-01-14 23:42:49

單元測(cè)試框架軟件測(cè)試

2021-03-28 23:03:50

Python程序員編碼

2022-04-08 09:01:56

腳本Go應(yīng)用單元

2009-06-01 09:13:52

ASP.NET MVCMVC應(yīng)用ASP.NET MVC

2009-08-19 09:00:48

單元測(cè)試框架自動(dòng)化測(cè)試

2021-03-24 09:30:02

Jupyter not單元測(cè)試代碼

2012-11-01 11:32:23

IBMdw

2012-11-01 11:37:05

JavaScript單元測(cè)試測(cè)試工具

2023-08-02 13:59:00

GoogleTestCTest單元測(cè)試

2022-06-30 09:20:32

單元測(cè)試測(cè)試

2023-08-11 07:59:15

2023-10-07 08:49:56

測(cè)試驅(qū)動(dòng)開發(fā)Xunit 框架

2011-06-20 16:41:59

單元測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人99久久亚洲综合精品 | 激情欧美一区二区三区 | 99re国产精品 | 国产精品久久久久久久久久久久久 | 中文字幕一区二区三区乱码图片 | 国产精品久久久久无码av | www.毛片| 亚洲午夜精品久久久久久app | 一级欧美视频 | 日韩在线91| 国产精品1区 | 国产精品久久久久久模特 | xxxxx免费视频 | 亚洲视频在线看 | 中文字幕一区二区三区精彩视频 | 日韩欧美在线播放 | 成人免费视频观看视频 | 视频在线一区二区 | 操操操av| 欧美性生活视频 | 亚洲一二三区精品 | 亚洲一区 中文字幕 | 国产综合精品 | 免费能直接在线观看黄的视频 | 亚洲精品一 | 国产精品99久久久久久久vr | 中文在线视频观看 | 超碰97人人人人人蜜桃 | 欧美a区 | 久久成人激情 | 日韩在线观看中文字幕 | 久久久日韩精品一区二区三区 | 人人做人人澡人人爽欧美 | 久久精品16 | 午夜视频网站 | 久久亚洲精品国产精品紫薇 | 色婷婷久久久久swag精品 | 亚洲欧洲精品成人久久奇米网 | 91免费观看视频 | 人妖无码| 国产高清精品一区二区三区 |