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();
  • 相关阅读:
    AutoLayout相关
    Xcode
    ios 如何更改包名
    xcode 没有 iphone 模拟器
    使用asi请求的步骤
    caseInsensitiveCompare : 不区分大小写的 字符串比较
    封装的网路请求类
    石材网..搜索时无法正常返回数据 转码问题 (URL中用到的编码解码问题)
    谈一下我对于指针的理解
    IOS面试题--004
  • 原文地址:https://www.cnblogs.com/rain144576/p/15580584.html
Copyright © 2011-2022 走看看