一、IInokedMethodListener
1、实现一个类来监听testcase的运行情况。
1 package listenerspackage; 2 3 import org.testng.IInvokedMethod; 4 import org.testng.IInvokedMethodListener; 5 import org.testng.ITestResult; 6 7 /** 8 * 监听*/ 9 10 //所有监听的方法都由接口提供,所以我们需要先实现接口 11 public class CustomerListeners1 implements IInvokedMethodListener{ 12 13 // beforeInvocation 和afterInvocation这两个方法时接口中已经写好的,我们需要按照需求将主体部分描述完整 14 15 // 调用前发生,在testcase类中的每个方法运行前执行 16 @Override 17 public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { 18 // .getTestClass():返回测试方法所在的测试类,是类类型的 19 // .getName():返回类的类名 20 System.out.println("before Invocation:"+testResult.getTestClass().getName()+" -> "+method.getTestMethod().getMethodName()); 21 } 22 23 // 调用后发生,在testcase类中的每个方法运行结束后执行 24 @Override 25 public void afterInvocation(IInvokedMethod method, ITestResult testResult) { 26 System.out.println("after Invocation:"+testResult.getTestClass().getName()+" -> "+method.getTestMethod().getMethodName()); 27 } 28 }
2、创建一个被监听的类
1 package testclasses1; 2 3 import org.testng.Assert; 4 import org.testng.annotations.AfterClass; 5 import org.testng.annotations.BeforeClass; 6 import org.testng.annotations.Listeners; 7 import org.testng.annotations.Test; 8 9 import listenerspackage.CustomerListeners1; 10 11 //表示该测试类被CustomerListeners1类监听 12 @Listeners(CustomerListeners1.class) 13 public class TestNG_ListenersTest1 { 14 15 @BeforeClass 16 public void setUp() { 17 System.out.println("Code in before class"); 18 } 19 20 @AfterClass 21 public void classUp() { 22 System.out.println("Code in after class"); 23 } 24 25 @Test 26 public void testMethod1() { 27 System.out.println("Code in testMethod1"); 28 Assert.assertTrue(true); 29 } 30 31 @Test 32 public void testMethod2() { 33 System.out.println("Code in testMethod2"); 34 Assert.assertTrue(false); 35 } 36 }
3、配置xml
1 <!-- 没有此行配置运行时可能会报错 --> 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 3 <suite name="Listeners TestSuite"> 4 <test name="Application Test"> 5 <classes> 6 <class name="testclasses1.TestNG_ListenersTest1"></class> 7 </classes> 8 </test> 9 </suite>
4、运行结果
未加监听器前运行结果:
添加监听器后运行结果:
二、 ITestListener
1、实现ITestListener接口来监听testcase的运行情况。
1 package listenerspackage; 2 3 import org.testng.ITestContext; 4 import org.testng.ITestListener; 5 import org.testng.ITestNGMethod; 6 import org.testng.ITestResult; 7 8 /** 9 * 监听*/ 10 11 //所有监听的方法都由接口提供,所以我们需要先实现接口 12 public class CustomerListeners2 implements ITestListener{ 13 14 @Override 15 public void onTestStart(ITestResult result) { 16 // 测试方法开始时才执行此方法(带@test注解的方法) 17 // .getName()返回的是测试方法的名称 18 System.out.println("onTestStart -> test name:"+result.getName()); 19 } 20 21 @Override 22 public void onTestSuccess(ITestResult result) { 23 // 只有在测试方法运行成功后才执行(带@test注解的方法) 24 System.out.println("onTestSuccess -> test name:"+result.getName()); 25 } 26 27 @Override 28 public void onTestFailure(ITestResult result) { 29 // 只有在测试方法运行失败后才执行(带@test注解的方法) 30 System.out.println("onTestSuccess -> test name:"+result.getName()); 31 } 32 33 @Override 34 public void onTestSkipped(ITestResult result) { 35 // 在跳过测试时执行 36 } 37 38 @Override 39 public void onTestFailedButWithinSuccessPercentage(ITestResult result) { 40 // 测试失败但在成功百分比内才执行(自动化中不常用) 41 } 42 43 @Override 44 public void onStart(ITestContext context) { 45 // 在xml配置文件的test标签中内容运行前执行 46 // .getName()返回的是标签的名称 47 System.out.println("onStart -> test tag name:"+context.getName()); 48 // 返回所有测试方法的名字 49 ITestNGMethod methods[] = context.getAllTestMethods(); 50 System.out.println("test标签中要执行的测试方法:"); 51 for(ITestNGMethod method:methods) { 52 System.out.println(method.getMethodName()); 53 } 54 } 55 56 @Override 57 public void onFinish(ITestContext context) { 58 // 在xml配置文件中的test标签运行结束后执行 59 System.out.println("onFinish -> test tag name:"+context.getName()); 60 } 61 }
2、被监听类
1 package testclasses1; 2 3 import org.testng.Assert; 4 import org.testng.annotations.AfterClass; 5 import org.testng.annotations.BeforeClass; 6 import org.testng.annotations.Listeners; 7 import org.testng.annotations.Test; 8 9 import listenerspackage.CustomerListeners1; 10 11 //表示该测试类被CustomerListeners1类监听 12 @Listeners(CustomerListeners1.class) 13 public class TestNG_ListenersTest2 { 14 15 @BeforeClass 16 public void setUp() { 17 System.out.println("Code in before class"); 18 } 19 20 @AfterClass 21 public void classUp() { 22 System.out.println("Code in after class"); 23 } 24 25 @Test 26 public void testMethod1() { 27 System.out.println("Code in testMethod1"); 28 Assert.assertTrue(true); 29 } 30 31 @Test 32 public void testMethod2() { 33 System.out.println("Code in testMethod2"); 34 Assert.assertTrue(false); 35 } 36 }
3、xml配置
1 <!-- 没有此行配置运行时可能会报错 --> 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 3 <suite name="Listeners TestSuite"> 4 <test name="Application Test"> 5 <classes> 6 <class name="testclasses1.TestNG_ListenersTest2"></class> 7 </classes> 8 </test> 9 <test name="Application Test"> 10 <classes> 11 <class name="testclasses1.TestNG_ListenersTest2"></class> 12 </classes> 13 </suite>
4、运行结果
三、 ISuiteListener
1 package listenerspackage; 2 3 import org.testng.IInvokedMethod; 4 import org.testng.IInvokedMethodListener; 5 import org.testng.ISuite; 6 import org.testng.ISuiteListener; 7 import org.testng.ITestResult; 8 9 /** 10 * 监听*/ 11 12 //所有监听的方法都由接口提供,所以我们需要先实现接口 13 public class CustomerListeners3 implements ISuiteListener{ 14 15 // 当xml文件中suite标签中内容开始执行前 16 @Override 17 public void onStart(ISuite suite) { 18 System.out.println("onStart suite 开始执行之前"); 19 } 20 21 // 当xml文件中suite标签中内容执行结束后 22 @Override 23 public void onFinish(ISuite suite) { 24 System.out.println("onFinish suite 执行结束之后"); 25 } 26 }
四、当我们将监听的接口通过类实现后,如果要引用到测试类中,有两种方法:
1、需要使用注解:@Listeners(实现监听接口的类名.class)
2、在xml配置文件中进行配置
1 <!-- 没有此行配置运行时可能会报错 --> 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 3 <suite name="Listeners TestSuite"> 4 <!-- 指定CustomerListeners3方法监听suite中所引用的类,格式:包名.类名 --> 5 <listeners> 6 <listener class-name="listenerspackage.CustomerListeners3"></listener> 7 </listeners> 8 <test name="Application Test1"> 9 <classes> 10 <class name="testclasses1.TestNG_ListenersTest1"></class> 11 </classes> 12 </test> 13 <test name="Application Test2"> 14 <classes> 15 <class name="testclasses1.TestNG_ListenersTest2"></class> 16 </classes> 17 </test> 18 </suite>
如果有不明白的小伙伴可以私信问我,目前也建了qq、微信群,群里都是软件行业的小伙伴相互一起学习。
内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。
欢迎关注,转载请注明来源。