2012-01-10 99 views
8

我有一个单元测试有时会失败,调试它是一件痛苦的事情,因为我不知道它为什么有时会失败。在Eclipse中,如何多次运行JUnit测试用例

Eclipse内部有一种方法可以运行5次或50次的JUnit测试吗?

谢谢。

+0

你试图测试什么? – Venki 2012-01-10 15:03:10

+0

我的方法之一。 – Thom 2012-01-10 15:05:38

+0

JUnit 3.x或4.x? – mikej 2012-01-10 15:07:38

回答

4

这里有一个测试装饰器。例如

@Test 
@Repeat(10) 
public void FailRandomlyNeedToKnowWhy() { 
    .... 
} 
+1

“RepeatedTest”装饰器来自JUnit,而您的代码示例包含Spring注释,不是吗? – javanna 2012-01-29 19:04:40

+1

它仅适用于Spring – 2012-07-13 11:51:34

8

你有没有试过类似的东西?

@Test 
public void runMultipleTests() { 
    for (int i = 0; i < 10; i++) { 
     myTestMethod(); 
    } 
} 
+1

啊。有一个想法。如果我绝望,我可能会尝试。 – Thom 2012-01-10 15:10:37

13

见Junit的API在 http://junit.org/apidocs/junit/extensions/RepeatedTest.html

我只是发现了以下解决方案,它不需要任何额外的depedency(需要你有答案的一个弹簧)。

运行与Parameterized亚军测试:

@RunWith(Parameterized.class) 

然后添加下面的方法提供了许多空参数等于要运行测试的次数:

@Parameterized.Parameters 
public static List<Object[]> data() { 
    return Arrays.asList(new Object[10][0]); 
} 

这样你甚至不必编写循环。 IntelliJ和eclipse也将每次迭代的结果组合在一起。

1

灵感上this solution

使用@Repeat注​​释是这样的:

public class MyTestClass { 

    @Rule 
    public RepeatRule repeatRule = new RepeatRule(); 

    @Test 
    @Repeat(10) 
    public void testMyCode() { 
     //your test code goes here 
    } 
} 

您只需要这两个类:

Repeat.java:

import static java.lang.annotation.ElementType.ANNOTATION_TYPE; 
import static java.lang.annotation.ElementType.METHOD; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ METHOD, ANNOTATION_TYPE }) 
public @interface Repeat { 
    int value() default 1; 
} 

RepeatRule.java:

import org.junit.rules.TestRule; 
import org.junit.runner.Description; 
import org.junit.runners.model.Statement; 

public class RepeatRule implements TestRule { 

    private static class RepeatStatement extends Statement { 
     private final Statement statement; 
     private final int repeat;  

     public RepeatStatement(Statement statement, int repeat) { 
      this.statement = statement; 
      this.repeat = repeat; 
     } 

     @Override 
     public void evaluate() throws Throwable { 
      for (int i = 0; i < repeat; i++) { 
       statement.evaluate(); 
      } 
     } 

    } 

    @Override 
    public Statement apply(Statement statement, Description description) { 
     Statement result = statement; 
     Repeat repeat = description.getAnnotation(Repeat.class); 
     if (repeat != null) { 
      int times = repeat.value(); 
      result = new RepeatStatement(statement, times); 
     } 
     return result; 
    } 
} 

2016年10月25日编辑: 为了使用此解决方案使用@RunWith(PowerMockRunner.class),更新时Powermock 1.6.5包括this patch)。

相关问题