原理:

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, "比较两个数是否相等:");
} }

最新文章

  1. POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心
  2. spark示例
  3. linux 修改home目录下的中文目录名为英文
  4. 【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)
  5. Swift的笔记和参考
  6. 【转】NuGet的安装与使用
  7. PHP多维数组元素操作类
  8. 财付通API
  9. (转)Spring boot——logback.xml 配置详解(二)
  10. vue学习心得
  11. SSH深度历险(五) 深入浅出-----IOC AND AOP
  12. GC垃圾回收
  13. Log4j2 HelloWorld
  14. 修改linux 默认SHELL
  15. script利用src引用外部js文件,如果内部嵌套了js代码呢
  16. [笔记]_ELVE_正则表达式
  17. [转] react-router4 实现按需加载
  18. NullPointerExceptio异常出现的情况
  19. 解决IE9下交通银行网上银行无法输入密码的问题
  20. Canvas 绘画

热门文章

  1. 阿里云centos7使用yum安装mysql的正确姿势
  2. Nginx安装详细指南
  3. 用doxygen自动生成文档
  4. liunx top命令详解
  5. 第一章 C#入门 (Windows窗体应用程序)(一)
  6. [蓝桥杯]PREV-8.历届试题_买不到的数目
  7. PAT 乙级 1065 单身狗 (25 分)
  8. C++ Programming Language中的narrow_cast实现
  9. Linux安装rz/sz,htop插件
  10. 团队第一次 # scrum meeting