后端——框架——测试框架——junit——运行(程序方式)
本篇包含三个部分
第一部分,介绍程序方式运行的步骤
第二部分,介绍注册过滤器,监听器。
第三部分,示例,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) { Settags = td.getTags(); Optional 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 Settests = testPlan.getRoots(); tests.stream().forEach((testIdentifier) -> { log.info("current testIdentifier:", testIdentifier.toString()); }); session.close();