2008-11-11 133 views
35

我正在開發一個Spring MVC項目,並對源代碼樹中的所有組件進行了單元測試。單元測試與Spring的集成測試

例如,如果我有一個控制器HomeController,這需要有一個LoginService注入,然後在我的單元測試HomeControllerTest我簡單地實例化對象爲正常(春之外),並注入屬性:

protected void setUp() throws Exception { 
    super.setUp(); 
    //... 
    controller = new HomeController(); 
    controller.setLoginService(new SimpleLoginService()); 
    //... 
} 

這很適合作爲一個獨立單元測試每個組件 - 除非現在我在項目中有幾十個類,寫了一個類併爲它寫了一個成功的單元測試之後,我一直忘記更新我的Spring MVC上下文文件,用於在部署的應用程序中進行實際配線。我發現當我將項目部署到Tomcat並從非佈線Bean中找到一堆NullPointers時,我忘記了更新上下文文件。

所以,這裏是我的問題:

  1. 這是我的第一個春天項目 - 是正常的,創造個人豆單元測試,因爲我已經做了,然後創建一個測試的第二套房(集成測試)來測試一切如實際應用程序上下文一樣工作?這是否有一個確定的最佳實踐?

  2. 另外,如何將單元測試與集成測試分開?我有src的所有源代碼,單元測試test - 是否應該有用於集成測試用例的第二個測試文件夾(如test-integration)?

因爲這是我的第一個Spring項目,我很好奇別人怎樣通常去這樣做這樣的事情 - 和而不是重新發明輪子我寧願叫社會的其餘部分。

回答

32

我不能說是最佳做法,但這是我過去所做的。

單元測試:

  • 創建非平凡豆(即大部分的春天的相關Bean)
  • 用嘲笑的注射服務的單元測試,其中實際(即大多數,如果不是全部時間)。
  • 在項目test目錄中對這些測試使用標準命名約定。使用TestTestCase作爲類名的前綴或後綴似乎被廣泛使用。

集成測試:

  • 創建AbstractIntegrationTestCase,設置了一個SpringWebApplicationContext在intetgration測試clases使用。
  • test目錄中對集成測試使用命名約定。我使用IntTestIntegrationTest作爲這些測試的前綴或後綴。

設立三個螞蟻test目標:

  1. 測試所有(或任何你想將它命名):運行單元測試和集成測試
  2. 測試:運行單元測試(只是因爲test似乎是最常見的用法進行單元測試
  3. 測試集成:運行集成測試

如前所述,您可以使用對您的項目有意義的命名約定。

至於將單元從集成測試分離到一個單獨的目錄中,只要開發者及其工具能夠輕鬆找到並執行它們,我認爲它不重要。

作爲一個例子,我和Spring一起工作的最後一個Java項目完全使用上面描述的內容,集成測試和單元測試都在同一個test目錄中。另一方面,Grails項目在通用測試目錄下顯式地將單元和集成測試目錄分開。

+1

這聽起來像一個很好的策略。但是在單元測試和集成測試在同一個目錄中,Eclipse沒有辦法讓它們分開,是嗎? Eclipse運行junit測試的唯一選項是運行一個或全部運行在某個文件夾中 - 不能像Ant那樣通過名稱來分割它們。 – 2008-11-11 19:22:38

+0

我必須回去檢查Eclipse - 你是對的,如果它們在同一個目錄下,我沒有看到區分測試的方法。我上一個Spring項目是在Idea/Intellij中完成的,並且已經足夠長,我不記得IDE配置是什麼。 – 2008-11-11 22:55:10

4

很多繁瑣的雙簿記着春天的消失,如果你也切換到純註釋政權,在那裏你註釋與@Component,@Controller,@Service以及@Repository所有的豆類。只需將@Autowired添加到需要注入的屬性即可。彈簧參考手冊的

見第3.11節。 http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

與此相關的,我們一直在使用的劃分單元/ Integratrion測試,景描述。在我最近的制度中,我們還推出了第三個「測試類」,「ComponentTests」。這些運行時採用全彈簧佈線,但採用有線存根實現(在春季使用組件掃描過濾器和註釋)。

我們這樣做的原因是因爲對於某些「服務」層來說,最終會出現一大堆手動編碼的佈線邏輯來手動連接bean,有時還會有大量可笑的模擬對象。用於5行測試的100條佈線並不少見。組件測試緩解了這個問題。

0

當我創建Web應用程序的集成測試,我把它們放在一個單獨的目錄。他們使用的是內置的JUnit或TestNG的,並使用類似Selenium命中網頁,好像他們是用戶測試與系統交互。該週期會是這樣的:編譯,運行單元測試,構建Web應用程序,將其部署到正在運行的服務器,執行測試,取消部署應用程序,並報告結果。這個想法是測試整個系統。

2

使用的InitializingBean接口(實現方法「的afterPropertiesSet」)或指定您的豆的初始化方法。 InitializingBean通常更簡單,因爲您不需要記住將init方法添加到bean。

使用afterPropertiesSet方法,以確保一切被注入非空,如果是空,拋出異常。

0

,相對於來自集成測試單獨運行單元測試,我把所有的後者爲集成測試目錄,並使用IDE /螞蟻使用像this的方法運行它們。適用於我。

6

幾個孤立點:

是的,這是對彈簧試驗的常用方法 - 單獨的單元測試和集成測試其中前者不加載任何Spring上下文。

對於您的單元測試,可能考慮嘲笑以確保您的測試集中在一個隔離模塊上。

如果你的測試是在一系列依賴關係中進行連線,那麼它們並不是真正的單元測試。他們是集成測試,您使用新的而不是依賴注入來連接依賴關係。當您的生產應用程序使用Spring時,浪費時間和重複工作!

啓動Spring上下文的基本集成測試很有用。

@required註釋可以幫助您確保在Spring佈線中捕獲所需的依賴關係。

也許看看Maven會給你明確的階段來綁定你的單元和集成測試。 Maven在Spring社區中被廣泛使用。

0

單元測試和集成測試的區別是,單元測試並不一定加載情況下,你會注重你所編寫的代碼 - 它的工作原理失敗較快時,即有和沒有例外,通過嘲弄任何依賴調用它。 但是在集成測試的情況下,您可以加載上下文並執行端到端測試,如實際方案。