如何将CategoryFilter传递给JUnitcore?

时间:2016-06-09 12:29:13

标签: java testing junit junit4 junit-runner

如何动态构建类别过滤器并调用JUnit核心来运行我的测试?我尝试使用main方法构建一个简单的类,可以调用它来运行我的测试,但我确定这是否干净。

我们的想法是允许包含和排除作为命令行参数传递,并使用它来构建CategoryFilter。我花了很多时间在这上面,还没想出如何将过滤器传递给JunitCore。

public class SingleJUnitTestRunner {

    public static void main(String... args) throws ClassNotFoundException {
        System.out.println("Running tests");
        System.out.println(Arrays.asList(args));

        synchronized (Play.class) {
            if (!Play.started) {
                Play.init(new File("."), "test");
                Play.start();
            }
        }

        CategoryFilter catfil = Categories.CategoryFilter.include(Play.classloader.loadClass("testutils.SlowTests"));
        List<Filter> filters = new ArrayList<Filter>();
        filters.add(catfil);

        TestSuite suite = new TestSuite();

        for (Class tests : Play.classloader.getAnnotatedClasses(Category.class)) {
            if (catfil.shouldRun(Description.createSuiteDescription(tests))) {
                suite.addTest(new JUnit4TestAdapter(tests));
                System.out.println("With " + tests.getName());
            }
        }

        Result result = new JUnitCore().run(suite);
        System.out.println(result.getRunCount());
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

1 个答案:

答案 0 :(得分:3)

从JUnit 4.12开始,你可以这样做:

java org.junit.runner.JUnitCore \
    --filter=org.junit.experimental.categories.IncludeCategories=testutils.SlowTests \
    com.example.ExampleTestSuite

有关详细信息,请参阅release notes

如果您想以编程方式执行此操作,请使用Request.filterWith()

Request request = ...
Categories.CategoryFilter filter =
    Categories.CategoryFilter.include(
        testutils.SlowTests.class); 
request = request.filterWith(filter);
Result result = JUnitCore.run(request);