运行多个JUnit测试 - 如果发生一次故障,请不要重复

时间:2013-05-30 22:26:46

标签: java unit-testing testing junit junit4

我现在正在使用JUnit作为测试工程数据的框架(参考:上一个问题Creating a Java reporting project -- would like to use JUnit and Ant but not sure how

由于图片(错误的代码块)告诉1000个单词,所以让我粘贴我的循环:

JUnitCore junit = new JUnitCore();
RunListener listener = new RunListener();
junit.addListener(listener);

[...]

for (AbstractFault fault : faultLog) {
    theFault = fault;
    Result result = junit.run(GearAndBrakeFaultLogReports.class);

    for (Failure f : result.getFailures()) {
        output.println(log.getName());
        output.println(fault.getName());
        output.println(HelperFunctions.splitCamelCase(f.getDescription()
                .getMethodName()));
        output.println(f.getMessage());
        output.println();
    }
}

如您所见,我多次运行“junit.run”(对于日志中的每个故障)。

但是,如果我的任何一个测试都触发了一个失败(),我不想重复那个测试。换句话说,如果日志中有50个故障,并且在故障#1中测试失败,我不想在我正在循环的49个未来故障中尝试该测试。

以下是一个示例测试:

private static boolean LeftMLGDownTooLongFound = false;
@Test
public final void testLeftMLGDownTooLong() {
if (!LeftMLGDownTooLongFound 
        && handleLDGReportFaults(false)
        && theFault.getName().equals(FaultNames.LDG_LG_DWN_TIME.toString())) {

        assertNotGreater(getPCandRecNum(), 8f, ldgFault.getLeftStrutUpTime());
        LeftMLGDownTooLongFound = true;
    }
}

目前,对此,我正在制作一个首先设置为false的静态bool,但在第一个断言后切换为true。不确定这是否有效,但它的想法。我不希望每次测试都做到这一点(100个)。

在JUnitCore或Runner类中是否有任何公共函数,方法或方法可以标记它,以便在调用fail()后测试永远不会运行多次?

2 个答案:

答案 0 :(得分:0)

啊,想通了。要做到这一点,我需要实现一种方法来找到失败的测试,然后在@Before区域,完成测试。这是我添加的内容。

@Rule public TestName name = new TestName();
@Before
public void testNonFailedOnly() {
    Assume.assumeTrue(!failedTests.contains(name.getMethodName()));
}
private static List<String> failedTests = new ArrayList<String>(256);

@Rule
public TestWatcher watchman = new TestWatcher() {
    /* (non-Javadoc)
     * @see org.junit.rules.TestWatcher#failed(java.lang.Throwable, org.junit.runner.Description)
     */
    @Override
    protected void failed(Throwable e, Description description) {
        super.failed(e, description);
        failedTests.add(description.getMethodName());
    }
};

它确实增加了大约1.5秒的开销,这很糟糕......但比替代方案更好!

任何人都有关于如何优化这个的想法?我相信开销是来自TestWatcher,不要认为是来自arraylist。

答案 1 :(得分:0)

我使用了每个测试extends的Java类。 在这个类的@Before中,我设置了一个布尔值hasPassed = false; 在每个@Test方法结束时,我设置了此变量hasPassed = true;@AfterMethod中,您可以检查变量。 如果您的测试导致异常,它将不会到达结尾,变量仍然是假的。

相关问题