先从github上拉下 reportNg的源代码 reportng 

拉下源码后我们使用IDEA进行导入

1、reportng.properties 增加部分类表项

这里我们直接在末尾添加

log=Log Info
screenshot=Screen Shot
duration=Duration

  

2、results.html.vm 修改结果的html,我们目前只修改fail的情况下。

#if ($failedTests.size() > 0)

  <table class="resultsTable">
<tr><th colspan="5" class="header failed">$messages.getString("failedTests")</th></tr>
#foreach ($testClass in $failedTests.keySet())
<tr>
<td colspan="1" class="group">$testClass.name</td>
<td colspan="1" class="group">$messages.getString("duration")</td>
<td colspan="1" class="group">$messages.getString("log")</td>
<td colspan="1" class="group">$messages.getString("screenshot")</td>
</tr>
#set ($classResults = $failedTests.get($testClass))
#parse ("org/uncommons/reportng/templates/html/class-results.html.vm")
#end
</table> #end

3、我们在class-results.html.vm中最后加入一列,来显示图片,注意我们使用的是$utils.getImageString($line)而不是$utils.escapeHTMLString($utils.removeImage($line))

 <td class="screenshot">
#set ($output = $utils.getTestOutput($testResult))
#if ($output.size() > 0)
<div class="screenshotimage">
#foreach( $line in $output )
#if ($meta.shouldEscapeOutput())
$utils.getImageString($line)<br />
#else
$utils.getImageString($line)<br />
#end
#end
</div>
#end
</td>

  上面出现的两个方法getImageString,removeImage。 就是提取含有img标签的字符串和去除带有img标签的字符串。 
可以在ReportNGUtils.java中看到,生成到报告中的内容如果用escapeHTMLString会被转义,这里插入的图片我们之后通过Reporter.log()方式写入,因此写入的标签我们不希望被转义。

public String escapeString(String s)
{
if (s == null)
{
return null;
} StringBuilder buffer = new StringBuilder();
for(int i = 0; i < s.length(); i++)
{
buffer.append(escapeChar(s.charAt(i)));
}
return buffer.toString();
} /**
* Converts a char into a String that can be inserted into an XML document,
* replacing special characters with XML entities as required.
* @param character The character to convert.
* @return An XML entity representing the character (or a String containing
* just the character if it does not need to be escaped).
*/
private String escapeChar(char character)
{
switch (character)
{
case '<': return "&lt;";
case '>': return "&gt;";
case '"': return "&quot;";
case '\'': return "&apos;";
case '&': return "&amp;";
default: return String.valueOf(character);
}
}
public String escapeHTMLString(String s)
{
if (s == null)
{
return null;
} StringBuilder buffer = new StringBuilder();
for(int i = 0; i < s.length(); i++)
{
char ch = s.charAt(i);
switch (ch)
{
case ' ':
// All spaces in a block of consecutive spaces are converted to
// non-breaking space (&nbsp;) except for the last one. This allows
// significant whitespace to be retained without prohibiting wrapping.
char nextCh = i + 1 < s.length() ? s.charAt(i + 1) : 0;
buffer.append(nextCh==' ' ? "&nbsp;" : " ");
break;
case '\n':
buffer.append("<br/>\n");
break;
default:
buffer.append(escapeChar(ch));
}
}
return buffer.toString();
}

4.ReportNGUtils.java 新增两个方法

public String getImageString(String s)
{
String regex = "(<img(.*?)/>)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
String group = matcher.group(1);
//可根据实际情况多个图片 全部一起return
return group;
}
return "";
} public String removeImage(String s)
{
return s.replaceAll("<img(.*?)/>","");
}

5.下来就是我们的测试代码了。实际上就是用例结束的时候判断结果是否失败,是的话就将你设置的图片写入report。我们这里还实现了点击图片在新窗口显示大图的功能,由于我们的图片名称为x:\xx\xx\xx.png,放入window.open语句中需要转义,我们将x:\xx\xx\xx.png转换为x:\\xx\\xx\\xx.png

 @AfterMethod(alwaysRun = true)
public void afterMethod(ITestResult result) throws Exception {
if (!result.isSuccess())
catchExceptions(result);
} public void catchExceptions(ITestResult result) {
System.out.println("result" + result);
String methodName = result.getName();
System.out.println(methodName);
if (!result.isSuccess()) {
File file = new File("snapshot");
Reporter.setCurrentTestResult(result);
System.out.println(file.getAbsolutePath());
Reporter.log(file.getAbsolutePath());
String filePath = file.getAbsolutePath();
String dest = result.getMethod().getRealClass().getSimpleName()+"."+result.getMethod().getMethodName();
String picName=filePath+File.separator+dest+super.runtime;
String escapePicName=escapeString(picName);
System.out.println(escapePicName);
String html="<img src='"+picName+".png' onclick='window.open(\""+escapePicName+".png\")'' hight='100' width='100'/>";
Reporter.log(html); }
}
/**
* 替换字符串
* @param 待替换string
* @return 替换之后的string
*/
public String escapeString(String s)
{
if (s == null)
{
return null;
} StringBuilder buffer = new StringBuilder();
for(int i = 0; i < s.length(); i++)
{
buffer.append(escapeChar(s.charAt(i)));
}
return buffer.toString();
} /**
* 将\字符替换为\\
* @param 待替换char
* @return 替换之后的char
*/
private String escapeChar(char character)
{
switch (character)
{
case '\\': return "\\\\";
default: return String.valueOf(character);
}
}

6.OK,以上我们已经完成了失败时图片写入report的代码,下面我们还要设置一下reportNG中的pom.xml;

 <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<systemPropertyVariables>
<org.uncommons.reportng.escape-output>false</org.uncommons.reportng.escape-output>
</systemPropertyVariables> </configuration>
</plugin>
<!--插件-->
<!--配置JDK版本,因为默认Maven是1.3版本的-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source><!--版本号-->
<target>1.8</target><!--版本号-->
</configuration>
</plugin>
</plugins>
</build>

7.接下来,我们开始打包reportNG项目; 
右键build.xml,选择Add as Ant Build File

此时IDEA右侧出现ant打包步骤,我们双击release开始打包吧!

打包成功

若出现(请使用 -source 7 或更高版本)等错误,需要在build.xml加入你的source和target版本(JDK版本) 

<!-- Build all Java code. -->
<target name="compile" description="Compile the source." >
<uncommons:compile module="reportng" source="1.8" target="1.8" />
</target>

  

这是因为reportNG通过antlib外部lib文件 uncommons-antlib-0.3.2.jar进行依赖,使用Ant build进行release的,查看uncommons-antlib文件,打开其中antlib.xml,我们可以发现其编译指定默认的jdk版本为1.5,所以如果出现版本问题,请如上修改。 

至此,我们可以去reportng-master\release取我们的jar包了,最终失败截图效果如下 

转载:https://blog.csdn.net/jjj0817/article/details/74626511
												

reportNG定制化之失败截图及日志的更多相关文章

  1. AI应用开发实战 - 定制化视觉服务的使用

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

  2. PLDroidPlayer 是七牛推出的一款免费的适用于 Android 平台的播放器 SDK,采用全自研的跨平台播放内核,拥有丰富的功能和优异的性能,可高度定制化和二次开发。 https://developer.qiniu.com/pili/sdk/…

    PLDroidPlayer PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单.快捷的接口,帮助开发者在 ...

  3. kettle系列-4.kettle定制化开发工具类

    要说的话这个工具类还是比较简单的,每个方法体都比较小,但用起来还是可以的,把开发中一些常用的步骤封装了下,不用去kettle源码中找相关操作的具体实现了. 算了废话不多了,直接上重点,代码如下: im ...

  4. selenium测试报告(含通过率统计图和失败截图)

    前言: 介绍的是含饼状统计图及失败截图的测试报告文件. 原文地址:https://testerhome.com/topics/9984 此版本增加了如下功能 测试报告完全汉化,包括错误日志的中文处理 ...

  5. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  6. Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段

    在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...

  7. cobbler重装、web、定制化

    cobbler重装 根据此文已自动化安装centos 7的版本http://www.cnblogs.com/shhnwangjian/p/5858900.html 在cobbler-test主机上重装 ...

  8. 定制化Azure站点Java运行环境(5)

    Java 8下PermGen及参数设置 在上一章节中,我们定制化使用了Java 8环境,使用我们的测试页面打印出了JVM基本参数,但如果我们自己观察,会发现在MXBeans中,没有出现PermGen的 ...

  9. python+robot framework实现测报告定制化和邮件发送

    前面已经介绍了python+robot framework自动化框架和基本原理的实现,详情请看 python+robot framework接口自动化测试 本章主要讲解报告已经产生那如何以自动化的方式 ...

随机推荐

  1. [Android] Android 使用 Greendao 操作 db sqlite

    Android 使用 Greendao 操作 db sqlite GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣.它减轻开发人员处理低级数据库需求,同时节省开发 ...

  2. 记录MySQL的一些基础操作

    MySQL建表操作 root@localhost 08:05:22> create table stu( -> id int(4) not null, -> name char(20 ...

  3. tomcat优化之安装并配置apr库

    在谈到tomcat优化时,必然要说到apr库,这个库是C语言实现的,tomcat通过JNI方式使用该库可以大大提高性能. tomcat在使用apr时需要安装apr,apr-util和tomcat-na ...

  4. C#控件绘图恢复最小化后不自动重绘问题

    最近在学习C#中的绘图,使用控件绘图时发现一个现象:即使将绘图代码写在了Paint方法中,将窗口最小化再恢复后依然不会重绘,而只有将鼠标移到控件上或者有其他改变窗口的行为时才会重绘. 一开始以为是自己 ...

  5. eventproxy 介绍这款好用的工具,前端事件式编程的思维

    前端事件式编程 <script src="eventproxy.js"></script> <script> // EventProxy此时是一 ...

  6. C++获取MAC与IP

    #include <Nb30.h> #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"netapi ...

  7. Android 常见异常及解决办法

    Ø  前言 本文主要记录 Android 的常见异常及解决办法,以备以后遇到相同问题时可以快速解决. 1.   java.lang.NullPointerException: Attempt to i ...

  8. 十一、移植优化---CONFIG 优化进 menuconfig(2)

    11.3 jz2440.h 中的剩余宏移植 11.3.1 CONFIG_SYS_TEXT_BASE CONFIG_SYS_TEXT_BASE:设置系统代码段的基地址,设为 0x0:menuconfig ...

  9. [译]使用Command模式和MediatR简化你的控制器

    原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...

  10. 【bzoj 2002】弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...