2013-04-16 56 views
3

我有一系列数据,每个数据都包含info_A和info_B。我想:JUNIT有条件测试可能吗?

if(info_A) { 
    run Test A 
} else if(!info_A) { 
    run Test B 
} 

在JUnit GUI树中显示只有测试实际运行是非常重要的。我怎样才能做到这一点?

以下解决方案做工作:

  • 如果我使用Assume.assumeTrue(conditon),我可以Ignore测试,但随后它是作为测试通过仍然显示
  • 这样做:
    Result result = JUnitCore.runClasses(TestStep1.class);
    导致正确的结果,但JUnit的树建成。
  • 使用@Catagories还显示失败测试,这也是我不想要的。
+0

它看起来像这个[答案](http://stackoverflow.com/a/1689261/376390)也可能是你的问题的解决方案。 – Marco

回答

3

可以use Assume开启测试/关条件:

一组数据来描述有关该测试是有意义的条件假设有用的方法。一个失败的假设并不意味着代码被破坏,但是测试没有提供有用的信息。

1

您可以使用JUnit Rules来做到这一点。

有专用精确您的问题here一个整体的博客文章,但总之,你执行以下操作:

  1. 创建一个实现org.junit.rules.TestRule接口的类。该接口包含以下方法:
    Statement apply(Statement base, Description description);
    base的说法实际上是你的测试,您可以通过调用base.execute()运行 - 好,apply()方法的实际返回Statement匿名实例将这样做。在您的匿名Statement实例中,您将添加逻辑以确定是否应该运行测试。请参阅下面的TestRule实现的示例,除了执行测试之外,它不会执行任何操作 - 是的,它不是特别直接。
  2. 一旦你创建你的TestRule实现,那么你就需要将以下行添加到您的JUnit测试类:
    @Rule
    public MyTestRuleImpl conditionalTests;

    记住,现场必须是公开的。

就是这样。祝你好运 - 正如我所说的,你可能不得不破解一些,但我相信在博客文章中有相当数量的解释。否则,应该有互联网上的其他信息(或JUnit源代码)。

下面是TestRule实现的一个简单示例,它不执行任何操作。

public abstract class SimpleRule implements TestRule { 
    public Statement apply(final Statement base, final Description description) { 
     return new Statement() { 
      public void evaluate() throws Throwable { 
       try { 
        base.evaluate(); 
       } catch (Throwable t) { 
        t.printStackTrace(); 
       } 
      } 
     }; 
    } 
}