2009-08-04 41 views
64

我有我使用Maven構建一個項目,該項目使用Hibernate(和Spring)從數據庫中檢索數據等使用Maven進行集成測試的最佳做法?

我的「測試」爲我的項目中的DAO擴展Spring的AbstractTransactionalDataSourceSpringContextTests,這樣一個數據源可以被連接到我測試的類中,以便能夠實際運行查詢/休眠邏輯,獲取數據等。

在其他幾個項目中,我使用這些類型的測試與HSQL數據庫 - 內存或指向文件)能夠高效地測試實際的數據庫查詢邏輯而不依賴於外部數據庫。這很好,因爲它避免了任何外部依賴和運行測試之前數據庫的「狀態」(每個測試都被包裝在一個回退的事務中)。

我很好奇,但有關組織這些測試,這是真正的集成測試鬆散的味道,與Maven的最佳途徑。將這些測試保存在src/test/java中感覺有點骯髒,但從我讀過的內容來看,這似乎沒有一個與Maven一起組織集成測試的一致策略或實踐。

從我目前閱讀的內容來看,似乎我可以使用Failsafe plugin(或Surefire的第二個實例)並將其綁定到integration-test階段,並且我還可以綁定自定義啓動或關閉邏輯(如用於啓動/停止HSQL實例)至pre-integration-testpost-integration-test。但是,這真的是最好的方法嗎?

所以我的問題基本上就是 - 什麼是對與Maven組織這次普遍接受的最佳做法?我無法在文檔中找到任何一致的答案。

我想是:從集成測試

  • 獨立的單元測試,所以只有單元測試在test階段
  • 自定義開機/關機邏輯結合pre-integration-test的能力運行, post-integration-test
  • 已經從集成的測試報告合併/帶有單元測試神火報告
+2

移動集成測試中一個單獨的項目並將單元測試與源代碼保持在同一項目中。 – 2014-02-06 13:59:03

回答

20

有一些指導原則codehaus page。我發現這個故障安全插件有點破解,它讓Eclipse中的單元測試運行起來非常複雜。我廣泛地描述你所描述的內容。

在SRC定義集成測試/ ITEST/JAVA 在預集成測試階段:

  • 清除目標/測試類
  • 使用build-helper-maven-plugin的附加測試源目標添加ITEST源位置
  • 使用自定義的Mojo從配置再次刪除的src/test/java下這樣的單元測試不編譯(我真的不喜歡這樣,但它需要保持單元和集成的分離測試)。
  • 使用編譯器插件編譯集成測試

然後在集成測試階段,使用神火-插件來運行測試。

最後,將任何整理好的目標綁定到整合後測試階段(儘管通常它們不是必需的,因爲您可以使用test teardown()來整理)。

我還沒有找到合併測試結果的方式,因爲報告階段已經過去了,但我傾向於將集成測試視爲額外的獎勵,所以只要他們通過報告並不重要。

更新:我認爲值得指出的是,您可以在集成測試中運行Jetty,而不是使用碼頭目標。這樣可以更好地控制測試。您可以從this answer和引用的博客中獲得更多詳細信息。

+2

你真的需要刪除單元測試嗎?當然,在集成測試時再次運行它們並不是一個壞主意。 – 2009-08-05 09:29:03

+1

一般而言,你是對的。再次運行單元測試並沒有什麼壞處,但是我已經在服務器上安裝了100多個項目,並且必須做一些優化來管理可用硬件中的負載。 – 2009-08-05 09:32:33

+0

夠公平的,你有一個相當重要的特例:-) – 2009-08-06 00:45:28

6

This good blog post建議三個選項;

1)集成測試單獨的模塊

2)不同的源目錄

3)不同的文件名模式

我還沒有嘗試所有這三個,所以不能提供意見我贊成。

25

這樣做的一個非常簡單的方法是使用JUnit類別。

然後,您可以在測試階段輕鬆地運行一些測試,而在整合測試階段則可以輕鬆地運行一些測試。

它需要幾分鐘,只需要3個步驟。

  1. 定義標記接口
  2. 註釋要拆分
  3. 配置Maven插件的類。

這裏給出一個完整的例子。 https://stackoverflow.com/a/10381662/1365383

1

我更喜歡第二個選項,不同的源目錄,但我發現很煩人的必須以IT結束集成測試或排除軟件包。

爲了避免這種情況,我已經結束了與此配置:

<properties> 
    <testSource>src/test/java</testSource> 
    <testSourceResource>src/test/resources</testSourceResource> 
</properties> 
<build> 
    <testSourceDirectory>${testSource}</testSourceDirectory> 
    <testResources> 
      <testResource> 
      <directory>${testSourceResource}</directory> 
      </testResource> 
     </testResources> 
..... 
..... 

,然後我覆蓋不同的配置文件兩個變量進行集成和驗收測試:

<profiles> 
    <profile> 
    <id>acceptance-tests</id> 
    <properties> 
    <testSource>src/acceptance-test/java</testSource> 
    <testSourceResource>src/acceptance-test/resources</testSourceResource> 
    </properties> 
    </profile> 
<profile> 
    <id>integration-tests</id> 
    <properties> 
    <testSource>src/integration-test/java</testSource> 
    <testSourceResource>src/integration-test/resources</testSourceResource> 
    </properties> 
    </profile> 
..... 
..... 
.....