2016-01-20 118 views
4

我有一個測試套件,需要手動執行一些設置代碼才能確保數據庫中的某些數據是正確的。如何在maven surefire運行測試之前執行一次方法

我們使用maven surefire插件並行運行測試。 ${tests.wildcard}由配置文件指定。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.16</version> 
    <configuration> 
     <forkCount>4</forkCount> 
     <reuseForks>false</reuseForks> 
     <includes> 
      <include>${tests.wildcard}</include> 
     </includes> 
    </configuration> 
</plugin> 

我希望能夠在整個maven執行過程中只運行一次方法,然後surefire會並行運行我的測試。我怎樣才能做到這一點?

+0

你有沒有檢查[this](http://stackoverflow.com/questions/12087959/junit-run-set-up-method-once)和[this](http://stackoverflow.com/questions/18574513/junit-run-setup-only-once-for-a-large-of-test-classes)回答一些提示? –

+0

是的,那些不會工作。這會讓我的代碼每個類運行一次,而不是每個Maven執行一次。 –

回答

3

您可以有一個特殊的測試用例來執行您的驗證代碼(如果出現問題,將會失敗)。

這個測試用例然後將通過一個特定的Maven神火執行(不包括其他測試)只是test階段之前執行,並且附接至一個Maven相occurring(如process-test-classes):因此,有效地被每Maven的運行和之前調用一次任何其他測試。

然後,正常的test階段將執行任何其他所需的測試,不包括特殊的初始化測試。

這樣的配置的一個例子是:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19</version> 
    <configuration> 
     <excludes> 
      <exclude>**/InitTest.java</exclude> 
     </excludes> 
    </configuration> 
    <executions> 
     <execution> 
      <id>test-init</id> 
      <phase>process-test-classes</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <test>InitTest</test> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

注意任何神火執行全局配置將排除特殊的初始化測試。然後會執行一個額外的執行(在test階段之前),並且僅運行初始測試(使用<test>元素,其中priority超過任何其他包含/排除)。

因此,你將有以下流程:

  • 執行特殊的初始化驗證數據到數據庫(如果需要的話失敗)
  • 執行任何其他測試

更新
請注意,您可以實現相同的,也許更具語義的通過覆蓋默認的Surefire測試執行(具有default-test執行ID)來運行特殊測試(並排除其他測試),然後爲其餘部分添加另一個surefire執行(如上面描述的全局配置,這次是特定的執行配置)。
使用這種方法,一切都將附加到test階段,這就是爲什麼它會在語義上更加正確,雖然在pom中稍微冗長些。

+0

@安迪你試過這種方法嗎?任何反饋? –

+0

對不起,還沒有機會檢查出來。我一定會回覆和/或接受你的回答。感謝您的建議! –

相關問題