TestNG+Factory,自定义方法的执行顺序

最近使用TestNG有一个需求,希望在配合使用factory执行测试时,factory生成测试数据的执行顺序与生成时保持一致。

在未做任何定制时,执行顺序是随机的,如果想要一致的顺序,就得额外配置拦截器:IMethodInterceptor

具体实现方法, 如下:

工厂类:

@Listeners(ExampleInterceptor.class) // 通过拦截器重新给方法排序, 否则是乱序的
public class FactoryTest_Order {

    @Factory
    public Object[] createInstance() {

        return new Object[]{
                new TestData().setName("Zidane").setOrder(1),
                new TestData().setName("Eva").setOrder(2),
                new TestData().setName("Jane").setOrder(3),
                new TestData().setName("Jack").setOrder(4)
        };
    }
}

测试类:

 1 public class TestData {
 2
 3     private String name;
 4     private int order;
 5
 6     public String getName() {
 7         return name;
 8     }
 9
10     public TestData setName(String name) {
11         this.name = name;
12         return this;
13     }
14
15     public int getOrder() {
16         return order;
17     }
18
19     public TestData setOrder(int order) {
20         this.order = order;
21         return this;
22     }
23
24     @Test
25     public void test(){
26         System.out.println("order="+order);
27         System.out.println("Name="+name);
28     }
29 }

拦截器(关键):

public class MethodInterceptor implements IMethodInterceptor {
    @Override
    public List<IMethodInstance> intercept(List<IMethodInstance> list, ITestContext iTestContext) {

        Map<String,IMethodInstance> orders = new TreeMap<>(); // 有序map

        for (IMethodInstance instance : list) {
            TestData testData = (TestData) instance.getInstance();
            orders.put(String.valueOf(testData.getOrder()), instance);
        }

        List<IMethodInstance> orderList = new ArrayList<>(list.size());
        for (String order : orders.keySet()) { // 重新排序
            IMethodInstance test = orders.get(order);
            orderList.add(test);
        }
        return orderList; // TestNG会按这个返回的List内实例的顺序来执行
    }
}

参考:

一开始在墙内怎么查都查不到可以排序的方法,直到FQgoogle……

https://stackoverflow.com/questions/10127280/make-testng-factory-test-cases-run-in-same-order-as-provided

https://www.ibm.com/developerworks/cn/opensource/os-cn-testinglistener/index.html

原文地址:https://www.cnblogs.com/ezidane/p/8278024.html

时间: 2024-08-05 10:15:31

TestNG+Factory,自定义方法的执行顺序的相关文章

TestNG学习-002-annotaton 注解概述及其执行顺序

此文主要讲述用 TestNG 基础的 annotation (注解)知识,及其执行的顺序,并通过一个 TestNG 简单的实例演示 annotation 的执行顺序. 希望能对初学 TestNG 测试框架的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激! 言归正传,以下为 TestNG 常用的 annotation 及其释义,敬请参阅. @BeforeSuite:被此注解的方法将在所有测试运行之前运行该方法. @AfterSuite: 被此注解的方法将在所有测试运行之后运行该方法. @Bef

TestNG基础教程 - TestNG.xml中的测试级别和常用注解执行顺序

根据testng.xml 文件配置, 测试级别为suite -> test -> class -> methods. test 对应testng.xml 中的test 标签, 而不是测试类里的@Test. 测试类里的@Test 对应 testng.xml中的methods. 创建TestCase 如TC3 运行效果 所以在使用@BeforeSuite,@BeforeTest,@BeforeClass,@BeforeMethod 等标签时, 它们的实际执行顺序也是suite -> t

testNG注解的使用和执行顺序

testNG注解 本文主要包含testNG注解的使用方法和执行顺序两部分. 一.使用方法 testNG的注解的使用,主要用于方法上 @符号标示,@Test.@afterMethod.@BeforeClass.@BeforeMethod 二.执行顺序 单个类: 根据以下代码执行的结果,我们可以看出来,testNG的执行顺序是 @BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}

spring bean中构造函数,afterPropertiesSet和init-method的执行顺序

http://blog.csdn.net/super_ccc/article/details/50728529 1.xml文件 [html] view plain copy print? <bean id="aaa" class="com.dingwang.Test.Aaa" init-method="init"> <constructor-arg name="name" value="ddd&qu

python unittest控制用例的执行顺序

为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的动态产出值.这样就必须先执行B方法.testng的test方法有dependson属性来制定方法的依赖.但是向python的unittet框架,他类似于junit,没有依赖测试的功能.unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.如果想要

JMeter学习-005-JMeter 主要组件概要介绍及执行顺序

本文将对 JMeter 主要组件(主要涉及 Threads(Users).Test Fragment.逻辑控制器.配置元件.定时器.前置处理器.Sampler.后置处理器.断言.监听器 十大组件)进行概要介绍,详细使用方法会在后续文章中陆续介绍,敬请惠顾参阅.组件如下所示: 零.测试计划 测试计划是测试的起点,同时也是其他所有组件的容器. 一.Threads(Users)-线程组 每个测试需求的必备组件,是用来模拟用户并发的组件.JMeter 的每个任务都是用线程来处理的.线程组界面如下所示:

解说asp.net core MVC 过滤器的执行顺序

asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤器的触发顺序. 过滤器可注册范围 全局:将作用于所有请求的action controller:将作用于这个controller下的所有action action:作用于单个action 定义过滤器 全局 public class GlobalActionFilter : IAsyncActionFi

在Spring Bean的生命周期中各方法的执行顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种: 通过实现 InitializingBean 接口来定制初始化之后的操作方法: 通过实现DisposableBean 接口来定制销毁之前的操作方法: 通过元素的 init-method属性指定初始化之后调用的操作方法: 通过元素的 destroy-method属性指定销毁之前调用的操作方法: 在指定方法上加上 @PostConstruct

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[