2013-07-23 99 views
5

既然可以配置maven surefire在一個版本中執行jUnit測試和testNG測試。我不會詳細說明爲什麼我這麼做(ok,提示:testNG是我們的標準框架,但是像jnario這樣的框架需要jUnit)。如何讓maven surefire正確執行JUnit和TestNG測試?

一般的方式做到這一點是配置萬無一失插件這樣的:

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>${surefire.version}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-junit47</artifactId> 
      <version>${surefire.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-testng</artifactId> 
      <version>${surefire.version}</version> 
     </dependency> 
    </dependencies> 
</plugin> 

(taken from here)

這工作得很好,JUnit測試和TestNG測試得到執行。

但是 - 現在我看到testNG也嘗試執行jUnit測試(可能反之亦然) - 當然沒有成功,因爲它不會看到它的任何註釋,但它看起來像它重新將測試標記爲「通過」...無論如何,除非我評論第二個依賴關係條目,否則某些報告工具不會在jUnit測試中顯示測試失敗。

有沒有更好的方法來配置surefire,以便兩個框架的測試只能由他們的測試運行者執行?

+0

交叉發佈在Maven-Users-List上:http://maven.40175.n5.nabble。com/maven-surefire-selecting-providers-td5764817.html –

回答

1

我自己並沒有這樣做,但是您可以嘗試配置maven-surefire-plugin的兩個different executions,並將其中一個配置爲僅運行JUnit測試,另一個僅運行testNG測試。要區分JUnit和testNG測試,您應該將測試放在不同的目錄中或使用可區分的名稱方案,並使用合適的inclusion and exclusion patterns配置每個執行。

理論上這應該工作:)

+0

我無法將''元素拉入執行。如果可以的話,那麼它真的是*解決方案,一個執行限於jUnit,另一個執行TestNG :( –

+0

你讓我錯了,我的意思是兩個與原始問題一樣。配置不同的包含/排除,一個執行只能找到JUnit測試,另一個只能找到testNG測試,這樣不必要的測試就會被surefire過濾掉,不會傳遞給測試框架 –

+1

啊,是的,我也嘗試過(並且更糟糕)TestNG get被激活了所有的執行,並且如果一個執行沒有測試運行(沒錯,有一個屬性......),構建失敗 - 看起來好像我找到了一個bug,從maven的用戶郵件列表強烈鼓勵我[報告問題](https://jira.codehaus.org/browse/SUREFIRE-1019)。+1回答與幫助! –

4

與您有同樣的問題。 TestNG報告中的零結果,但看起來像測試運行。 最後得到的maven-surefire-plugin

  1. 兩個獨立的執行這項工作首先從插件刪除dependencies部分。
    • 否則,如果您使用<testNGArtifactName>(我們會需要它)測試將通過TestNG的反正執行和java.lang.NullPointerException
  2. 有TestNG的測試和JUnit測試部分的分離將失敗。在我們的例子NG測試類的名字與TestNg
  3. 跳過默認執行
  4. 結束這樣定義空兩<executions>
<plugin> 
    <!-- configured to work with JUnit and TestNg in same project separatelly --> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId>    
    <configuration> 
     <!-- whatever you need... --> 
     <!-- skip the default execution, we have separate for Ng and for JUnit --> 
     <skip>true</skip> 
    </configuration> 
    <executions> 
     <execution> 
      <id>TestNg-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <!-- overwrite skip from default config --> 
       <skip>false</skip> 
       <includes> 
        <include>%regex[.*TestNg.*]</include> 
       </includes> 
       <!-- used to skip JUnit profider --> 
       <junitArtifactName>dev:null</junitArtifactName> 
       <!-- to continue on next execution in case of failures here --> 
       <testFailureIgnore>true</testFailureIgnore> 
      </configuration> 
     </execution> 
     <execution> 
      <id>JUnit-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 

       <skip>false</skip> 
       <!-- used to skip TestNg profider --> 
       <testNGArtifactName>dev:null</testNGArtifactName> 
       <excludes> 
        <exclude>%regex[.*TestNg.*]</exclude>        
       </excludes> 
      </configuration>      
     </execution> 
    </executions> 
</plugin> 

測試了:

<junit-version>4.11</junit-version> 
<maven-surefire-plugin-version>2.16</maven-surefire-plugin-version> 
<org.testng-version>6.8.7</org.testng-version> 

這種配置的瑪吉來自:
Running TestNG-, JUnit3- and JUnit4-tests with Maven Surefire in one run
your SUREFIRE bug report,
surefire plugin configuration

希望它有幫助。

+0

卓越的解決方案! – bedrin

相關問題