1

我现在在一个项目中,它使用 JUnit 作为框架来测试工程数据(参考:最后一个问题创建 Java 报告项目——想使用 JUnit 和 Ant,但不确定如何使用

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

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,但在第一个断言后切换为 true。不确定这是否有效,但它的想法。我不想为每一个测试(其中 100 个)都这样做。

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

4

2 回答 2

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。

于 2013-05-31T00:39:25.863 回答
0

我使用了一个 Java 类,每个测试extends。在@Before这个类中我设置了一个布尔值hasPassed = false; 在每个@Test方法的末尾我设置了这个变量hasPassed = true; 然后@AfterMethod你可以检查这个变量。如果您的测试导致异常,它不会到达终点并且变量仍然是错误的。

于 2013-07-17T08:02:03.210 回答