前言
TestNG默认有提供监听器,但是如果我们想自定义监听器也是可以的,自定义监听器包括好几种,部分如下所示:
- IAnnotationTransformer
- IAnnotationTransformer2
- IHookable
- IInvokedMethodListener
- IMethodInterceptor
- IReporter
- ISuiteListener
- ITestListener
全部监听器如下图所示:
使用命令行调用TestNG同时添加监听器可以参考如下代码:
java org.testng.TestNG -listener MyTransformer testng.xml
下面介绍下这些:
一、ISuiteLinstener监听器
这个其实不常用,只有两个方法要实现,开始测试套和结束测试套。
实现自定义测试套监听器可以这么写:
package com.demo.test.testng;
import org.testng.ISuite;
import org.testng.ISuiteListener;
public class MySuiteListener implements ISuiteListener{
public void onStart(ISuite suite) {
System.out.println("suite onStart!");
}
public void onFinish(ISuite suite) {
System.out.println("suite onFinish!");
}
}
测试用例如下:
package com.demo.test.testng;
import org.testng.annotations.Test;
public class ListenerTest {
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
}
对应的xml如下,注意里边的那个listener标签,即为上面添加的那个监听器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="this suite" parallel="none" verbose="1">
<listeners>
<listener class-name="com.demo.test.testng.MySuiteListener" />
</listeners>
<test name="Test">
<classes>
<class name="com.demo.test.testng.ListenerTest"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
测试结果如下:
[RemoteTestNG] detected TestNG version 6.10.0
[TestNG] Running:
D:\software\workspace\testng\src\main\java\com\demo\test\testCase\listenerTest1.xml
suite onStart!
test1
test2
suite onFinish!
===============================================
this suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
实现这个接口的自定义监听器只能通过xml里配置listener来加入;
二、IAlterSuiteListener监听器
这个监听器可以用于获取xml文件对应的XmlSuite,对于我们想根据suite修改一些参数啊之类的东西的需求,可以通过实现此监听器来实现,方法如下:
public class MyAlterSuiteNameListener implements IAlterSuiteListener {
@Override
public void alter(List<XmlSuite> suites) {
XmlSuite suite = suites.get(0);//只取第一个suite
suite.setName(getClass().getSimpleName());
}
在获取到XmlSuite
对象后就可以操作里边的所有内容了,包括配置和测试用例等;
注意:IAlterSuiteListener监听器的使用有特殊要求。使用IAlterSuiteListener监听器,只能通过在testng.xml中的,或者通过Java的SPI接口。除此之外的其他方法,如在测试类中通过@Listeners标注等,都是无效的。
三、ITestListener监听器
这个监听器比较常用了,内含的接口比较多,在我们需要对失败等用例做一些特别操作的时候就需要这个了。多适用于这样一些情况:
当使用testng执行测试时,我们常会想在某个阶段做一些特别的处理,比如:测试成功结束后,测试失败后,跳过某个脚本后,全部脚本执行完毕后。
要想达成这个目标,我们需要实现testng的ITestListener接口,自定义一个自己的listener。
ITestListener包含两种类型的方法:
- 一类是测试用例级别的,例如onTestStart,onTestSuccess,onTestFailure,onTestSkipped,onTestFailedButWithinSuccessPercentage;
- 另一类是测试集级别的,例如onStart,onFinish。这些方法有一个输入参数,result或者context。result是ITestResult类型的,可以知晓测试用例成功或者失败和测试何时开始等信息。context是ITestContext类型的,适用于测试集级别,可以知晓成功的脚本有哪些,失败的脚本有哪些。
范例如下:
监听器如下:
package com.demo.test.testng;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class MyTestListener implements ITestListener{
public void onTestStart(ITestResult result) {
System.out.println("onTestStart")