本篇包含三个部分
第一部分,介绍程序方式运行的步骤
第二部分,介绍注册过滤器,监听器。
第三部分,示例,LauncherConfig配置示例和完整的运行示例
1、步骤
程序方式的执行步骤如下:
第一步,配置启动器,创建LauncherConfig对象。(可选步骤)。
第二步,调用LauncherFactory.openSession方法,开启Session,将LauncherConfig作为参数。
第三步,调用session的getLauncher获取launcher对象。
// 创建session LauncherSession session = LauncherFactory.openSession(config); // 创建Launcher对象 Launcher launcher = session.getLauncher();
第四步,创建LauncherDiscoveryRequest对象,它用于筛选测试案例,首先需要选择包。其次添加过滤条件,这个过程类似于查找文件,首先定位到特定的目录下,然后添加搜索条件。
// 初始化LauncherDiscoveryRequest
LauncherDiscoveryRequest request =
LauncherDiscoveryRequestBuilder.request()
.selectors(
selectPackage("com.example.learn_junit.ch2"),
selectClass(TestType.class)
).filters(
includeClassNamePatterns("Test*")
).build();
第五步,调用launcher的discover方法,获取testPlan,它表示执行计划。(可选步骤)
第六步,调用launcher的register方法,注入监听器。(可选步骤)
第七步,调用launcher的execute方法,执行testPlan或者是request。
2、配置
2.1 过滤器
Filter是用来过滤测试案例的,即创建LauncherDiscoveryRequest中作为filters方法的参数。
过滤器的API结构如下图:

Filter,root接口。
EngineFilter,根据Engine(引擎)的类型,默认情况下只有Junit自己的引擎,除非引入第三方框架实现它的相关引擎。
DiscoveryFilter,发现阶段的过滤条件,它的实现类ClassNameFilter添加类名的过滤条件,PackageNameFilter添加包名的过滤条件。
PostDiscoveryFilter,发现阶段之前,类似于PostXX接口,Post的含义都是相似的。
二者在使用起来无任何区别。
示例如下:它的功能是通过tagName作为条件。
第一步,实现任意一种Filter,示例中为PostDiscoveryFilter
public class TestPostDiscoveryFilter implements PostDiscoveryFilter {
private String tagName;
private TestPostDiscoveryFilter(String name) {
this.tagName = name;
}
public static TestPostDiscoveryFilter includeTagName(String name) {
return new TestPostDiscoveryFilter(name);
}
@Override
public FilterResult apply(TestDescriptor td) {
Set<TestTag> tags = td.getTags();
Optional<TestTag> op = tags.stream().filter((tag) -> tag.getName().contains(tagName)).findAny();
return op.isPresent() ? included(op.get().getName()) : excluded("not included");
}
}
第二步,使用。作为LauncherDiscoveryRequest中filters的参数
filters(includeTagName("testTag"))
运行程序,会发现只有方法上有testTag时,才会运行。
2.2 监听器
原著中的监听器有三个,
LauncherSessionDiscoveryListener,监听session的启动和关闭。
LauncherDiscoveryListener, 用于监听Discovery,engineDiscovery的开始和结束,
launcherDiscoveryStarted,对应Discovery的开始
launcherDiscoveryFinished,对应Discovery的结束
engineDiscoveryStarted,对应engineDiscovery的开始
engineDiscoveryFinished,对应engineDiscovery的结束。
它们的执行顺序是discovery started--->engine discovery started---> engine discovery finished---->discovery finished.
TestExecutionListener, 用于监听测试案例运行的各种场景。比较常用。
使用步骤:
第一步:实现XXListener接口。
public class TestSessionListener implements LauncherSessionListener {
// log object
private static Logger log = LoggerFactory.getLogger(TestSessionListener.class);
@Override
public void launcherSessionOpened(LauncherSession session) {
log.info("call launcher session opened");
}
@Override
public void launcherSessionClosed(LauncherSession session) {
log.info("call launcher session closed");
}
}
第二步,注册XXListener。调用LauncherConfig的enableXXListenerAutoRegistration方法。
示例:以LauncherSessionDiscoveryListener为例,在开启时打印start,结束时打印end。
可以在junit的配置文件中添加junit.platform.execution.listeners.deactivate指定不启用的Listener
3、示例
3.1 LauncherConfig
launcherConfig的方法有两类,enableXX, addXXListener。enable用于设置是否自动开启注册机制,addXXListener添加特定的监听器。
// 创建Launcher Config对象
LauncherConfig config = LauncherConfig.builder()
// 是否开启LauncherDiscoveryListener的自动注册
.enableLauncherDiscoveryListenerAutoRegistration(true)
// 是否开启LauncherSessionListener的自动注册
.enableLauncherSessionListenerAutoRegistration(true)
// 是否开启PostDiscoveryFilter的自动注册
.enablePostDiscoveryFilterAutoRegistration(true)
// 是否开启TestEngine的自动注册
.enableTestEngineAutoRegistration(true)
// 是否开启TestExecutionListener的自动注册
.enableTestExecutionListenerAutoRegistration(true)
// 注册LauncherSessionListener
.addLauncherSessionListeners(new TestSessionListener())
// 注册LauncherDiscoveryListener
.addLauncherDiscoveryListeners(new TestDiscoveryListener())
// 注册PostDiscoveryFilter
.addPostDiscoveryFilters(includeTagName("testTag"))
// .addTestEngines(engines) 通常是junit-jupiter
// 注册TestExecutionListener
.addTestExecutionListeners(new TestExecListener())
.build();
3.2 完整步骤示例
// 创建Launcher Config对象
LauncherConfig config = LauncherConfig.builder().build();
// 创建session
LauncherSession session = LauncherFactory.openSession(config);
// 创建Launcher对象
Launcher launcher = session.getLauncher();
// 初始化LauncherDiscoveryRequest
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
.selectors(selectPackage("com.example.learn_junit.ch2"), selectClass(TestType.class))
.filters(includeClassNamePatterns("Test*"))
.build();
// 获取testPlan
TestPlan testPlan = session.getLauncher().discover(request);
// 执行
launcher.execute(testPlan);
// 获取TestIdentifier
Set<TestIdentifier> tests = testPlan.getRoots();
tests.stream().forEach((testIdentifier) -> {
log.info("current testIdentifier:", testIdentifier.toString());
});
session.close();