2013-05-30 98 views
1

我的一个项目,现在正在使用JUnit作为一个框架来测试工程数据(参考:最后一个问题Creating a Java reporting project -- would like to use JUnit and Ant but not sure how)不要重复运行多个JUnit测试 - 如果故障发生一次

由于图片(ERR一个代码块),讲述了一个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在第一,但第一个断言后切换到真正的一个静态布尔。不知道这是否有效,但它的想法。我不想为每一个测试做这个(100个)。

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

+0

这里只是一个评论,你可能想看看@Parameterized(https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/runners/Parameterized.java )。这可能比多次运行JUnitCore更好。 –

回答

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,不要认为它来自数组列表。

0

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

相关问题