一、IInokedMethodListener

1、实现一个类来监听testcase的运行情况。

 package listenerspackage;

 import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestResult; /**
* 监听*/ //所有监听的方法都由接口提供,所以我们需要先实现接口
public class CustomerListeners1 implements IInvokedMethodListener{ // beforeInvocation 和afterInvocation这两个方法时接口中已经写好的,我们需要按照需求将主体部分描述完整 // 调用前发生,在testcase类中的每个方法运行前执行
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
// .getTestClass():返回测试方法所在的测试类,是类类型的
// .getName():返回类的类名
System.out.println("before Invocation:"+testResult.getTestClass().getName()+" -> "+method.getTestMethod().getMethodName());
} // 调用后发生,在testcase类中的每个方法运行结束后执行
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
System.out.println("after Invocation:"+testResult.getTestClass().getName()+" -> "+method.getTestMethod().getMethodName());
}
}

2、创建一个被监听的类

 package testclasses1;

 import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test; import listenerspackage.CustomerListeners1; //表示该测试类被CustomerListeners1类监听
@Listeners(CustomerListeners1.class)
public class TestNG_ListenersTest1 { @BeforeClass
public void setUp() {
System.out.println("Code in before class");
} @AfterClass
public void classUp() {
System.out.println("Code in after class");
} @Test
public void testMethod1() {
System.out.println("Code in testMethod1");
Assert.assertTrue(true);
} @Test
public void testMethod2() {
System.out.println("Code in testMethod2");
Assert.assertTrue(false);
}
}

3、配置xml

 <!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Listeners TestSuite">
<test name="Application Test">
<classes>
<class name="testclasses1.TestNG_ListenersTest1"></class>
</classes>
</test>
</suite>

4、运行结果

未加监听器前运行结果:

添加监听器后运行结果:

二、 ITestListener

1、实现ITestListener接口来监听testcase的运行情况。

 package listenerspackage;

 import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult; /**
* 监听*/ //所有监听的方法都由接口提供,所以我们需要先实现接口
public class CustomerListeners2 implements ITestListener{ @Override
public void onTestStart(ITestResult result) {
// 测试方法开始时才执行此方法(带@test注解的方法)
// .getName()返回的是测试方法的名称
System.out.println("onTestStart -> test name:"+result.getName());
} @Override
public void onTestSuccess(ITestResult result) {
// 只有在测试方法运行成功后才执行(带@test注解的方法)
System.out.println("onTestSuccess -> test name:"+result.getName());
} @Override
public void onTestFailure(ITestResult result) {
// 只有在测试方法运行失败后才执行(带@test注解的方法)
System.out.println("onTestSuccess -> test name:"+result.getName());
} @Override
public void onTestSkipped(ITestResult result) {
// 在跳过测试时执行
} @Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
// 测试失败但在成功百分比内才执行(自动化中不常用)
} @Override
public void onStart(ITestContext context) {
// 在xml配置文件的test标签中内容运行前执行
// .getName()返回的是标签的名称
System.out.println("onStart -> test tag name:"+context.getName());
// 返回所有测试方法的名字
ITestNGMethod methods[] = context.getAllTestMethods();
System.out.println("test标签中要执行的测试方法:");
for(ITestNGMethod method:methods) {
System.out.println(method.getMethodName());
}
} @Override
public void onFinish(ITestContext context) {
// 在xml配置文件中的test标签运行结束后执行
System.out.println("onFinish -> test tag name:"+context.getName());
}
}

2、被监听类

 package testclasses1;

 import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test; import listenerspackage.CustomerListeners1; //表示该测试类被CustomerListeners1类监听
@Listeners(CustomerListeners1.class)
public class TestNG_ListenersTest2 { @BeforeClass
public void setUp() {
System.out.println("Code in before class");
} @AfterClass
public void classUp() {
System.out.println("Code in after class");
} @Test
public void testMethod1() {
System.out.println("Code in testMethod1");
Assert.assertTrue(true);
} @Test
public void testMethod2() {
System.out.println("Code in testMethod2");
Assert.assertTrue(false);
}
}

3、xml配置

 <!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Listeners TestSuite">
<test name="Application Test">
<classes>
<class name="testclasses1.TestNG_ListenersTest2"></class>
</classes>
</test>
<test name="Application Test">
<classes>
<class name="testclasses1.TestNG_ListenersTest2"></class>
</classes>
</suite>

4、运行结果

三、 ISuiteListener

 package listenerspackage;

 import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ISuite;
import org.testng.ISuiteListener;
import org.testng.ITestResult; /**
* 监听*/ //所有监听的方法都由接口提供,所以我们需要先实现接口
public class CustomerListeners3 implements ISuiteListener{ // 当xml文件中suite标签中内容开始执行前
@Override
public void onStart(ISuite suite) {
System.out.println("onStart suite 开始执行之前");
} // 当xml文件中suite标签中内容执行结束后
@Override
public void onFinish(ISuite suite) {
System.out.println("onFinish suite 执行结束之后");
}
}

四、当我们将监听的接口通过类实现后,如果要引用到测试类中,有两种方法:

1、需要使用注解:@Listeners(实现监听接口的类名.class)

2、在xml配置文件中进行配置

 <!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Listeners TestSuite">
4 <!-- 指定CustomerListeners3方法监听suite中所引用的类,格式:包名.类名 -->
5 <listeners>
6 <listener class-name="listenerspackage.CustomerListeners3"></listener>
7 </listeners>
<test name="Application Test1">
<classes>
<class name="testclasses1.TestNG_ListenersTest1"></class>
</classes>
</test>
<test name="Application Test2">
<classes>
<class name="testclasses1.TestNG_ListenersTest2"></class>
</classes>
</test>
</suite>

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。

欢迎关注,转载请注明来源。

章节十六、9-Listeners监听器的更多相关文章

  1. 章节十六、3-TestNG方法和类注解

    一.Test Suite(测试套件) 我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有1 ...

  2. 章节十六、8-ITestResult接口

    一.ITestResult:该接口就像一个监听器,能够监听每个方法执行后的状态(是否成功)并将结果返回给我们. package testclasses1; import org.testng.anno ...

  3. 章节十六、1-TestNG简介

    一.TestNG 介绍 1.TestNG 是一个来自 JUnit 和 NUnit 的测试框架,它具拥有更多的功能,提高了 执行的效率. 2.TestNG 是一个开源的自动化测试框架 去除了老框架的大部 ...

  4. 章节十六、2-TestNG注解和断言

    一.TestNG注解的testcease不是自上而下运行的,而是按照方法名的字母排序或数字的大小顺序运行的. 二.断言:判断返回的结果与我们的预期结果是否一致. 1.Assert.assertTrue ...

  5. 章节十六、4-TestNG高级功能--把测试方法分优先级、分组执行

    一. 把测试方法分优先级执行----->(priority=索引) 1.新建一个testng方法 package testclasses; import org.testng.annotatio ...

  6. 章节十六、5-TestNG高级功能--Part2

    一.测试用例的依赖关系--->(dependsOnMethods = {"依赖方法名"}) 1.在实现自动化的过程中,有些测试用例必须在其它测试用例执行之后才能运行,两者之间 ...

  7. 章节十六、6-xml参数化and并行case

    一.读取xml文件中参数 1.案例演示--->创建一个需要读取数据的类 package testclasses; import org.testng.annotations.Test; impo ...

  8. 章节十六、7-DataProviders

    一.当我们的同一个test有多套数据需要进行测试,那么我们就需要用到-->DataProviders package testclasses1; import org.testng.annota ...

  9. 章节十六、10-TestNG报告和日志

    一.在进行自动化的过程中,日志一般采用log4j 2进行日志记录,但TestNG自己本身也带有日志记录功能(reporter),它的好处在于日志中记录的内容都是testng自动生成的. package ...

随机推荐

  1. 洛谷 P1177 【模板】快速排序

    这道题用传统快排(如下所示)的结果就是最后三个点TLE: void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } void ...

  2. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  3. MYSQL--存储引擎、数据类型、约束条件、

    存储引擎: 不同的数据应该有不同的处理机制 mysql存储引擎 Innodb:默认的存储引擎  查询速度相比于myisam慢  但是更安全 myisam:mysql老版本用的存储引擎 memory:内 ...

  4. Executor线程池只看这一篇就够了

    线程池为线程生命周期的开销和资源不足问题提供了解决方 案.通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上. 线程实现方式 Thread.Runnable.Callable //实现Runn ...

  5. 开源题材征集 + MVC&EF Core 完整教程小结

    到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...

  6. 二.安全NA之ASA基础

    一.ASA常用命令 show run interface #查看接口配置 show ip address #查看IP地址 show conn #查看防火墙状态信息,U代表up:I,代表进流量:O,代表 ...

  7. Java进程故障排查

    故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...

  8. c语言的图形库

    图形库链接http://www.easyx.cn/ 使用图形库头文件easyx.h或graphics.h 同样在里面下载图形库帮助文档进行查询 vs vc都可使用图形库 图形库窗口: initgrap ...

  9. 06 css选择器

    选择器的作用:选中标签 1.基本选择器  标签选择器 id选择器 class选择器 *通配符选择器 权重:行内样式 1000 > id选择器 100 > 类选择器10 > 标签选择器 ...

  10. java 正则 替换中文为空

    //中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...