selenium之如何监听断言

一.概述

测试用的执行通过与否,需要对比期望结果和实际结果的值,因此在自动化测试中我们需要进行断言来获得执行的结果,

那么如果在执行的过程中有异常,该怎么办呢,我们是否要查看异常信息呢,于是乎如何得到我们所需要的异常信息成为

我们需要思考的问题,该怎么解决呢,其实so eazy!tesgNG的测试用例监听器可以帮助我们解决这个问题。

二.监听断言类AssertionListener

  1 public class AsserttionListener extends TestListenerAdapter{
  2
  3     private Log log=new Log(this.getClass());
  4
  5     @Override
  6     public void onTestStart(ITestResult result) {
  7         // TODO Auto-generated method stub
  8         Assertion.begin();
  9     }
 10
 11     @Override
 12     public void onTestFailure(ITestResult tr) {
 13         // TODO Auto-generated method stub
 14         this.handleAssertion(tr);
 15     }
 16
 17     @Override
 18     public void onTestSkipped(ITestResult tr) {
 19         // TODO Auto-generated method stub
 20         this.handleAssertion(tr);
 21     }
 22
 23     @Override
 24     public void onTestSuccess(ITestResult tr) {
 25         // TODO Auto-generated method stub
 26         this.handleAssertion(tr);
 27     }
 28
 29     private int index;
 30
 31     private boolean isNew=false;
 32
 33     /**
 34      * 得到测试类所需的测试异常信息
 35      * @param tr
 36      */
 37     private void handleAssertion(ITestResult tr){
 38         Throwable throwable=tr.getThrowable();
 39         if(!Assertion.flag||throwable!=null){
 40             if(throwable==null){
 41                 throwable=new Throwable();
 42                 isNew=true;
 43             }
 44             StackTraceElement[] alltrace=new StackTraceElement[0];
 45             for (Error e : Assertion.errors) {
 46                 alltrace=this.getAllStackTraceElement(tr, e, null, alltrace);
 47             }
 48             if(!isNew){
 49                 alltrace=this.getAllStackTraceElement(tr, null, throwable, alltrace);
 50             }else{
 51                 isNew=false;
 52             }
 53             throwable.setStackTrace(alltrace);
 54             tr.setThrowable(throwable);
 55             Assertion.flag=true;
 56             Assertion.errors.clear();
 57             tr.setStatus(ITestResult.FAILURE);
 58         }
 59     }
 60
 61     /**
 62      * 得到测试类需要的StackTraceElement数组
 63      * @param tr
 64      * @param e
 65      * @param throwable
 66      * @param alltrace
 67      * @return
 68      */
 69     private StackTraceElement[] getAllStackTraceElement(ITestResult tr,Error e,Throwable throwable,StackTraceElement[] alltrace){
 70         StackTraceElement[] traces=(e==null?throwable.getStackTrace():e.getStackTrace());
 71         StackTraceElement[] et=this.getKeyStackTrace(tr, traces);
 72         String msg=(e==null?throwable.getMessage():e.getMessage());
 73         StackTraceElement[] message=new StackTraceElement[]{new StackTraceElement("message : "+msg+" in method : ",tr.getMethod().getMethodName(),tr.getTestClass().getRealClass().getSimpleName(),index)};
 74         index=0;
 75         alltrace=this.merge(alltrace, et);
 76         alltrace=this.merge(alltrace, message);
 77         return alltrace;
 78     }
 79
 80     /**
 81      * 根据测试类名获得该测试类的StackTraceElement数组
 82      * @param tr
 83      * @param stackTraceElements
 84      * @return
 85      */
 86     private StackTraceElement[] getKeyStackTrace(ITestResult tr,StackTraceElement[] stackTraceElements){
 87         List<StackTraceElement> ets=new ArrayList<StackTraceElement>();
 88         for (StackTraceElement stackTraceElement : ets) {
 89             if(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){
 90                 ets.add(stackTraceElement);
 91                 index=stackTraceElement.getLineNumber();
 92             }
 93         }
 94         StackTraceElement[] et=new StackTraceElement[ets.size()];
 95         for (int i = 0; i < et.length; i++) {
 96             et[i]=ets.get(i);
 97         }
 98         return et;
 99     }
100
101     /**
102      * 合并两个StackTraceElement数组
103      * @param trace1
104      * @param trace2
105      * @return
106      */
107     private StackTraceElement[] merge(StackTraceElement[] trace1,StackTraceElement[] trace2){
108         StackTraceElement[] ste=new StackTraceElement[trace1.length+trace2.length];
109         for (int i = 0; i < trace1.length; i++) {
110             ste[i]=trace1[i];
111         }
112         for (int i = 0; i < trace2.length; i++) {
113             ste[trace1.length+i]=trace2[i];
114         }
115         return ste;
116     }

 1 public class Assertion {
 2
 3     public static Log log=new Log(Assertion.class);
 4
 5     public static boolean flag=true;
 6
 7     public static List<Error> errors=new ArrayList<Error>();
 8
 9     public static void begin(){
10         flag=true;
11     }
12
13     public static void end(){
14         Assert.assertTrue(flag);
15     }
16
17     public static void verifyEquals(Object actual, Object expected){
18         try{
19             Assert.assertEquals(actual, expected);
20         }catch(Error e){
21             errors.add(e);
22             flag = false;
23         }
24     }
25
26     public static void verifyEquals(Object actual, Object expected, String message){
27         try{
28             Assert.assertEquals(actual, expected, message);
29             log.info("方法验证成功!");
30         }catch(Error e){
31             errors.add(e);
32             flag = false;
33             log.info("方法验证失败!");
34         }
35     }
36
37 }

时间: 2024-10-13 23:29:37

selenium之如何监听断言的相关文章

EventFiringWebDriver网页事件监听(一)

Selenium提供了很多的event listening functions来跟踪脚本执行过程中的events. How it works? 在注册了listener的webDriver里面,这些listener可以listen events.events可以是任何类型的event 或者 action,比如element click,改变输入框的值,甚至是exceptions. To enable this feature: 1. 创建用户自定义的Event listener class. 2

Android实战简易教程-第三十六枪(监听短信-实现短信验证码自动填入)

一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听手机短信. 一.获取短信全部内容 1.新建一个SMSBroadcastReceiver: package com.example.messagecut; import java.text.SimpleDateFormat; import java.util.Date; import android.

laravel进阶系列--通过事件和事件监听实现服务解耦

简介 Laravel 事件提供了简单的观察着模式实现,允许你订阅和监听应用中的事件.事件类通常存放在 app/Events 目录. 监听器存放在 app/Listeners. 如果你在应用中没有看到这些目录,不要担心,他们会在你使用Artisan命令生成事件和 监听器的时候自动创建. 事件为应用功能模块解耦提供了行之有效的解决方法,因为单个事件可以有多个监听器而这些监听器之间并不相互依赖. 例如,你可能想要在每次订单发送时给用户发送一个Slack通知,有了事件之后,你大可不必将订单处理代码和Sl

Android 监听ListView、GridView滑动到底部

// 监听listview滚到最底部mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (view.get

使用path监听指定文件系统的变化

在以前的JAVA版本中,如果程序需要检测文件的变化,那么需要开辟一个线程每隔一段时间去遍历一次指定的目录,如果发现此次遍历结果和上次不同,那么就认为文件变动了 ,这样的方式非常繁琐,JAVA 7之后的NIO.2 Path类提供了一个方法来监听指定文件目录内文件的变化状态. 1.获取文件系统的WatchService对 2.使用Path类的方法去注册一个监听,指定监听文件的哪些状态,如新增.修改.删除. package com.nio2; import java.io.IOException;im

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

Android简易实战教程--第十九话《手把手教您监听EditText文本变化,实现抖动和震动的效果》

监听文本输入情况,仅仅限于土司略显low点,这一篇就稍微"高大上"些,体验一下滚动和震动. 首先,需要两个文件.截图: 两个文件的内容分别如下: cycle_7: <?xml version="1.0" encoding="utf-8"?> <!-- 表示循环的次数 --> <cycleInterpolator xmlns:android="http://schemas.android.com/apk/re

屏幕触摸事件监听,判断上下左右的操作行为,判断方法缩小的操作行为

在手机屏幕上能够实现的人机交互行为,大致包括点击按钮,拉动滑动块,物体缩放,上下左右拉动等. 手机屏幕触摸事件的监听方法: 1.首先要设置一块布局区域,frameLayout/LinearLayout等都可以,并为布局设置id: 2.在Activity中声明相应的布局类型,并通过findViewById()方法找到该布局,然后为该布局区域设置setOnTouchListener()方法,就能监听在相应屏幕触摸操作 实现屏幕触摸事件监听的代码: private LinearLayout Land;

Oracle只监听本机,网络其他计算机连不上

Oracle只能本机连接,网络其他计算机连不上 Oracle 只监听本地127.0.0.1,导致网络其他计算机连不上解决办法: 修改 listener.ora监听文件,把其中的localhost 改成计算机名.重启Oralce监听和服务.