2015-11-14 209 views
7

我想同時在多個類中運行使用@Test註解的每種方法。對於某些情況,我想限制這一點,並說在任何時候只能有100個可以運行。我希望@BeforeClass註釋在類中的任何測試運行之前運行一次,並且我希望@AfterClass註釋在類運行中的所有測試之後運行一次。我想System.out,System.err和Exceptions被適當地緩衝/捕獲而不是寫出來,以便它們不交織,並且我可以讀取最終輸出並理解發生了什麼。與Junit並行運行測試

這是存在嗎?我有大量的獨立測試用例,我的應用程序是(我相信)線程安全。這些測試都沒有依賴於JVM,我想盡快完成它們,因爲我的硬件。

如果這不存在,是否有一個具體原因爲什麼不?全球junit用戶丟失了多少時間,因爲這不容易?我可以將它構建到Junit中嗎?在我看來,這應該像一面旗子一樣簡單,而且「只是有效」。

回答

11

您可以使用JUnit的ParallelComputer(注意它仍然被認爲是實驗性的)完成此操作。這是一個非常簡單的實現,它由java.util.concurrent.ExecutorService API支持。
如果你好奇它是如何工作的,check out the source

基本上,您可以撥打JUnitCore.runClasses(Computer, Classes ...)並傳入第一個參數的ParallelComputer對象。

實例:

import org.junit.Test; 
import org.junit.experimental.ParallelComputer; 
import org.junit.runner.JUnitCore; 

public class ParallelComputerExample { 

    @Test 
    public void runAllTests() { 
     Class<?>[] classes = { ParallelTest1.class, ParallelTest2.class }; 

     // ParallelComputer(true,true) will run all classes and methods 
     // in parallel. (First arg for classes, second arg for methods) 
     JUnitCore.runClasses(new ParallelComputer(true, true), classes); 
    } 

    public static class ParallelTest1 { 
     @Test 
     public void test1a() { 
      lookBusy(3000); 
     } 

     @Test 
     public void test1b() { 
      lookBusy(3000); 
     } 
    } 

    public static class ParallelTest2 { 
     @Test 
     public void test2a() { 
      lookBusy(3000); 
     } 

     @Test 
     public void test2b() { 
      lookBusy(3000); 
     } 
    } 

    public static void lookBusy(long ms) { 
     try { 
      Thread.sleep(ms); 
     } catch (InterruptedException e) { 
      System.out.println("interrupted"); 
     } 
    } 
} 

上面的代碼將在3秒內,因爲所有的方法和類並行地運行運行。

這將運行在6s(因爲所有的類都是並行的)。 JUnitCore.runClasses(new ParallelComputer(true, false), classes);

這也將運行在6s(因爲所有的方法是並行的)。 JUnitCore.runClasses(new ParallelComputer(false, true), classes);

+2

您不應該從@Test調用JUnitCore.runClasses()。這會弄亂測試報告。請參閱:https://github.com/junit-team/junit4/issues/1102 並行運行測試的真正解決方案是擴展跑步者或套件 –

2

是的,可以。

如果您使用的是maven。你可以把

Maven的萬無一失,插件

在Spring的幫助下,

您可以檢查此Link

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.7.1</version> 
     <configuration> 
      <parallel>classes</parallel> 
      <threadCount>5</threadCount> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

解決方案2:Junit4提供使用並行功能ParallelComputer

0

JUnit Toolbox提供的JUnit爲跑步者的測試並行執行。

爲了不混用輸出System.errSystem.out你必須開始在不同的JVM中的測試,因爲System.errSystem.out是全球性的。