先从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);//可根据实际情况多个图片 全部一起returnreturn 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' οnclick='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. Android 10.0 关机对话框UI定制化开发(一)

    目录 1.概述 2.关机对话框UI定制的核心功能 1.概述 在10.0的定制化开发中,需要对关机对话框的UI界面进行定制化开发,需要对话框全屏,去掉多余项 保留关机 重启 飞行模式 静音模式等选项 现 ...

  3. kafka 自定义Interceptor(通过拦截器对消息进行定制化处理)

    文章目录 1. 说明 1.1 configure(configs) 1.2 onSend(ProducerRecord) 1.3 onAcknowledgement(RecordMetadata, E ...

  4. 平安保险基于 SPI 机制的 RocketMQ 定制化应用

    作者:孙园园|平安人寿资深开发 为什么选用 RocketMQ 首先跟大家聊聊我们为什么会选用 RocketMQ,在做技术选型的过程中,应用场景应该是最先考虑清楚的,只有确定好了应用场景在做技术选型的过 ...

  5. tensorflow 开始——创建定制化 Estimator(创建自定义评估器)

    参考文章:创建定制化 Estimator 文章目录 创建定制化 Estimator 预制 vs. 定制化 创建功能列 写一个模型函数 定义模型 定义输出层 隐藏层 输出层 实现训练.评估.预测 {#m ...

  6. 《秦时明月世界》手游如何用Unity定制化渲染管线?

    由玄机科技正版授权.魔方工作室群研发的经典国漫IP改编手游<秦时明月世界>,收获了广大玩家和原著粉丝们的一致好评,在TapTap上评分高达8.6.这款游戏是魔方工作室对3D大世界MMO的首 ...

  7. uniapp自定义条件编译-定制化产品

    背景 最近有个uniapp小程序产品,产品需要根据不同地区有不同的定制化需求,这边用到的是uniapp的自定义条件编译,实现一套前端代码,可以经过编译生成不同的定制化产品,并且不会因为是兼容了多个产品 ...

  8. eggjs的参数校验模块egg-validate的使用和进一步定制化升级

    简单讲一下这个egg-validate egg-validate是基于parameter的. 安装 npm install --save egg-validate 启用 // config/plugi ...

  9. 网站运行java_定制化Azure站点Java运行环境(5)

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

最新文章

  1. react-native(五)生成App
  2. win cmd rmdir /s递归删除目录
  3. Serverless Devs 的官网是如何通过 Serverless Devs 部署的?
  4. LFS、BLFS、ALFS、HLFS的区别详解
  5. 1.(单选题) HTML是指,《计算机应用基础》第五阶段在线作业(自测).doc
  6. 一条能让 iPhone 崩溃的 app 通知信息
  7. redis发布订阅者
  8. 在OSPF网络中,如何判断LSA的新旧?
  9. tt桌球瞄准器手机版_传闻老任将进军手机市场?任天堂独立直面会将于周四凌晨举行...
  10. thinkphp 按指定字段统计数据条数
  11. Atitit 常见触发器功能总结 目录 1.1. mysql触发器实例 插入数据前更改数据值.mhtml 1 1.2. 数据修改后更改数据值 1 1.3. 不能为空检测约束。。 1 2. Ref 2
  12. Android屏幕、坐标系、Padding、Margin
  13. 计算机一级C类试题及答案,计算机一级c类试题(2)
  14. 一次线上服务器cpu使用率超过1250%的排查与优化
  15. 鸟哥的linux私房菜学习笔记《二十》bash简介
  16. Nginx 代理本地文件
  17. HTML5个人博客首页demo
  18. 供应python少儿编程课_供的解释|供的意思|汉典“供”字的基本解释
  19. pcl点云处理基本步骤
  20. 7-6 哈利·波特的考试 (15 分)

热门文章

  1. while循环中,break,continue,return的差别
  2. hibernate-session中的方法
  3. 【SICP练习】136 练习3.67
  4. ACM-ICPC历届世界总冠军名单1977-2015
  5. PLSQL developer 连接不上64位Oracle 解决办法
  6. WebService(Axis2)视频教程与QQ交流群发布
  7. Swift3.0和OC桥接方法
  8. 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能
  9. 程序员都该懂点 HTTP
  10. 【TP3.2】路由匹配和规则