我试图在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.selectClasspathRoots
和DiscoverySelectors.selectClasspathResource
作为选择器来提供要搜索测试类的根目录。但是,我无法发现任何测试。 selectClasspathRoots
和selectClasspathResource
的参数是否必须指向包含按包组织的类文件的根目录,或者您是否提供了每个测试类文件的完整路径?
我尝试了以下内容,其中/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
答案 0 :(得分:2)
LauncherDiscoveryRequestBuilder
是否仅在运行此代码的JVM的类路径上自动发现测试?
简短回答:是的,Launcher
只会在运行代码的JVM的类路径上自动发现测试。
通常,TestEngine
实施负责解析选择器,例如您通过ClasspathRootSelector
创建的selectClasspathRoots()
。 Jupiter和Vintage引擎将扫描提供的目录中的.class
文件,然后尝试使用当前线程的上下文ClassLoader
加载它们。如果后一步失败,则会默默忽略该类。
如果要发现尚未在类路径上进行的测试,则需要创建一个新的ClassLoader
并使其成为当前线程的上下文ClassLoader
。 JUnit平台ConsoleLauncher
也是这样做的:
答案 1 :(得分:1)
LauncherDiscoveryRequestBuilder是否仅自动发现测试 运行此代码的JVM的类路径?
不,它可以扫描jvm中的每个类。您必须提供至少一个选择器,但发现是通过类路径上的有组织的文件夹/包结构完成的。
添加过滤器以控制要扫描的类。
这是来自文档。
目前有可能搜索类,方法,所有 包中的类,甚至是类路径中的所有测试。
所有发现选择器都有各种方法来访问测试类。
可能只有更多的上下文,但这是我可以根据文档和运行/调试下面的测试找出的。
输出
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();