JUNIT有条件的测试可能吗?

时间:2013-04-16 11:35:27

标签: java junit

我有一系列数据,每个数据都包含info_A和info_B。我想:

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

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

以下解决方案工作:

  • 如果我使用Assume.assumeTrue(conditon),我可以Ignore进行测试,但是测试中传递的仍然显示
  • 这样做:
    Result result = JUnitCore.runClasses(TestStep1.class);
    导致正确的结果,但JUnit树构建。
  • 使用@Catagories还会显示失败的测试,这也是我不想要的。

2 个答案:

答案 0 :(得分:3)

您可以use Assume有条件地开启/关闭测试:

  

一组方法,用于说明关于测试有意义的条件的假设。失败的假设并不意味着代码被破坏,而是测试没有提供有用的信息。

答案 1 :(得分:1)

您可以使用JUnit规则执行此操作。

有一篇完整的博客文章专门针对您的问题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;

    请记住,字段必须是公开的。
  3. 就是这样。祝你好运 - 正如我所说,你可能不得不破解一下,但我相信在博客文章中有相当多的解释。否则,应该有关于互联网的其他信息(或在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();
                    }
                }
            };
        }
    }