和其他的注解放在方法上不同,@Listener是放在类上的
首先我们来看一下@Listener这个注解里面是什么
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.testng.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.testng.ITestNGListener;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Listeners {
Class extends ITestNGListener>[] value() default {};
}
发现这里需要一个extends过ITestNGListener的接口
那我们就来看一下ITestNGListener这个接口是什么
emmmm,空的
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.testng;
public interface ITestNGListener {
}
但是仔细看一下它下面的接口,发现很多接口都extends过ITestNGListener,其中就有ITestListener,就是我们要实习的
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.testng;
public interface ITestListener extends ITestNGListener {
void onTestStart(ITestResult var1);
void onTestSuccess(ITestResult var1);
void onTestFailure(ITestResult var1);
void onTestSkipped(ITestResult var1);
void onTestFailedButWithinSuccessPercentage(ITestResult var1);
void onStart(ITestContext var1);
void onFinish(ITestContext var1);
}
我们要做的是就是来implements这个接口
我们要做的是就是来implements这个接口
实现ITestListener接口package com.newcrud.learn;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class MyTestNgListener implements ITestListener {
@Override
public void onTestStart(ITestResult iTestResult) {
System.out.println("onTestStart仅在启动任何测试方法时才调用onTestStart()"+iTestResult.getName());
}
@Override
public void onTestSuccess(ITestResult iTestResult) {
System.out.println("onTestSuccess用例执行成功"+iTestResult.getName());
}
@Override
public void onTestFailure(ITestResult iTestResult) {
System.out.println("onTestFailure用例执行失败"+iTestResult.getName());
}
@Override
public void onTestSkipped(ITestResult iTestResult) {
//就比如你的一个方法依赖的方法执行失败了,导致你这个方法被跳过了,这个时候你就可以对跳过执行的用例进行一种补偿措施
System.out.println("onTestSkipped跳过测试"+iTestResult.getName());
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {
System.out.println("emmm,这个我也不知道干什么的,但是平时也不用");
}
@Override
public void onStart(ITestContext iTestContext) {
System.out.println("onStart在任何测试方法开始时执行"+iTestContext.getName());
}
@Override
public void onFinish(ITestContext iTestContext) {
System.out.println("onFinish任何测试用例完成执行时, 都会调用onFinish()"+iTestContext.getName());
}
}
如何使用Listener
在测试类上加@Linstener
package com.newcrud.testngTest;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners({com.newcrud.learn.MyTestNgListener.class})
public class TestFour {
@Test
public void testZ(){
System.out.println("Z");
}
@Test()
public void testY(){
System.out.println("Y");
Assert.assertEquals(1,2);
}
@Test(dependsonMethods = {"testY"})
public void testM(){
System.out.println("我要被skip了");
}
}
执行结果
onStart在任何测试方法开始时执行NewCRUD onTestStart仅在启动任何测试方法时才调用onTestStart()testY Y onTestFailure用例执行失败testY java.lang.AssertionError: Expected :2 Actual :1在xml文件上添加Listenerat org.testng.Assert.fail(Assert.java:94) at org.testng.Assert.failNotEquals(Assert.java:513) at org.testng.Assert.assertEqualsImpl(Assert.java:135) at org.testng.Assert.assertEquals(Assert.java:116) at org.testng.Assert.assertEquals(Assert.java:389) at org.testng.Assert.assertEquals(Assert.java:399) at com.newcrud.testngTest.TestFour.testY(TestFour.java:16) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104) at org.testng.internal.Invoker.invokeMethod(Invoker.java:645) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) at org.testng.TestRunner.privateRun(TestRunner.java:756) at org.testng.TestRunner.run(TestRunner.java:610) at org.testng.SuiteRunner.runTest(SuiteRunner.java:387) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) at org.testng.SuiteRunner.run(SuiteRunner.java:289) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293) at org.testng.TestNG.runSuitesLocally(TestNG.java:1218) at org.testng.TestNG.runSuites(TestNG.java:1133) at org.testng.TestNG.run(TestNG.java:1104) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109) onTestStart仅在启动任何测试方法时才调用onTestStart()testZ Z onTestSuccess用例执行成功testZ onTestSkipped跳过测试testM Test ignored. onFinish任何测试用例完成执行时, 都会调用onFinish()NewCRUD
将测试类上的@Listener注解去掉,放到xml文件中
结果
onStart在任何测试方法开始时执行testonly onTestStart仅在启动任何测试方法时才调用onTestStart()testY Y java.lang.AssertionError: Expected :2 Actual :1at org.testng.Assert.fail(Assert.java:94) at org.testng.Assert.failNotEquals(Assert.java:513) at org.testng.Assert.assertEqualsImpl(Assert.java:135) at org.testng.Assert.assertEquals(Assert.java:116) at org.testng.Assert.assertEquals(Assert.java:389) at org.testng.Assert.assertEquals(Assert.java:399) at com.newcrud.testngTest.TestFour.testY(TestFour.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104) at org.testng.internal.Invoker.invokeMethod(Invoker.java:645) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) at org.testng.TestRunner.privateRun(TestRunner.java:756) at org.testng.TestRunner.run(TestRunner.java:610) at org.testng.SuiteRunner.runTest(SuiteRunner.java:387) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) at org.testng.SuiteRunner.run(SuiteRunner.java:289) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293) at org.testng.TestNG.runSuitesLocally(TestNG.java:1218) at org.testng.TestNG.runSuites(TestNG.java:1133) at org.testng.TestNG.run(TestNG.java:1104) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109) onTestFailure用例执行失败testY onTestStart仅在启动任何测试方法时才调用onTestStart()testZ Z onTestSuccess用例执行成功testZ Test ignored. onTestSkipped跳过测试testM onFinish任何测试用例完成执行时, 都会调用onFinish()testonly



