JAVA结合testng断言verify(断言失败不中断继续执行)
原理:
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(断言失败不中断继续执行)的更多相关文章
- TestNg中的断言你真的了解吗
前言 在执行自动化测试脚本的时候,我们需要自动判断测试脚本执行完成后的实际结果是否与预期结果一致,这个时候就需要在程序运行之前写入断言,判断当前程序执行后是否正常. 关于TestNG断言分为两种: 软 ...
- Java基础语法<十一> 异常 断言 日志 调试
1 处理错误 1.1 异常分类 Error类层次描述了Java运行时系统的内部错误和资源耗尽错误. 设计Java程序时,主要关注Exception层次结构. 由程序错误导致的异常属于RuntimeEx ...
- Jmeter断言-所有断言讲解
Jmeter断言-所有断言讲解 jmeter中有个元件叫做断言(Assertion),它的作用和loadrunner中的检查点类似: 用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中 ...
- 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决
微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...
- Java+Selenium+Testng自动化测试学习(二)
Java+Selenium+TestNG自动化测试框架整合 1.简化代码 封装一个定位元素的类,类型为ElementLocation package com.test; import org.open ...
- JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,
如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...
- Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)
需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现 反射的过程如下: 第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...
- Java finally语句到底是在return之前还是之后执行(JVM字节码分析及内部体系结构)?
之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public ...
- Django在form提交CSRF验证失败. 相应中断问题
CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...
随机推荐
- 洛谷P1605:迷宫(DFS)
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右 ...
- 【HDU5187】contest
真的没有什么会写的东西了QAQ 原题: As one of the most powerful brushes, zhx is required to give his juniors n probl ...
- JS效果
多标签页效果 tab切换 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset ...
- 生产redis client 连接无法释放
原因是spring配置文件,开启了事务导致的,redis是缓存用的,不需要开启事务,正确的配置如下: <!--redis操作模版,使用该对象可以操作redis --> <bean i ...
- vue-demo(初级)
在使用WebStorm前把字符编码等等设置好! 使用WebStorm打开vue项目等待ide索引加载完成 注意要让WebStorm可以创建vue文件需要以下步骤: <template> & ...
- 1.1.8 怎样在Word的页眉中插入一级标题
可以通过域来实现,其具体的操作步骤: 1.为章.节标题使用标题样式.例如:章标题使用标题1样式,节标题使用标题2样式.操作方法:选中章(节)标题,然后点击选项卡中“样式”中的). 2.设置文档页眉和页 ...
- maya中MFnMesh.h使用说明的翻译
由于最近要修改一个maya中的deformer脚本,于是开始系统学习openMaya的一些知识,当然少不了得把一堆头文件说明看一遍.首先把MFnMesh.h这个文件翻译一下吧,不废话,上译文: 首先M ...
- calibre的注册表残留删除
卸载calibre后,注册表仍有残留 for /f %a in ('reg query HKEY_CLASSES_ROOT /f calibre /k') do reg delete %a /f
- mysql优化-数据库优化、SQL优化
我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) ...
- IDEA—— 找不到或无法加载主类Main
最近使用idea,编写了一个项目,发现老是找不到main,网上找了一大圈的解决方案,都不行.灵机一动升级了jdk就可以了,之前用的是1.7的,换成了1.8的就好了.