繁体   English   中英

扩展Junit ParentRunner类以过滤测试方法

[英]Extending Junit ParentRunner Class to filter test methods

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

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

但是我想尝试一些otherway ...而不是每个测试方法之前书面方式多余的线条,于是,我就写了一个可定制的运行(ABCSuite延伸ParentRunner),并计划使用它在我的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库来实现此目的。 如果有任何好的教程或链接解决此问题,请先..分享

您可以通过扩展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方法规则的回答

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

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

我有相同的要求,并且效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM