ITestListener监听器主要针对测试方法和xml文件中的<test>标签来进行相应监控。
// 测试方法开始时才执行此方法。测试方法指@Test注解的测试方法
void onTestStart(ITestResult var1);
void onTestSuccess(ITestResult var1);//测试方法执行成功才执行此方法
void onTestFailure(ITestResult var1);//测试方法执行失败才执行此方法
void onTestSkipped(ITestResult var1); // 测试方法失败才执行此方法
// 自定义测试方法的执行结果。比如测试方法中有多个断言,其中一个断言未通过,其他断言通过了,
// 可以根据具体情况,判断此方法是否通过
void onTestFailedButWithinSuccessPercentage(ITestResult var1);
// 在xml文件中的每一个<test>标签跑之前运行
void onStart(ITestContext var1);
// 在xml文件中每一个<test>标签跑之后运行
void onFinish(ITestContext var1);
示例
第一步,先创建监听器 MyTestListener,实现ITestListener并覆写接口中方法
public class MyTestListener implements ITestListener {
@Override
public void onTestStart(ITestResult result) {
// 测试方法【开始执行】,执行此方法
System.out.println("onTestStart-> test method name: " + result.getMethod().getMethodName());
}
@Override
public void onTestSuccess(ITestResult result) {
// 测试方法【执行成功】,执行此方法
System.out.println("onTestSuccess -> test method name: " + result.getName());
}
@Override
public void onTestFailure(ITestResult result) {
// 测试方法【执行失败】,执行此方法
System.out.println("onTestFailure -> test method name: " + result.getName());
}
@Override
public void onTestSkipped(ITestResult result) {
// 测试方法【执行跳过】,执行此方法
System.out.println("onTestSkipped -> test method name: " + result.getName());
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
// 测试方法【部分执行成功】,执行此方法
System.out.println("onTestFailedButWithinSuccessPercentage -> test method name: " + result.getName());
}
@Override
public void onStart(ITestContext context) {
// 在xml文件中每一个<test>标签跑之前运行
System.out.println("onStart <Test>标签【开始执行】 -> " + context.getName());
}
@Override
public void onFinish(ITestContext context) {
// 在xml文件中每一个<test>标签跑之后运行
System.out.println("onFinish <Test>标签【执行结束】 -> " + context.getName());
}
}
第二步,创建测试类 TestDemo1,为了方遍展示,监听器直接写在测试类上
@Listeners(MyTestListener.class)
public class TestDemo1 {
@BeforeClass
public void setUp(){
System.out.println("\n============一个Test执行开始==================\n");
System.out.println("【TestDemo1】 setUp()方法执行...");
}
@AfterClass
public void tearDown(){
System.out.println("【TestDemo1】 tearDown()方法执行...");
System.out.println("\n============一个Test执行完成==================\n");
}
@Test
public void testMethod1(){
System.out.println("【TestDemo1】 testMethod1()方法执行..");
}
@Test
public void testMethod2(){
System.out.println("【TestDemo1】 testMethod2()方法执行..");
}
}
输出
[TestNG] Running:
/Users/mtdp1/Code/JavaProject/InterfaceCase/gj/testng.xml
onStart <Test>标签【开始执行】 -> Test标签1
============一个Test执行开始==================
【TestDemo1】 setUp()方法执行...
onTestStart-> test method name: testMethod1
【TestDemo1】 testMethod1()方法执行..
onTestSuccess -> test method name: testMethod1
onTestStart-> test method name: testMethod2
【TestDemo1】 testMethod2()方法执行..
onTestSuccess -> test method name: testMethod2
【TestDemo1】 tearDown()方法执行...
============一个Test执行完成==================
onFinish <Test>标签【执行结束】 -> Test标签1
onStart <Test>标签【开始执行】 -> Test标签2
============一个Test执行开始==================
【TestDemo1】 setUp()方法执行...
onTestStart-> test method name: testMethod1
【TestDemo1】 testMethod1()方法执行..
onTestSuccess -> test method name: testMethod1
onTestStart-> test method name: testMethod2
【TestDemo1】 testMethod2()方法执行..
onTestSuccess -> test method name: testMethod2
【TestDemo1】 tearDown()方法执行...
============一个Test执行完成==================
onFinish <Test>标签【执行结束】 -> Test标签2
===============================================
Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
在 TestDemo1.testMethod2() 中增加一个assert,执行后查看,监听器中onTestFailure方法执行
onTestFailure -> test method name: testMethod2
@Test
public void testMethod2(){
System.out.println("【TestDemo1】 testMethod2()方法执行..");
Assert.assertTrue(false);// 增加一个校验,确保该用例一定执行失败
}
onStart <Test>标签【开始执行】 -> Test标签1
============一个Test执行开始==================
【TestDemo1】 setUp()方法执行...
onTestStart-> test method name: testMethod2
【TestDemo1】 testMethod2()方法执行..
onTestFailure -> test method name: testMethod2
java.lang.AssertionError: expected [true] but found [false]
Expected :true
Actual :false
<Click to see difference>
at org.testng.Assert.fail(Assert.java:94)
at org.testng.Assert.failNotEquals(Assert.java:513)
at org.testng.Assert.assertTrue(Assert.java:42)
at org.testng.Assert.assertTrue(Assert.java:52)
at myproj.testng.TestDemo1.testMethod2(TestDemo1.java:44)
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:86)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:643)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128)
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:782)
at org.testng.TestRunner.run(TestRunner.java:632)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
at org.testng.SuiteRunner.run(SuiteRunner.java:268)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
at org.testng.TestNG.run(TestNG.java:1064)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
【TestDemo1】 tearDown()方法执行...
============一个Test执行完成==================
onFinish <Test>标签【执行结束】 -> Test标签1
===============================================
Suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================