在Myeclipse裏使用Junit貼圖教程與使用JUnit在struts+spring+hibernate框架環境下進行單元測試

第一步:寫一個簡單的方法,作爲測試的方法。

查看更多精彩圖片

第二步 將JUnit加入到工程裏面。

查看更多精彩圖片

第三步,創建測試的class。

查看更多精彩圖片

第四步。選中要測試的方法。
查看更多精彩圖片

如果你的工程已經自動加載了Junit用的jar包,可跳過 5 6 這兩步。

第五步 向工程中添加Junit jar包
查看更多精彩圖片

第六步。選擇Junit jar包

查看更多精彩圖片

第七步,編寫測試方法體,並運行。

查看更多精彩圖片
第八步 查看結果。

綠色 表示測試通過。

查看更多精彩圖片

2:使用JUnit在struts+spring+hibernate框架環境下進行單元測試

過往使用的方式從最原始的IDE的DEBUG工具斷點查錯到目前還在用最快捷的使用文字輸出(log或system.out)。 
這些調試方式不是說不好,但有些情況下達不到自己的需求,浪費了一些時間,因爲在SSH的環境下修改的源碼就意味着要部署。 
有個誤區,有的人認爲把ApplicationServer的熱部署方式設置爲ture,就不用部署了。其實實際還是重新部署了一遍,只是不需要你按鍵罷了。 
而且這樣的後果還是你每保存一下就幫你部署一次,項目大的話花費很更多,我想也有不少人知道有個內存溢出的問題...挺頭痛的.. 

之前偶爾接觸到JUnit,才領略到單元測試的精闢,記錄一下學習心得。請別笑學得晚,最近也有個TestNG,有時間也繼續研究下。學習調試程序也是一門學問啊。 

好啦,言歸正傳並且長話短說。 


使用JUnit進行單元測試方法,初步介紹。 


導入JUnit的包就不多說了,一般的IDE都集成的了。 

首先建議大家如果想使用Main靜態方法來進行調試的話,請直接使用JUnit吧。使用方法很簡單,如下: 

Java代碼  收藏代碼
  1. @Test    
  2. public void test1() {    
  3.      System.out.println("Hello World!");    
  4.  }    



其實這個是生命週期的標記,@Before爲執行@Test方法之前先執行的,而@After就是執行完@Test之後執行,比較好理解。如果想不執行的話直接把標記註釋掉即可,快捷簡單。 


執行添加了@Test的方法也簡單,由於我是使用MyEclipse的關係,這裏以它來舉例。其實跟執行Main方法差不多在運行裏面選擇JUnit調試的選項。快捷鍵:Alt+Shift+X,T,但我更喜歡在代碼上面右鍵然後選擇運行JUnit測試。


在傳統的三層架構中進行單元測試 


DAO層和業務邏輯層的調試 


首先在@Before標記上執行獲取需要調試的單元所使用的bean。 

具體例子如: 

Java代碼  收藏代碼
  1.  private IMailboxDAO MailboxDAOImpl;    
  2.  @Before    
  3.  public void init() {    
  4.      ApplicationContext context = new ClassPathXmlApplicationContext(    
  5.              new String[] { "applicationContext.xml" });    
  6.      BeanFactory factory = (BeanFactory) context;    
  7.      MailboxDAOImpl = (IMailboxDAO) factory.getBean("mailboxDAOImpl");    
  8.         
  9.  }    
  10.     
  11. @Test    
  12. publiv void testSave(){    
  13.     Bean transientInstance = new Bean();    
  14.     ...    
  15.     MailboxDAOImpl.save(transientInstance);    
  16. }    


獲取BeanFactory的方法有多種,這裏比較推薦使用這種方法。注意這裏的applicationContext.xml是放在classPath之下,也推薦放在這裏,比較好調試。 

view層的調試 

在我的應用中,view層使用的是struts1.29的技術,其實際上也沒用到什麼,僅僅作爲servlet來使用罷了。而且struts的標記庫也實在太囉嗦了,所以我前端使用的技術是AJAX+JSON+Struts. 
JavaScript就不用多說了,必定需要的了,而這裏不推薦使用DWR框架,當然如果對JavaScript不熟的話也沒辦法了。總之還是王道的那句:使用什麼技術還是取決與實際項目情況。 

說這些的原因是告訴大家,struts所用到的from、forward之類的我都沒調試了,後續描述一下。 

首先想調試struts,使用到的技術是StrutsTestCase。具體地址http://sourceforge.net/projects/strutstestcase/ 

需要記住的是,StrutsTestCase是Junit TestCase類的擴展。 

使用方法,例子如下: 

首先把單元測試類繼承servletunit.struts.MockStrutsTestCase 

然後模擬容器,具體請查看以下 

Java代碼  收藏代碼
  1. /**  
  2.  * 加載模擬容器  
  3.  * @throws java.lang.Exception  
  4.  */    
  5. @Before    
  6. public void setUp() throws Exception {    
  7.     super.setUp();    
  8.     File context = new File("WebRoot");    
  9.     setContextDirectory(context);    
  10. }    


注意setContextDirectory方法,默認情況下setUp()方法會在classPath下找web.xml和struts-config.xml等配置文件,所以可能會遇到找不到的情況。 

使用setContextDirectory並且設置File爲"WebRoot"的話,告訴程序在WebRoot下找配置文件,在SSH通常情況下都適用。 

準備功夫做好了就可以盡情的進行測試了,並不用擔心修改代碼後需要重新部署項目了。 
這裏注意的時,在繼承了MockStrutsTestCase的子類當中,所有以test開頭的方法都自動執行調試程序,不再需要@Test標記。這裏有保留意見,雙利刃吧,還是喜歡用標記進行測試。 

例子如下: 

Java代碼  收藏代碼
  1. public void testToPageGoMembershipByDl() {    
  2.     String actionUri = "/distributionList/bin/get_members";    
  3.     String parameterKey1 = "toPage";    
  4.     String parameterKey2 = "dlId";    
  5.     String toPageGoStr = "1";    
  6.     String dlId = "402881b6200d287101200d69838f0009";    
  7.     Map<String, Object> urlMap = new HashMap<String, Object>();    
  8.     urlMap.put(parameterKey1, toPageGoStr);    
  9.     urlMap.put(parameterKey2, dlId);    
  10.     generateRequestParameters(urlMap);    
  11.     setRequestPathInfo(actionUri);//設置request的請求    
  12.     actionPerform();//執行請求    
  13. }    
  14.     
  15. //公共方法,封裝url的parameters請求    
  16. public void generateRequestParameters(Map<String, Object> parameters) {    
  17.     if ((parameters != null) && (!parameters.isEmpty())) {    
  18.         for (Map.Entry<String, Object> entry : parameters.entrySet()) {    
  19.             String key = entry.getKey();    
  20.             Object value = entry.getValue();    
  21.             String[] parameterValues = null;    
  22.             if (value instanceof String) {    
  23.                 parameterValues = new String[] { (String) value };    
  24.             } else if (value instanceof String[]) {    
  25.                 parameterValues = (String[]) value;    
  26.             }    
  27.             if (parameterValues != null)    
  28.                 addRequestParameter(key, parameterValues);//增加request參數    
  29.         }    
  30.     }    
  31. }    


當然JUnit沒這麼簡單,但我使用到的這些足夠了,其他的還可以使用斷言(assert)來輔助大家調試。給大家舉一些例子,當中都爲網上整理出來。 

主要函數和作用 

setRequestPathInfo,設置request的請求 

addRequestParameter,將參數和對應的值加入request中 

actionPerform,執行這個請求 

verifyForward,驗證forward的名字是否正確 

verifyForwardPath,驗證forward的path是否正確 

verifyNoActionErrors,驗證在action執行過程中沒有ActionError產生 

verifyActionErrors,驗證在action執行過程中產生的ActionError集合的內容
 


如果你action裏面有setAttribute之類的方法,也想驗證的話。 

也可以通過getSession()方法來獲取session(request類似)。 

跟着再使用getAttribute進行assert就可以組合成自己需要的調試單元了。順便列舉一下assert方法。 

assertEquals(), assertNull(), assertSame(), assertTrue(),assertArrayEquals()等.. 

無論如何,如果你不喜歡使用assert方法,直接輸出一下也十分便捷。 

希望對大家學習有幫助。


發佈了32 篇原創文章 · 獲贊 5 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章