2010-08-30 90 views
8

使用Maven surefire,我無法執行並行測試。也就是說,我的每個測試用例都可以運行在一個serapate JVM中,因此是分叉的。另外,我希望我的測試用例能夠並行運行。第一部分沒有問題:我可以在自己的JVM中運行每個測試用例。但第二部分對我來說仍然是一個挑戰。我沒有設法讓測試案例的並行執行工作。這裏是我的插件聲明如何:Maven Surefire:無法執行並行測試執行

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <parallel>methods</parallel> 
      <forkMode>always</forkMode> 
       <argLine>-Xms512m -Xmx512m</argLine> 
     </configuration> 
</plugin> 

我試過兩種方法和類,但沒有看到任何並行化。 我的JUnit版本是4.7,如圖由depency聲明:

<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>compile</scope> 
    </dependency>    

任何幫助將非常appricated。

Gregoire。

回答

7

我認爲你應該使用parallel模式時使用的threadCount參數:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <forkMode>always</forkMode> 
     <argLine>-Xms512m -Xmx512m</argLine> 
     <parallel>methods</parallel> 
     <threadCount>4</threadCount> 
    </configuration> 
    </plugin> 
2

確保您就在抽穗前獲得一個日誌消息是這樣的

[INFO] Concurrency config is {perCoreThreadCount=false, threadCount=1, parallel=classes, configurableParallelComputerPresent=true} 

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 

此消息表明並行的surefire junit提供者是活躍的。

如果這不存在surefire可能會採取不同的版本junit比你想象的。低於4.7的任何內容都不起作用。運行mvn依賴關係:樹來檢查哪個版本存在。

您還應該升級到surefire 2.6,因爲修復了與並行運行相關的一些小錯誤。出於同樣的原因,你應該使用最新的junit。

+0

你不想讓perCoreThreadCount成爲true嗎?否則擁有threadCount 1,意味着你只用一個線程並行運行,即串行? – Nicolai 2011-05-06 07:44:27

+0

不,您希望分佈在每個可用內核上的線程,而不是一個內核上的所有線程。不幸的是,他們將默認設置爲perCoreThreadCount = true,在一個內核上執行所有線程。 – rwst 2012-09-11 15:17:46

0

你確定它不工作?如果您的測試不包含許多測試方法,則可能無法獲得太多加速。使用forkMode =總是可以做的最好的做法是並行地在一個類中運行所有測試方法。

1

嘗試將您的forkMode從始終更改爲「never」。它沒有在他們的文檔中說明這一點,但是此時你不能有fork和parallel(我們在通過surefire代碼挖掘之後發現了這個)。

只是你知道,你可能會遇到不是測試由於許多測試/支持庫(easymock,powermock等)導致線程安全,從而使並行測試的能力無效。

4

我有同樣的問題,因爲我用萬無一失的2.7版本,升級後的2.12它具有以下配置工作:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12</version> 
    <configuration> 
    <parallel>classes</parallel> 
    <forkMode>perthread</forkMode> 
    <threadCount>4</threadCount> 
    </configuration> 
</plugin> 

它催生了4線程,每個線程運行它自己的JVM。

+1

這個解決方案有一個在maven-surefire-plugin 2.13中解決的bug。檢查此線程的更多信息:http://stackoverflow.com/questions/11098073/maven-surefire-failsafe-forkmode-perthread-is-not-working-a-workaround – ggarciao 2012-09-12 07:49:42

0

surefire 2.16修復了有關JUnit測試的並行執行。