4

我需要读取一个文本文件,其中包含所有测试方法列表的是/否值,并仅为 TestCase 类选择“是”标记的测试方法,并在 Junit 中执行。

因此,我编写了一个脚本来读取文件并将其分组到map< TestCaseName,ArrayList_ofEnabledTestMethods >中。要运行它,我发现一个选项是使用Assume.assumeTrue()

但我想尝试其他方式......而不是在每个测试方法之前写额外的行,所以我尝试编写一个自定义运行器(扩展ParentRunner的ABCSuite)并计划在我的 TestSuite 文件中使用它,如下所示:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(ABCSuite.class)
@Suite.SuiteClasses({TestCalc.class})
public class BatTest{

}

这里 TestCalc.class 包含所有测试方法,其中一些在前面提到的文本文件中标记为“是”。

请让我知道如何使用扩展ParentRunner 类/Junit 库 来实现这一点。如果有任何好的教程或之前解决过这个问题的任何链接,请..分享

4

2 回答 2

4

您可以通过扩展BlockJUnit4ClassRunner来做到这一点:

public class FilterRunner extends BlockJUnit4ClassRunner {
  private List<String> testsToRun = Arrays.asList(new String[] { "test1" });

  public FilterRunner(Class<?> klass) throws InitializationError {
    super(klass);
  }

  @Override
  protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
    Description description= describeChild(method);
    if (method.getAnnotation(Ignore.class) != null || !testsToRun.contains(method.getName())) {
      notifier.fireTestIgnored(description);
    } else {
      runLeaf(methodBlock(method), description, notifier);
    }
  }
}

你可以随意填写testsToRun。以上会将其他测试标记为已忽略。你像这样使用它:

@RunWith(Suite.class)
@SuiteClasses({Class1Test.class})
public class TestSuite {
}

@RunWith(FilterRunner.class)
public class Class1Test {
  @Test
  public void test1() {
    System.out.println("test1");
  }

  @Test
  public void test2() {
    System.out.println("test2");
  }
}

这会产生以下输出:

test1

如果您不想将 @FilterRunner 添加到每个测试类,请查看我对如何在套件中定义 JUnit 方法规则的回答?.

于 2012-08-10T09:16:01.000 回答
2

JUnit 的实现方式是Filter的实现。它必须由实现Filterable的Runner实例化。过滤器通过测试树递归应用。因此,您只需在基本套件中应用该过滤器一次。

您需要扩展一个跑步者并在构造函数中应用过滤器。为了使事情更灵活,您可以配置应与注释一起应用的过滤器。

我有同样的要求,而且效果很好。

于 2013-02-13T18:10:23.333 回答