JUnit Platform Launcher API

JUnit 5最突出的目标之一是使JUnit与其编程客户端(构建工具和ide)之间的接口更加强大和稳定。 目的是将发现和执行测试的内部内容与所有必需的外部过滤和配置分离开来。

JUnit 5引入了启动器的概念,可以用来发现、过滤和执行测试。此外,第三方测试库——如Spock、Cucumber和FitNesse——可以通过提供自定义测试引擎插入JUnit平台的启动基础设施。

发射API位于junit-platform-launcher模块中。

启动API的一个示例使用者是junit-platform-console项目中的ConsoleLauncher

发现测试类

将测试发现作为平台本身的一个专用特性引入,将(希望)释放ide并构建工具,使其摆脱过去识别测试类和测试方法所必须经历的大多数困难。

import static org.junit.platform.engine.discovery.ClassNameFilter.includeClassNamePatterns;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;

import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.TestExecutionListener;
import org.junit.platform.launcher.TestPlan;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
    .selectors(
        selectPackage("com.example.mytests"),
        selectClass(MyTestClass.class)
    )
    .filters(
        includeClassNamePatterns(".*Tests")
    )
    .build();

Launcher launcher = LauncherFactory.create();

TestPlan testPlan = launcher.discover(request);

目前有可能在包中选择类、方法和所有类,甚至在类路径中搜索所有的测试。发现发生在所有参与的测试引擎。

最终的测试计划是对所有引擎、类和测试方法的分层(和只读)描述,它们符合LauncherDiscoveryRequest。

客户端可以遍历树,检索关于节点的细节,并获取到原始源的链接(如类、方法或文件位置)。测试计划中的每个节点都有一个惟一的ID,可以用来调用特定的测试或测试组。

执行测试类

要执行测试,客户端可以使用与发现阶段相同的LauncherDiscoveryRequest,或者创建一个新的请求。可以通过在启动器上注册一个或多个TestExecutionListener实现来实现测试进度和报告,如下面的示例所示。

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
    .selectors(
        selectPackage("com.example.mytests"),
        selectClass(MyTestClass.class)
    )
    .filters(
        includeClassNamePatterns(".*Tests")
    )
    .build();

Launcher launcher = LauncherFactory.create();

// Register a listener of your choice
TestExecutionListener listener = new SummaryGeneratingListener();
launcher.registerTestExecutionListeners(listener);

launcher.execute(request);

execute()方法没有返回值,但是可以很容易地使用侦听器在自己的对象中聚合最终结果。

例如,请参见 SummaryGeneratingListener