通过LauncherDiscoveryRequest

时间:2016-12-29 19:58:03

标签: java junit5

我试图在LauncherDiscoveryRequest described in the user guide的帮助下发现JUnit 5测试。我使用的代码如下所示:

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
    .filters(includeClassNamePatterns(".*"))
    .build();

TestPlan plan = LauncherFactory.create().discover(request);

for (TestIdentifier root : plan.getRoots()) {
    System.out.println("Root: " + root.toString());

    for (TestIdentifier test : plan.getChildren(root)) {
        System.out.println("Found test: " + test.toString());
    }
}

LauncherDiscoveryRequestBuilder是否仅在运行此代码的JVM的类路径上自动发现测试?我尝试使用方法DiscoverySelectors.selectClasspathRootsDiscoverySelectors.selectClasspathResource作为选择器来提供要搜索测试类的根目录。但是,我无法发现任何测试。 selectClasspathRootsselectClasspathResource的参数是否必须指向包含按包组织的类文件的根目录,或者您是否提供了每个测试类文件的完整路径?

我尝试了以下内容,其中/some/dir表示包含测试类文件的根目录:

File classesDir = new File("/some/dir");
LauncherDiscoveryRequestBuilder.request()
     .selectors(selectClasspathRoots(Collections.singleton(Paths.get(classesDir.toURI()))))
     .build();

我查看了LauncherDiscoveryRequestBuilderTests.java,但在弄清楚我的示例代码无法正常工作时,它并不是非常有用。我如何最好地诊断问题?

我使用以下依赖项:

  • org.junit.platform:junit-platform-engine:1.0.0-M3
  • org.junit.platform:junit-platform-launcher:1.0.0-M3

2 个答案:

答案 0 :(得分:2)

  

LauncherDiscoveryRequestBuilder是否仅在运行此代码的JVM的类路径上自动发现测试?

简短回答:是的,Launcher只会在运行代码的JVM的类路径上自动发现测试。

通常,TestEngine实施负责解析选择器,例如您通过ClasspathRootSelector创建的selectClasspathRoots()。 Jupiter和Vintage引擎将扫描提供的目录中的.class文件,然后尝试使用当前线程的上下文ClassLoader加载它们。如果后一步失败,则会默默忽略该类。

如果要发现尚未在类路径上进行的测试,则需要创建一个新的ClassLoader并使其成为当前线程的上下文ClassLoader。 JUnit平台ConsoleLauncher也是这样做的:

  1. Create custom ClassLoader
  2. Invoke Launcher with replaced context ClassLoader

答案 1 :(得分:1)

LauncherDiscoveryRequestBuilder是否仅自动发现测试 运行此代码的JVM的类路径?

不,它可以扫描jvm中的每个类。您必须提供至少一个选择器,但发现是通过类路径上的有组织的文件夹/包结构完成的。

添加过滤器以控制要扫描的类。

这是来自文档。

  

目前有可能搜索类,方法,所有   包中的类,甚至是类路径中的所有测试。

所有发现选择器都有各种方法来访问测试类。

可能只有更多的上下文,但这是我可以根据文档和运行/调试下面的测试找出的。

ClasspathScannerTests

输出

Root: TestIdentifier [uniqueId = '[engine:junit-jupiter]', parentId = null, displayName = 'JUnit Jupiter', source = null, tags = [], test = false, container = true]
Found test: TestIdentifier [uniqueId = '[engine:junit-jupiter]/[class:discover.suite.Junit5TestCase]', parentId = '[engine:junit-jupiter]', displayName = 'Junit5TestCase', source = ClassSource [className = 'discover.suite.Junit5TestCase', filePosition = null], tags = [], test = false, container = true]

样本测试类

package discover.suite;

import org.junit.jupiter.api.Test;

public class Junit5TestCase {

    @Test
    public void junitMethod() {
    }

}

以下是使用不同选择器的几个示例。

    //By classpath root
    File classesDir = new File("C:\\Users\\me\\Junit5\\target\\test-classes");

    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
            .selectors(selectClasspathRoots(Collections.singleton(Paths.get(classesDir.toURI()))))
            .filters(includeClassNamePatterns(".*"))
            .build();

    //By package
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
            .selectors(selectPackage("discover.suite"))
            .filters(includeClassNamePatterns(".*"))
            .build();

    //By Class
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
            .selectors(selectClass(Junit5TestCase.class))
            .filters(includeClassNamePatterns(".*"))
            .build();

    //By Method
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
            .selectors(selectMethod(Junit5TestCase.class, "junitMethod"))
            .filters(includeClassNamePatterns(".*"))
            .build();