51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2751|回复: 2
打印 上一主题 下一主题

[转贴] ReportNg 测试报告的定制修改

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-20 14:12:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言
前段时间在Testerhome上面看到了测试报告生成系列之-------如何用 testNG 生成测试报告 简单的描述了一些测试报告的生成,接着有人在评论中回复说可以针对reportNg的测试报告做一些定制化的修改,并且还附上了一张截图。这里我们看下修改后的效果图




确实是比reportNg原生的测试报告好看多了。



,那下来我们就来看看如何去修改我们的reportNg
正文
我们先从github上拉下 reportNg的源代码 reportng , 我们先看下整体的目录结构:




因为我们是要修改html的生成,所以说我们大部分要修改的内容都是在resources下进行。
  • reportng.properties 增加部分类表项
    这里我们直接在末尾添加
    1. log=Log Info
    2. screenshot=Screen Shot
    3. duration=Duration
    复制代码

  • results.html.vm 修改结果的html,我们目前只修改fail的情况下。
    1. #if ($failedTests.size() > 0)
    2.   <table class="resultsTable">
    3.     <tr><th colspan="5" class="header failed">$messages.getString("failedTests")</th></tr>
    4.     #foreach ($testClass in $failedTests.keySet())
    5.       <tr>
    6.           <td colspan="1" class="group">$testClass.name</td>
    7.           <td colspan="1" class="group">$messages.getString("duration")</td>
    8.           <td colspan="1" class="group">$messages.getString("log")</td>
    9.           <td colspan="1" class="group">$messages.getString("screenshot")</td>
    10.       </tr>
    11.       #set ($classResults = $failedTests.get($testClass))
    12.       #parse ("org/uncommons/reportng/templates/html/class-results.html.vm")
    13.     #end
    14.   </table>
    15. #end
    复制代码

  • class-results.html.vm 这里是修改具体的内容显示
    1. ## Show logger output for the test.
    2.     #set ($output = $utils.getTestOutput($testResult))
    3.     #if ($output.size() > 0)
    4.     <div class="testOutput">
    5.       #foreach( $line in $output )
    6.         #if ($meta.shouldEscapeOutput())
    7.           $utils.escapeHTMLString($utils.removeImage($line))<br />
    8.         #else
    9.             $utils.removeImage($line)<br />
    10.         #end
    11.       #end
    12.     </div>
    13.     #end
    复制代码
    修改以上部分
    1. <td class="screenshot">
    2.     #set ($output = $utils.getTestOutput($testResult))
    3.     #if ($output.size() > 0)
    4.         <div class="screenshotimage">
    5.             #foreach( $line in $output )
    6.                 #if ($meta.shouldEscapeOutput())
    7.                     $utils.escapeHTMLString($utils.getImageString($line))<br />
    8.                 #else
    9.                     $utils.getImageString($line)<br />
    10.                 #end
    11.             #end
    12.         </div>
    13.     #end
    14. </td>
    复制代码
    新增以上部分
    上面出现的两个方法getImageString,removeImage。 就是提取含有img标签的字符串和去除带有img标签的字符串
  • ReportNGUtils.java 新增两个方法
    1. public String getImageString(String s)
    2. {
    3.     String regex = "(<img(.*?)/>)";
    4.     Pattern pattern = Pattern.compile(regex);
    5.     Matcher matcher = pattern.matcher(s);
    6.     while (matcher.find()) {
    7.         String group = matcher.group(1);
    8.         //可根据实际情况多个图片 全部一起return
    9.         return group;
    10.     }
    11.     return "";
    12. }

    13. public String removeImage(String s)
    14. {
    15.     return  s.replaceAll("<img(.*?)/>","");
    16. }
    复制代码
    以上就是reportNg修改源代码的位置了
  • 下来就是我们的测试代码了。实际上很简单 直接一个断言,接着在用例结束的时候判断结果是否失败,是的话就截图。
    1. @Test
    2. public void careInterfaceSmoke(){
    3.     Assert.assertEquals(1,2);
    4. }

    5. @AfterMethod(alwaysRun = true)
    6. public void afterMethod(ITestResult result) throws Exception {
    7.     if (!result.isSuccess())
    8.         catchExceptions(result);
    9. }

    10. public void catchExceptions(ITestResult result) {
    11.     System.out.println("result" + result);
    12.     String methodName = result.getName();
    13.     System.out.println(methodName);
    14.     if (!result.isSuccess()) {
    15.         File file = new File("");
    16.         Reporter.setCurrentTestResult(result);
    17.         System.out.println(file.getAbsolutePath());
    18.         Reporter.log(file.getAbsolutePath());
    19.         String filePath = file.getAbsolutePath();
    20.         filePath  = filePath.replace("/opt/apache-tomcat-7.0.64/webapps","http://172.18.44.114:8080");
    21.         Reporter.log("<img src='"+filePath+"/"+result.getName()+".jpg' height='100' width='100'/>");
    22.         int width = 100;
    23.         int height = 100;
    24.         String s = "这是一张测试图片";
    25.         File screenShotFile = new File(file.getAbsolutePath()+"/"+result.getName()+".jpg");

    26.         Font font = new Font("Serif", Font.BOLD, 10);
    27.         BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    28.         Graphics2D g2 = (Graphics2D)bi.getGraphics();
    29.         g2.setBackground(Color.BLACK);
    30.         g2.clearRect(0, 0, width, height);
    31.         g2.setPaint(Color.RED);

    32.         FontRenderContext context = g2.getFontRenderContext();
    33.         Rectangle2D bounds = font.getStringBounds(s, context);
    34.         double x = (width - bounds.getWidth()) / 2;
    35.         double y = (height - bounds.getHeight()) / 2;
    36.         double ascent = -bounds.getY();
    37.         double baseY = y + ascent;

    38.         g2.drawString(s, (int)x, (int)baseY);

    39.         try {
    40.             ImageIO.write(bi, "jpg", screenShotFile);
    41.         } catch (IOException e) {
    42.             e.printStackTrace();
    43.         }
    复制代码
    catchExceptions方法中图片只是为了测试生成了一张图片,实际可以通过对应的测试框架的api方法进行截图操作的。

以上就是基本的内容了,但是还一定要记得在pom.xml配置的时候增加一句
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-surefire-plugin</artifactId>
  4.     <version>2.18.1</version>
  5.     <configuration>
  6.        <systemPropertyVariables>
  7.            <org.uncommons.reportng.escape-output>false</org.uncommons.reportng.escape-output>            
  8.        </systemPropertyVariables>
  9.        ....
  10.     <configuration>
复制代码
上面配置的做用是为了报告中的显示不会单纯的显示出html,而且能够正确的加载出html,生成的报告结果就如下了。




总结
感觉上面的方法还是有点取巧的了,感觉真正的方法应该不是如此,不过实在是google了很久,都没有相应的代码,希望有经验的大神,能够指教下正确的做法。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2017-6-20 14:23:37 | 只看该作者


楼主,我这边说一下我的看法:

第一:你把报告里面放截图我个人觉得不实用,因为你想一下如果这份报告给别人看的话内容太多需要滚动条拉下去好几页,别人根本不会去看!
第二:我个人觉得你在一轮测试的时候重点应该把重要得东西放在报告里面,比如说失败的测试用例呈现在报告里面而而错误的重要log标题可以选择高亮(最好加一些自己的打点来定位问题)
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2017-6-20 14:31:28 | 只看该作者
巴黎的灯光下 发表于 2017-6-20 14:23
楼主,我这边说一下我的看法:

第一:你把报告里面放截图我个人觉得不实用,因为你想一下如果这份报 ...

其实我到时觉得测试报告里面放置截图并没有什么不妥,另外其实我想说的截图并不是一个重点,因为我只是提供一个思路去修改reportNg完成可以根据自己公司的需要来修改,只是我觉得这种修改方式貌似不太对。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-25 17:36 , Processed in 0.071156 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表