我希望能够以指定的次数运行Test类。该课程如下:
@RunWith(Parameterized.class)
public class TestSmithWaterman {
private static String[] args;
private static SmithWaterman sw;
private Double[][] h;
private String seq1aligned;
@Parameters
public static Collection<Object[]> configs() {
// h and seq1aligned values
}
public TestSmithWaterman(Double[][] h, String seq1aligned) {
this.h = h;
this.seq1aligned = seq1aligned;
}
@BeforeClass
public static void init() {
// run smith waterman once and for all
}
@Test
@Repeat(value = 20) // does nothing
// see http://codehowtos.blogspot.gr/2011/04/run-junit-test-repeatedly.html
public void testCalculateMatrices() {
assertEquals(h, sw.getH());
}
@Test
public void testAlignSeq1() {
assertEquals(seq1aligned, sw.getSeq1Aligned());
}
// etc
}
上面的任何测试都可能失败(并发错误 - 编辑:失败提供有用的调试信息)所以我希望能够多次运行该类,并且最好以某种方式对结果进行分组。尝试Repeat annotation - 但这是测试特定的(并没有真正使它工作 - 见上文)并与RepeatedTest.class挣扎,似乎无法转移到Junit 4 - 我在SO上发现的最接近是this - 但显然是Junit3。在Junit4,我的套房看起来像:
@RunWith(Suite.class)
@SuiteClasses({ TestSmithWaterman.class })
public class AllTests {}
我认为无法多次运行此操作。 Parametrized with empty options真的不是一个选择 - 因为我还需要我的参数
所以我一次又一次地在日食中遇到Control + F11
帮助
编辑(2017.01.25):有人继续将此标记为问题的副本,我明确表示其接受的答案不适用于此处
答案 0 :(得分:1)
正如@MatthewFarwell在评论中所建议的那样,我实施了一项测试规则as per his answer
public static class Retry implements TestRule {
private final int retryCount;
public Retry(int retryCount) {
this.retryCount = retryCount;
}
@Override
public Statement apply(final Statement base,
final Description description) {
return new Statement() {
@Override
@SuppressWarnings("synthetic-access")
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
int failuresCount = 0;
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
} catch (Throwable t) {
caughtThrowable = t;
System.err.println(description.getDisplayName()
+ ": run " + (i + 1) + " failed:");
t.printStackTrace();
++failuresCount;
}
}
if (caughtThrowable == null) return;
throw new AssertionError(description.getDisplayName()
+ ": failures " + failuresCount + " out of "
+ retryCount + " tries. See last throwable as the cause.", caughtThrowable);
}
};
}
}
作为我的测试类中的嵌套类 - 并添加了
@Rule
public Retry retry = new Retry(69);
在我的同一课程中的测试方法之前。
这确实可以解决问题 - 它会重复测试69次 - 在某些异常的情况下,新的AssertionError,包含一些统计信息加上原始Throwable作为原因的单个消息会被抛出。因此,统计信息也将在Eclipse的jUnit视图中可见。