一.注解变压器

TestNG允许在执行期间修改所有注解的内容。当源代码中的注解大部分是正确的,但是有一些时刻你想要重写他们的值时,这个是非常有用的。

可以使用注解变压器实现。

注解变压器是一个实现了接口的类:

public interface IAnnotationTransformer {  /**   * This method will be invoked by TestNG to give you a chance   * to modify a TestNG annotation read from your test classes.   * You can change the values you need by calling any of the   * setters on the ITest interface.   *   * Note that only one of the three parameters testClass,   * testConstructor and testMethod will be non-null.   *   * @param annotation The annotation that was read from your   * test class.   * @param testClass If the annotation was found on a class, this   * parameter represents this class (null otherwise).   * @param testConstructor If the annotation was found on a constructor,   * this parameter represents this constructor (null otherwise).   * @param testMethod If the annotation was found on a method,   * this parameter represents this method (null otherwise).   */  public void transform(ITest annotation, Class testClass,      Constructor testConstructor, Method testMethod);}

就像所有其他的TestNG监听者,你可以在命令行或使用ant来定义这个类:

java org.testng.TestNG -listener MyTransformer testng.xml

或编程式方式:

TestNG tng = new TestNG();tng.setAnnotationTransformer(new MyTransformer());// ...

当调用transform()方法时,可以调用ITest测试参数上任何设置方法来修改其值,然后再继续测试。

例如,下面是一个如何重写属性的调用次数的例子,但是仅在测试类的测试方法的invoke()上:

public class MyTransformer implements IAnnotationTransformer {  public void transform(ITest annotation, Class testClass,      Constructor testConstructor, Method testMethod){    if ("invoke".equals(testMethod.getName())) {      annotation.setInvocationCount(5);    }  }}

IAnnotationTransfomer只允许修改@Test注解,如果需要修改其他TestNG注解(配置注解,如@Factory或@DataProvider),需要使用IAnnotationTransformer2。

二.方法拦截器

一旦TestNG计算出测试方法的调用顺序,这些方法将被分成两组:

1)方法按照顺序执行,这些都是有依赖项或被依赖项的所有测试方法,这些测试方法将会按照特定的顺序执行。

2)方法没有特定的执行顺序,这些都是不属于第一类的方法。这些测试方法的运行顺序是随机的,每次运行时的顺序都可能会不同(默认情况下,TestNG将按照类对测试方法进行分组)。

为了更好的控制第二类方法的执行,TestNG定义了下面这些接口:

public interface IMethodInterceptor {  List intercept(List methods, ITestContext context);}

参数中传递的方法列表是可以按照任何顺序运行的所有方法。拦截器将会返回一个类型的IMethodInstance列表,可以是以下任意一种:

1)一个更小的IMethodInstance对象列表。

2)一个更大的IMethodInstance对象列表。

3)一旦已定义了拦截器,就将它传递给TestNG作为一个监听者,例如:

java -classpath "testng-jdk15.jar:test/build" org.testng.TestNG -listener test.methodinterceptors.NullMethodInterceptor

-testclass test.methodinterceptors.FooTest

有关ant的有效语法,可以参考ant文档中的listeners属性。

例如,下面是一个方法拦截器,它将对方法重新排序,以便始终首先运行属于组“fast”的测试方法:

public Listintercept(List methods, ITestContext context) {  List result = new ArrayList();  for (IMethodInstance m : methods) {    Test test = m.getMethod().getConstructorOrMethod().getAnnotation(Test.class);    Set groups = new HashSet();    for (String group : test.groups()) {      groups.add(group);    }    if (groups.contains("fast")) {      result.add(0, m);    }    else {      result.add(m);    }  }  return result;}

extjs 方法执行顺序_TestNG之注解变压器amp;方法拦截器相关推荐

  1. vue 请求时方法执行顺序问题,异步请求无法同时处理多个接口,使用同步顺序执行:async/await使用

    vue 请求时方法执行顺序问题,异步请求无法同时处理多个接口,使用同步顺序执行:async/await使用 异步解决方案:async/await 多个await,同步拿到数据再处理 多个接口处理拿到数 ...

  2. extjs 方法执行顺序_百战程序员:方法论

    作为一名经历过.Net Winform桌面应用程序开发,Java + Spring + mybatis管理系统开发,PHP + ZendFrameWork/Laravel + MySql电商系统开发, ...

  3. extjs 方法执行顺序_透析Extjs的Ext.js源码(二)能在定义时就能执行的方法的写法 function(){...}...

    /** * 第二部分:能在定义时就能执行的方法的写法 function(){...}(); */ /** * 一.普通的方法的定义与执行 */ // 1-1.普通的方法定义,不带返回值的情况 fun ...

  4. testng执行参数_TestNG中注解使用 笔记

    一.Before和After类注解 1.@BeforeSuite.@AfterSuite 2.@BeforeTest.@AfterTest 3.@BeforeClass.@AfterClass 4.@ ...

  5. js设置ajax执行顺序,2018-03-10fiddler替换js、js的ajax方法执行顺序

    一.fiddler的替换js 替换js fiddler能够将js替换为指定的js文件,方便调试也许还能做更多的事情,在js中可以配置好假想返回的数据,更加方便的调试. 二.js的调用和有ajax函数时 ...

  6. vue组件中的方法执行顺序是怎么样的?data和props执行顺序

    比如props,methods,data,watch,computed等方法的顺序是怎么样的? 在vue的源码中的initState初始化方法中就有执行的一个顺序 见源码 https://github ...

  7. python多个装饰器执行顺序_Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子:def decorator_a(func): print 'Get in decorator_a' def i ...

  8. python方法解析顺序_浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  9. extjs 方法执行顺序_(软件工程)非结构化程序变为结构化程序的三种方法

    适用于软工考研.张海藩软件工程导论中结构化中结构化非结构化看完这篇文章应该就懂了. 结构化程序的思想 程序由顺序.选择和循环这三种基本结构组成.且它们都具有以下特点:只有一个入口;只有一个出口;结构中 ...

最新文章

  1. 算法-----礼物的最大价值
  2. java singleton 多线程_Java创建线程安全的单例singleton
  3. WebX.0:Web1.0
  4. SAP UI5 busy dialog - SVG
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的客户关系CRM系统
  6. linux6.5配置ssh,CentOS 6.5 配置 SSH 免密登录
  7. 是谁榨干了 Android 设备的电量和流量?!| 极客头条
  8. 浪漫桃心的Android表白程序
  9. 电脑硬件知识学习_计算机的发展史,你对硬件知识了解多少,带大家了解一下....
  10. 00110_Class类
  11. 中国搜索20年:巨头百度的兴衰密码
  12. 光耦w314的各引脚图_常用光耦型号代换大全
  13. 如何消除win10文件右上角的蓝色箭头
  14. HFDS 内部工作机制
  15. Linux 普通用户和root用户任意切换
  16. 时序模型:长短期记忆网络(LSTM)
  17. node.js 最全命令行配置操作win10
  18. ios13全选手势_iOS13大揭秘:深色模式、多任务、新手势等
  19. Win2003集群简介
  20. 360杀毒属于计算机操作系统吗,360杀毒软件 统一操作系统UOS,保护您的电脑安全...

热门文章

  1. 8月读书分享-《执行力是训练出来的》
  2. Tensorflow深度学习应用(进阶篇)
  3. centos 7 网络设置与图像化界面下载
  4. 【剑指offer】面试题36:二叉搜索树与双向链表(java)
  5. server sql top速度变慢解决方案_SQL Server数据库查询速度慢的原因和解决方法
  6. mysql install安装报错_mysql安装报错
  7. java中位数_java 计算中位数方法
  8. python创建长度为n的数组_在Python中建立N维数组并赋初值
  9. c语言中有关main的问题,c语言小问题
  10. cpu开核_新锐龙让AMD重返巅峰,但逆袭的50年里这些CPU也不应忘记