TestNG中的监听

1.使用监听的目的:

Testng虽然提供了不少强大的功能和灵活的选项,但不能解决所有的问题,使用监听器就是用来定制额外的功能以满足我们的需求的;

2.监听器具体实现:

监听器实际上是一些预定义的java接口,用户创建这些接口的实现类(即implements某监听接口,并实现里面的方法),并加入到testng中,testng便会在运行的不同时刻调用这些类中你自定义实现的接口方法,从而实现定制额外的功能;

3.监听器的种类:

3.1 IAnnotationTransformer(修改@Test注释属性)

大多数情况下,在运行时我们不需要改动源代码中定义的注释,但有时需要这样做。这时,我们就需要使用 IAnnotationTransformer 监听器。IAnnotationTransformer 只能用来修改 @Test 注释,如果需要修改其他 TestNG 的注释(比如,@DataProvider, @Factory 以及 @Configuration),需要使用 IAnnotationTransformer2 监听器。IAnnotationTransformer 要求实现 transform 方法,其方法签名如下:

void transform(ITest annotation, Class testClass, Constructor testConstructor, Method testMethod);

annotation 代表就是为 testMethod 定义的 @Test 注释。调用其方法可以更改 @Test 注释属性。例如,下面的代码在运行时将属性 enabled 改为 false 从而禁用了当前的测试方法。

annotation.setEnabled(false);

3.2 IAnnotationTransformer2(修改其他注解的注释属性)

用来修改除 @Test 以外的 TestNG 的注释,例如:@DataProvider 以及 @Factory 等注解的注释属性能够通过该监听器修改;

void transform(IDataProviderAnnotation annotation, java.lang.reflect.Method method)

void transform(IFactoryAnnotation annotation, java.lang.reflect.Method method)

3.3 IHookable(类似与面向切面编程(AOP)中的 Around Advice 的功能),可忽略

3.4 IInvokedMethodListener(类似与面向切面编程(AOP)中的 Before Advice 和 After Advice 的功能),可忽略

3.5 IMethodInterceptor控制列表执行循序)

TestNG 启动之后,所有的测试方法分成两类:

一类是顺序运行的测试方法;(dependsOnGroups 和 dependsOnMethods)

一类是没有特定运行顺序的测试方法。(运行顺序是随机,每次运行的顺序都可能不同)

IMethodInterceptor 监听器用来对第二类测试有更大的控制权,对列表重新排序,甚至增加或者减少测试方法;

java.util.List<IMethodInstance> intercept(java.util.List<IMethodInstance> methods, ITestContext context)

实现的intercept 方法会在所有测试方法被分类后以及所有测试方法被执行前被调用。所有的测试方法将按照 intercept 返回值列表中的顺序被执行。

3.6 IReporter(自定义测试报表)

IReporter 监听器用来自定义测试报表;

void generateReport(java.util.List<XmlSuite> xmlSuites, java.util.List<ISuite> suites, java.lang.String outputDirectory)

generateReport方法会在所有测试方法执行结束后被调用,通过遍历 xmlSuites 和 suites 能够获取所有测试方法的信息以及测试结果。outputDirectory 是默认的测试报表生成路径,当然你可以指定其他路径生成报表

3.7 ISuiteListener(suite的AOP),可忽略;

3.8 ITestListener(简便自定义测试方法执行后的后续行为)

用来在测试方法执行成功、失败或者跳过时指定不同后续行为;
IInvokedMethodListener 也可以实现,但ITestListener更简便;

void onTestFailure(ITestResult result)

void onTestSkipped(ITestResult result)

void onTestSuccess(ITestResult result)

另外:TestListenerAdapter 已经实现 ITestListener,并且提供了一些有用的方法,比如分别获取所有成功失败跳过三种测试结果的测试方法的方法,并且 ITestListner 中有很多方法而 TestListenerAdapter 已给出了默认实现。因此,继承 TestListenerAdapter 后,便只需关注需要修改的方法。

4.监听器使用:

4.1 在 testng.xml 中使用 TestNG 监听器

<listeners>

<listener class-name="api.listeners.AutoTestListener"></listener>

<listener class-name="api.listeners.RetryListener"></listener>

<listener class-name="api.listeners.ExtentTestNGIReporterListener"/>

</listeners>

4.2在源代码中使用 TestNG 监听器

通过 @Listeners 注释,可以直接在 Java 源代码中添加 TestNG 监听器

@Listeners(RetryListener.class)

public class SampleTest {

@Test()

public void test1() {

sleep(6000);

System.out.println("test1");

}

*注意:

1)在 @Listeners 中添加监听器跟在 testng.xml 添加监听器一样,将被应用到整个测试套件中的测试方法。如果需要控制监听器的应用范围(比如添加的监听器仅使用于某些测试测试类或者某些测试方法),则必须在监听器类中编写适当的判断逻辑。

2)在 @Listeners 中添加监听器跟在 testng.xml 添加监听器的不同之处在于,它不能添加 IAnnotationTransformer 和 IAnnotationTransformer2 监听器。原因是因为这两种监听器必须在更早的阶段添加到 TestNG 中才能实施修改注释的操作,所以它们只能在 testng.xml 添加。

3)TestNG 对添加的监听器不做去重判断。因此,如果 testng.xml 和源代码中添加了相同的监听器,该监听器的方法会被调用两次。有关这一点,大家可以通过运行本文附带的示例代码包中 testng.xml 验证。因此,切记,不要通过多种方式重复添加监听器。

5.监听举例:

5.1 TestCaseListener实现ITestListener接口,并重写onTestStart、onTestSuccess和onTestFailure方法;

package com.testngdemo;

import org.testng.Assert;

import org.testng.ITestContext;

import org.testng.ITestListener;

import org.testng.ITestResult;

import org.testng.annotations.*;

public class TestCaseListener implements ITestListener {

@Override

public void onFinish(ITestContext arg0) {

// TODO Auto-generated method stub

}

@Override

public void onStart(ITestContext arg0) {

// TODO Auto-generated method stub

}

@Override

public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {

// TODO Auto-generated method stub

}

@Override

public void onTestFailure(ITestResult iTestResult) {     //重写onTestFailure方法

System.out.println("用例执行失败,启动截图:");

System.out.println(iTestResult.toString());

}

@Override

public void onTestSkipped(ITestResult arg0) {

// TODO Auto-generated method stub

}

@Override

public void onTestStart(ITestResult iTestResult) {       //重写onTestStart方法

System.out.println("用例启动:");

}

@Override

public void onTestSuccess(ITestResult iTestResult) {      //重写onTestSuccess方法

System.out.println("用例执行成功:");

}

}

5.2 使用TestRetry类进行测试(使用@Listeners在代码中添加监听)

package com.testngdemo;

import org.testng.Assert;

import org.testng.annotations.Listeners;

import org.testng.annotations.Test;

@Listeners(TestCaseListener.class)

public class TestRetry {

@Test(priority = 1)

public void printMessage() {

Assert.assertEquals(11, 11);

}

@Test(priority = 2)

public void pintErrorMessage() {

Assert.assertEquals(11, 12,"断言错误");

}

}

5.3也可使用xml的形式添加监听,如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1">

<listeners>

<listener class-name="com.testngdemo.TestCaseListener"/>

</listeners>

<test name="test1">

<classes>

<class name="com.testngdemo.TestRetry"/>

</classes>

</test>

</suite>

5.4运行结果如下:

TestNG教程三:TestNG中的监听相关推荐

  1. Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

    Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 文章目录 Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 前言 一.数据库的安装前准备,前提 ...

  2. TestNG教程四TestNG用例失败重试

    一.修改代码实现用例失败重试 1. 修改代码来实现测试用例的重跑,离不开Listener相关接口,具体涉及接口如下: 接口IRetryAnallyzer 该接口的作用是提供去实现能够让用例运行失败重跑 ...

  3. Java中事件监听机制

    Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...

  4. 【转】第01课:生活中的监听模式——一坑爹的热水器

    用程序来模拟生活 从剧情中思考监听模式 监听模式 监听模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 推模型和拉模型 应用场景 [故事剧情] 刚刚大学毕业的 Tony 只身来到北京 ...

  5. java怎么快速创建监听类_java_利用java监听器实现在线人数统计,1.在工程中创建监听类SessionLi - phpStudy...

    利用java监听器实现在线人数统计 1.在工程中创建监听类SessionListener 并且实现HttpSessionListener接口,代码如下 import javax.servlet.htt ...

  6. 第01课:生活中的监听模式——一坑爹的热水器

    用程序来模拟生活 从剧情中思考监听模式 监听模式 监听模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 推模型和拉模型 应用场景 [故事剧情] 刚刚大学毕业的 Tony 只身来到北京 ...

  7. Android 关于ListView中按钮监听的优化问题(方法二)

    关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...

  8. [react] React中如何监听state的变化?

    [react] React中如何监听state的变化? 16.x 之前使用componentWillReveiveProps componentWillReceiveProps (nextProps) ...

  9. gulp构建项目(三):gulp-watch监听文件改变、新增、删除

    一.gulp.watch()功能介绍 举例说明:当'./src/*.html'发生变化时,执行'html'任务,同时刷新浏览器.如下: gulp.task('watch', function(){gu ...

  10. 小程序组件中的监听事件

    小程序组件中的监听事件 需求: 微信小程序中,如果进行使用了component级的组件的话,在一些情况下,父组件中使页面中的数据进行变化,子组件中 的数据不会一起变化,由此可以使用该方法 方法: 使用 ...

最新文章

  1. day4 匿名函数、装饰器、生成器、迭代器、内置函数、 json 与 pickle 模块
  2. 一个伪黑客的成功的秘密1:tomcat入侵
  3. php 基础函数写法,字符串,常用函数
  4. ECCV 2020 Spotlight | 多标签长尾识别前沿进展
  5. 洋葱模型php,理解Koa洋葱模型
  6. jQuery实现禁用和只读
  7. IOProcess基础知识
  8. Theano 中文文档 0.9 - 7. 教程
  9. BigDecimal加减乘除
  10. 谈软件开发项目管理之需求变更
  11. asp html5留言板,ASP.NET MVC 开发实例:简单留言板的开发
  12. linphone android下载,Linphone | F-Droid - Free and Open Source Android App Repository
  13. Mac没有winnt格式_Mac磁盘到底要不要分区?
  14. 【优秀论文解读】UV-SLAM: Unconstrained Line-based SLAM Using Vanishing Points for Structural Mapping
  15. 杂项-一张图片和爆破一
  16. SAP MM02主数据维护多语言长文本,丢失空格的解决办法
  17. HTML5 CSS3 生日快乐动画网页(粉红色的回忆)
  18. 前端面试不用怕!一分钟带你了解es6的解构赋值
  19. Java Language——IO 机制
  20. 改计算机名后ansys打不开,更改计算机名后 Ansys重新注册的简单办法 20140611.pdf

热门文章

  1. 四、神奇的自然常数e之“自然”初现
  2. 特殊的自然常数π以及e
  3. UNIX v6 fork()源码分析
  4. 学习Java一般多久?
  5. 深入理解JavaScript运行机制
  6. 作品交流:数字通信同步技术资源下载
  7. 游戏服务器和普通服务器的区别
  8. Win10下配置PHP环境变量
  9. cesium实现场景导出图片功能
  10. 【转】一个女孩的上海5年