[英]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的实现。 它必须由实现Filterable的Runner实例化。 过滤器通过测试树递归地应用。 因此,您只需要在基本套件中一次应用该过滤器。
您需要扩展运行器,并在构造函数中应用过滤器。 为了使事情变得更加灵活,您可以配置应与注释一起应用的过滤器。
我有相同的要求,并且效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.