一、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基础开始。

欢迎关注,转载请注明来源。

posted on 2019-09-20 13:45  时光以北暮南城  阅读(507)  评论(0编辑  收藏  举报