2011-06-22 151 views
1

我已經從我的多模塊設置中提取了所有集成測試,並將它們全部放入單獨的項目中。這些集成測試基於spring並使用真正的數據庫。我使用dbmaintain這是一個數據庫版本控制工具,它會自動跟蹤需要應用哪些SQL文件並保持數據庫處於正確狀態。JUnit和集成測試 - 是否可以在運行任何測試之前運行一個測試

我希望能夠在任何測試運行之前運行確保數據庫是最新的代碼。所以如果你運行所有的測試(從Eclipse或Maven來看),它將首先執行數據庫檢查一次,或者如果你運行一個測試,它將首先執行數據庫檢查。無論運行多少次測試,都應該始終運行數據庫檢查。

現在我想我會在基礎測試類中使用@BeforeClass(所有測試最終都會從這個類繼承),它將實例化一個單例來完成它的工作。這個單身人士將控制一切,以確保事情只能運行一次。

我希望有一個更清潔的方式。

回答

2

默認情況下,JUnit的Maven runner保留重新排列測試的權利。這實際上是一件好事(tm),因爲您可以告訴Maven JUnit插件運行tests in parallel,這意味着您無論如何都不知道訂單。另外,其他工具(如TeamCity)可以設置爲首先運行失敗的測試。

我認爲您最好的選擇是將您的數據庫更新代碼添加爲測試套件設置的一部分(不是您的JUnit框架的一部分)。使用Exec Maven Plugin調用您的DB代碼,將其綁定到generate-test-resources phase。你需要確保當你運行你的測試時,你實際上是call Maven to run the test

JUnit確實有一個ExternalResource的概念,這是一種更明確的聲明數據庫依賴關係的方式。這將比基類多幾行代碼,但取決於你的視角,它可能更優雅。

1

在Maven的: (1)添加dbmaintain插件:顯式調用測試 之前http://source.mysema.com/display/maven/Maven+Plugins (2A),調用相應的目標(如updateDatabase)(2B)或者,如果你想在一個特定的要執行的相關性階段,那麼Maven的支持這一點,太:http://maven.apache.org/plugins/maven-dependency-plugin/usage.html

然後,您可以Eclipse的連接到這些變化的Maven: How do I start Maven "compile" goal on save in Eclipse?

1

的JUnit不支持測試排序。您需要使用TestNG。例如:

@Test(groups = "init") 
public void initDatabase() { ... } 

@Test(dependsOnGroups = "init") 
public void test1() { ... } 

@Test(dependsOnGroups = "init") 
public void test2() { ... } 

在這個例子中,initDatabase()將被首先運行,並且僅當它成功將TEST1()和TEST2()中運行。如果initDatabase()失敗,test1()和test2()將不會運行,它們將在報告中標記爲「跳過」。

還要注意,您可以隨時向任何組中添加方法,並且依賴性將按您期望的方式繼續工作。

相關問題