2015-11-14 172 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是全球性的。