原理:

1.自已构造一个断言类,把Assert.assertEquals给try catch住。

2.利用testng的监听类在测试方法运行结束后进行分析。

代码:

断言类:

package com.demo;

import java.util.ArrayList;
import java.util.List; import org.testng.Assert; public class Assertion { public static boolean flag = true; public static List<Error> errors = new ArrayList<Error>(); 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;
}
} }

监听类:

package com.demo;

import java.util.ArrayList;
import java.util.List; import org.testng.ITestResult;
import org.testng.TestListenerAdapter; public class AssertionListener 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;
}
}

测试类:

package com.demo;

import org.testng.annotations.Listeners;
import org.testng.annotations.Test; @Listeners({com.demo.AssertionListener.class})
public class Test14 { @Test
public void testAssert3(){
Assertion.verifyEquals(2, 3, "比较两个数是否相等:");
Assertion.verifyEquals(1, 2, "比较两个数是否相等:");
} @Test
public void testAssert4(){
Assertion.verifyEquals(4, 3, "比较两个数是否相等:");
Assertion.verifyEquals(2, 2, "比较两个数是否相等:");
} }

JAVA结合testng断言verify(断言失败不中断继续执行)的更多相关文章

  1. TestNg中的断言你真的了解吗

    前言 在执行自动化测试脚本的时候,我们需要自动判断测试脚本执行完成后的实际结果是否与预期结果一致,这个时候就需要在程序运行之前写入断言,判断当前程序执行后是否正常. 关于TestNG断言分为两种: 软 ...

  2. Java基础语法<十一> 异常 断言 日志 调试

    1 处理错误 1.1 异常分类 Error类层次描述了Java运行时系统的内部错误和资源耗尽错误. 设计Java程序时,主要关注Exception层次结构. 由程序错误导致的异常属于RuntimeEx ...

  3. Jmeter断言-所有断言讲解

    Jmeter断言-所有断言讲解 jmeter中有个元件叫做断言(Assertion),它的作用和loadrunner中的检查点类似: 用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中 ...

  4. 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决

    微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...

  5. Java+Selenium+Testng自动化测试学习(二)

    Java+Selenium+TestNG自动化测试框架整合 1.简化代码 封装一个定位元素的类,类型为ElementLocation package com.test; import org.open ...

  6. JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,

    如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...

  7. Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)

    需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现   反射的过程如下:     第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...

  8. Java finally语句到底是在return之前还是之后执行(JVM字节码分析及内部体系结构)?

    之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public ...

  9. Django在form提交CSRF验证失败. 相应中断问题

    CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...

随机推荐

  1. memcache 应用场景

    一..memcache应用场景 1.应用场景一: 缓解数据库压力,提高交互速度.它的一个总原则是将经常需要从数据库读取的数据缓存在memcached中.这些数据也分为几类: (1).经常被读取并且实时 ...

  2. day04元组

    元组 1.元祖书写规范 users=[11,22,33,"老男孩"]#列表(可变) users=(11,22,33,"老纳海")#元祖(不可变) 1.公共方法( ...

  3. WPF中获取控件默认样式和模板XML

    从微软官方找这个东西甚是困难,似乎根本没有提供.网上说因为版本问题,很难找到,但通过代码却可以轻易获得.经测试,生成的样式文件非常完美,完全不用修改即可应用. 代码如下: public static ...

  4. PythonStudy——高级语言 High-level programming language

    高级语言 高级语言(High-level programming language)相对于机器语言(machine language,是一种指令集的体系.这种指令集,称机器码(machine code ...

  5. 巧妇难为无米之炊( Model数据)

    一.相隔万里的客户端服务器数据交互 请求头发过去的轻量级文本数据,后台根据这些信息处理  response返回的如果时html的话,那么是全局刷新 在ajax中data回调获得了数据,然后操作dom进 ...

  6. ie 浏览器缓存问题

    Get请求在IE会存在缓存问题,最直接的办法  改成Post请求解决

  7. windows server 修改远程桌面连接端口号

    1. [运行]输入 regedit 2.  在注册表编辑器中找到以下PortNamber键,改为要使用的远程端口,如10000. HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ...

  8. python, Image

    PIL: Python Image Library, python平台的图像处理库,要使用Image首先要从PIL库导入Image: from PIL import Image 如果没有安装PIL的包 ...

  9. bootstrap弹出模态框会给body加padding的解决方法

    bootstrap弹出模态框会给body加padding,导致页面缩放的解决方法: 在页面或是css文件里加上($paddingSize为less变量,需要改成像素或是其他单位,如12px,1rem) ...

  10. c++ CreateProcess调用dos命令

    // test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include &l ...