后端——框架——测试框架——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) {
		Set tags = 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
Set tests = testPlan.getRoots();
tests.stream().forEach((testIdentifier) -> {
	log.info("current testIdentifier:", testIdentifier.toString());
});
session.close();

相关