TestNG测试框架中断言失败是程序继续执行、只负责收集失败信息(转)

2020-02-14  学海无涯 

1.重写断言方法

package configSelenium.Assert;


import org.testng.Assert;
import java.util.ArrayList;
import java.util.List;


/**
 * @author wangyan
 * @date 2019-02-23  下午 12:27
 *
 */
public class Assertion  {
    public static boolean flag=true;
    public static List<Error> errors=new ArrayList<>();


    public static void verifyEquals(Object actual,Object expected){
       try{
           Assert.assertEquals(actual,expected);
       }catch(Error e){
           errors.add(e);
           flag=false;


       }
    }


    public static void verifyEquals(Object actual,Object expected,String message){
        try{
            Assert.assertEquals(actual, expected, message);
        }catch(Error e){
          errors.add(e);
          flag=false;
        }


    }
    public static void verifyNulls(Object actual,String message){
        try{
            Assert.assertNull(actual,message);
        }catch(Error e){
          errors.add(e);
          flag=false;
        }
    }


}
2.创建监听类

package configSelenium.Assert;


import org.testng.ITestResult;
import org.testng.TestListenerAdapter;


import java.util.ArrayList;
import java.util.List;


/**
 * @author wangyan
 * @date 2019-02-23  下午 12:49
 */
public class AssertListener extends TestListenerAdapter {


    @Override
    public void onTestStart(ITestResult result){
        Assertion.flag=true;
        Assertion.errors.clear();


    }


    @Override
    public void onTestFailure(ITestResult tr){
        this.handleAssertion(tr);
    }






    @Override
    public void onTestSkipped(ITestResult tr){
        this.handleAssertion(tr);
    }


    @Override
    public void onTestSuccess(ITestResult tr){
        this.handleAssertion(tr);
    }




    private  int index=0;


    private void handleAssertion(ITestResult tr){
        if(!Assertion.flag){
            Throwable throwable = tr.getThrowable();
            if(throwable==null){
                throwable = new Throwable();
            }
            StackTraceElement[] traces = throwable.getStackTrace();
            StackTraceElement[] alltrace = new StackTraceElement[0];
            for (Error e : Assertion.errors) {
                StackTraceElement[] errorTraces = e.getStackTrace();
                StackTraceElement[] et = this.getKeyStackTrace(tr, errorTraces);
                StackTraceElement[] message = new StackTraceElement[]{new StackTraceElement("message : "+e.getMessage()+" in method : ", tr.getMethod().getMethodName(), tr.getTestClass().getRealClass().getSimpleName(), index)};
                index = 0;
                alltrace = this.merge(alltrace, message);
                alltrace = this.merge(alltrace, et);
            }
            if(traces!=null){
                traces = this.getKeyStackTrace(tr, traces);
                alltrace = this.merge(alltrace, traces);
            }




            throwable.setStackTrace(alltrace);
            tr.setThrowable(throwable);
            Assertion.flag = true;
            Assertion.errors.clear();
            tr.setStatus(ITestResult.FAILURE);
        }


    }
    private StackTraceElement[] getKeyStackTrace(ITestResult tr, StackTraceElement[] stackTraceElements){
        List<StackTraceElement> ets = new ArrayList<StackTraceElement>();
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            if(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){
                ets.add(stackTraceElement);
                index = stackTraceElement.getLineNumber();
            }
        }
        StackTraceElement[] et = new StackTraceElement[ets.size()];
        for (int i = 0; i < et.length; i++) {
            et[i] = ets.get(i);
        }
        return et;
    }




    private StackTraceElement[] merge(StackTraceElement[] traces1, StackTraceElement[] traces2){
        StackTraceElement[] ste = new StackTraceElement[traces1.length+traces2.length];
        for (int i = 0; i < traces1.length; i++) {
            ste[i] = traces1[i];
        }
        for (int i = 0; i < traces2.length; i++) {
            ste[traces1.length+i] = traces2[i];
        }
        return ste;
    }




}
转自
原文链接:https://blog.csdn.net/qq_39704682/article/details/87891976

184°/1841 人阅读/0 条评论 发表评论

登录 后发表评论
学海无涯
访客 2299
学海无涯 的其他博文 更多