zoukankan      html  css  js  c++  java
  • 后端——框架——测试框架——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<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();
  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/rain144576/p/15580584.html
Copyright © 2011-2022 走看看