章节十六、9-Listeners监听器

一、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>

 

 

 

 

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。

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

转载于:https://www.cnblogs.com/luohuasheng/p/11535810.html

在 Java 中可以通过监听器Listener)来监听 Map 数据的变化。具体实现步骤如下: 1. 定义一个 Map 监听器接口,并声明对 Map 数据变化的响应方法: ``` public interface MapListener<K, V> { void onPut(K key, V value); // 添加元素时触发 void onRemove(K key); // 删除元素时触发 void onClear(); // 清空 Map 时触发 } ``` 2. 实现 Map 监听器接口: ``` public class MyMapListener<K, V> implements MapListener<K, V> { @Override public void onPut(K key, V value) { // 处理添加元素事件 } @Override public void onRemove(K key) { // 处理删除元素事件 } @Override public void onClear() { // 处理清空 Map 事件 } } ``` 3. 在需要监听的 Map 中添加监听器: ``` Map<K, V> map = new HashMap<>(); MapListener<K, V> listener = new MyMapListener<>(); map.addMapListener(listener); ``` 在此基础上,我们还可以实现一个可观察的 Map 类,使其能够在数据发生变化时通知所有注册的监听器。具体实现可以参考下面的代码: ``` public class ObservableMap<K, V> extends HashMap<K, V> { private List<MapListener<K, V>> listeners = new ArrayList<>(); public void addMapListener(MapListener<K, V> listener) { listeners.add(listener); } public void removeMapListener(MapListener<K, V> listener) { listeners.remove(listener); } @Override public V put(K key, V value) { V oldValue = super.put(key, value); for (MapListener<K, V> listener : listeners) { listener.onPut(key, value); } return oldValue; } @Override public V remove(Object key) { V value = super.remove(key); for (MapListener<K, V> listener : listeners) { listener.onRemove((K) key); } return value; } @Override public void clear() { super.clear(); for (MapListener<K, V> listener : listeners) { listener.onClear(); } } } ``` 使用时,只需要创建一个 ObservableMap 对象,并添加监听器即可: ``` ObservableMap<K, V> map = new ObservableMap<>(); MapListener<K, V> listener = new MyMapListener<>(); map.addMapListener(listener); ``` 这样,当 Map 中的数据发生变化时,所有注册的监听器都会得到相应的通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值