TestNG教程三:TestNG中的监听
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中的监听相关推荐
- Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇
Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 文章目录 Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 前言 一.数据库的安装前准备,前提 ...
- TestNG教程四TestNG用例失败重试
一.修改代码实现用例失败重试 1. 修改代码来实现测试用例的重跑,离不开Listener相关接口,具体涉及接口如下: 接口IRetryAnallyzer 该接口的作用是提供去实现能够让用例运行失败重跑 ...
- Java中事件监听机制
Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...
- 【转】第01课:生活中的监听模式——一坑爹的热水器
用程序来模拟生活 从剧情中思考监听模式 监听模式 监听模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 推模型和拉模型 应用场景 [故事剧情] 刚刚大学毕业的 Tony 只身来到北京 ...
- java怎么快速创建监听类_java_利用java监听器实现在线人数统计,1.在工程中创建监听类SessionLi - phpStudy...
利用java监听器实现在线人数统计 1.在工程中创建监听类SessionListener 并且实现HttpSessionListener接口,代码如下 import javax.servlet.htt ...
- 第01课:生活中的监听模式——一坑爹的热水器
用程序来模拟生活 从剧情中思考监听模式 监听模式 监听模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 推模型和拉模型 应用场景 [故事剧情] 刚刚大学毕业的 Tony 只身来到北京 ...
- Android 关于ListView中按钮监听的优化问题(方法二)
关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...
- [react] React中如何监听state的变化?
[react] React中如何监听state的变化? 16.x 之前使用componentWillReveiveProps componentWillReceiveProps (nextProps) ...
- gulp构建项目(三):gulp-watch监听文件改变、新增、删除
一.gulp.watch()功能介绍 举例说明:当'./src/*.html'发生变化时,执行'html'任务,同时刷新浏览器.如下: gulp.task('watch', function(){gu ...
- 小程序组件中的监听事件
小程序组件中的监听事件 需求: 微信小程序中,如果进行使用了component级的组件的话,在一些情况下,父组件中使页面中的数据进行变化,子组件中 的数据不会一起变化,由此可以使用该方法 方法: 使用 ...
最新文章
- day4 匿名函数、装饰器、生成器、迭代器、内置函数、 json 与 pickle 模块
- 一个伪黑客的成功的秘密1:tomcat入侵
- php 基础函数写法,字符串,常用函数
- ECCV 2020 Spotlight | 多标签长尾识别前沿进展
- 洋葱模型php,理解Koa洋葱模型
- jQuery实现禁用和只读
- IOProcess基础知识
- Theano 中文文档 0.9 - 7. 教程
- BigDecimal加减乘除
- 谈软件开发项目管理之需求变更
- asp html5留言板,ASP.NET MVC 开发实例:简单留言板的开发
- linphone android下载,Linphone | F-Droid - Free and Open Source Android App Repository
- Mac没有winnt格式_Mac磁盘到底要不要分区?
- 【优秀论文解读】UV-SLAM: Unconstrained Line-based SLAM Using Vanishing Points for Structural Mapping
- 杂项-一张图片和爆破一
- SAP MM02主数据维护多语言长文本,丢失空格的解决办法
- HTML5 CSS3 生日快乐动画网页(粉红色的回忆)
- 前端面试不用怕!一分钟带你了解es6的解构赋值
- Java Language——IO 机制
- 改计算机名后ansys打不开,更改计算机名后 Ansys重新注册的简单办法 20140611.pdf