上一节我们写一个日志类 extends   TestListenerAdapter ----------TestListenerAdapter 是 ITestListener 实现的一个类

这一节,我们写一个日志类  implements   ITestListener

ITestNGListener 接口 有两个子接口:IReporter (生成报告)、ITestListener (生成日志)

 

此次我们写一个日志类直接实现 ITestListener 接口

在自定义的 customListener 中,需要实现 ITestListener 的全部方法。



import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.ITestContext;

/**
* Created by wwh on 17/2/13.
*/
public class customListener implements ITestListener{

public void onTestStart(ITestResult result) {
System.out.println("Test started running" + result.getMethod().getMethodName() +
"at:"+result.getStartMillis());
}

public void onTestSuccess(ITestResult result) {
System.out.println("Result success");
}

public void onTestFailure(ITestResult result) {
System.out.println("Result failure");
}

public void onTestSkipped(ITestResult result) {
System.out.println("Result skip");
}

public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println("Result fail but with success percentage");
}

public void onStart(ITestContext context) {
System.out.println("now start test");
}

public void onFinish(ITestContext context) {
System.out.println("now finish test");
}
}


使用自定义的listener

现在完成了创建listener,还需要声明listener,然后测试脚本才能使用这个listener。

有两种方式声明listener:

一种是 添加@Listeners 注解到测试条例上,缺点是每个使用自定义listener的测试条例都要添加@Listeners注解,很麻烦。

另一种是 ​​使用testng.xml配置文件​​,在其中添加suite标签和listener标签。

方式一:使用注解



import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import main.java.com.dbyl.appiumServer.customListener;

/**
* Created by wwh on 17/2/14.
*/
@Listeners(customListener.class)//这个语句指明了使用自定义的listener。
public class listenerTest {

@Test
public void templistener1(){
System.out.println("i'm listenerTest1");
}

@Test
public void templistener2(){
System.out.println("i'm listenerTest2");
}
}


输出结果:



[TestNG] Running:
/Users/wwh/Library/Caches/IdeaIC2016.3/temp-testng-customsuite.xml
now start test
Test started runningtemplistener1at:1487136848622
i'm listenerTest1
Result success
Test started runningtemplistener2at:1487136848712
i'm listenerTest2
Result success
now finish test
===============================================
Default Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================


Process finished with exit code 0


方式二:使用testng.xml配置文件



import org.testng.annotations.Test;

/**
* Created by wwh on 17/2/14.
*/

public class listenerTest {

@Test
public void templistener1(){
System.out.println("i'm listenerTest1");
}

@Test
public void templistener2(){
System.out.println("i'm listenerTest2");
}
}


testng.xml 文件



<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Second suite" verbose="1" >
<listeners>
<listener class-name="main.java.com.dbyl.appiumServer.customListener"></listener>
</listeners>
<test name = "allTestsInAClass" >
<classes>
<class name="main.java.com.dbyl.appiumCore.tests.listenerTest"/>
</classes>
</test>
</suite>


输出结果:



Mac:ProjectWang wwh$ mvn clean test -Dtestng.xml
.
.
.
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
now start test
Test started runningtemplistener1at:1487125608088
i'm listenerTest1
Result success
Test started runningtemplistener2at:1487125608660
i'm listenerTest2
Result success
now finish test
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.125 sec - in TestSuite

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:13 min
[INFO] Finished at: 2017-02-15T10:26:51+08:00
[INFO] Final Memory: 22M/182M
[INFO] ------------------------------------------------------------------------


 

ITestListener适用场景

当使用testng执行测试时,我们常会想在某个阶段做一些特别的处理,比如:测试成功结束后,测试失败后,跳过某个脚本后,全部脚本执行完毕后。

要想达成这个目标,我们需要实现testng的ITestListener接口,自定义一个自己的listener。

ITestListener包含两种类型的方法:

一类是测试用例级别的,例如onTestStart,onTestSuccess,onTestFailure,onTestSkipped,onTestFailedButWithinSuccessPercentage;

另一类是测试集级别的,例如onStart,onFinish。这些方法有一个输入参数,result或者context。

result是ITestResult类型的,可以知晓测试用例成功或者失败和测试何时开始等信息。

context是ITestContext类型的,适用于测试集级别,可以知晓成功的脚本有哪些,失败的脚本有哪些。