3

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

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 也会显示失败的测试,这也是我不想要的。
4

2 回答 2

3

您可以使用Assume有条件地打开/关闭测试:

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

于 2013-04-16T11:43:26.993 回答
1

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

这里有一整篇博客文章专门针对您的问题但简而言之,您可以执行以下操作:

  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();
                }
            }
        };
    }
}
于 2013-04-16T11:53:17.103 回答