reportNG定制化之失败截图及日志

先从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



原文地址:https://www.cnblogs.com/longronglang/p/9219208.html

时间: 2024-10-09 19:56:07

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

OA系统信用盘新增三个极速彩版本定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 OA系统信用盘新增三个极速彩版    下载地址  QQ2952777280 OA系统信用盘新增三个极速彩版本程序源码参数说明: 运行环境:php5.2+mysql 源码类别:时时彩(彩票)现金网系统/两面盘 界面语言:繁体中文 源码授权:无加密文件及认证授权,永久性可直接使用. 版本支持:PC/WAP网页版 编程语言:PHP 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型

使用beanstalkd实现定制化持续集成过程中pipeline - 持续集成系列

持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中,最核心的一点就是,如何实现一个可定制化的任务流,即所谓的pipeline. 在传统的持续集成工具实现了pipeline功能,以供串联上下游job,并把多个job联系成一次完整的构建,例如jenkins的pipeline插件. 但是各种持续集成工具,或多或少都有自己的短板,总结起来如下: 1.配置并不

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

Java 8下PermGen及参数设置 ? 在上一章节中,我们定制化使用了Java 8环境,使用我们的测试页面打印出了JVM基本参数,但如果我们自己观察,会发现在MXBeans中,没有出现PermGen的使用数据,初始大小等信息,即使我们已经设置了大小: ? 在Java 7及以前版本中,PermGen主要存放加载的类的信息,如果设置过小,类加载失败,可能会出现OutOfMemory的经典错误,在Azure website里面的Java开发中,碰到的客户定制化设置的问题也会涉及到PermGen的大

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

简单讲一下这个egg-validate egg-validate是基于parameter的. 安装 npm install --save egg-validate 启用 // config/plugin.js exports.validate = { enable: true, package: 'egg-validate', }; 配置 // config/config.default.js exports.validate = { // convert: false, // validate

Sass产品 - 定制化与本地化

1. 微前端是什么 微前端主要借鉴后端微服务的概念.简单地说,就是将一个巨无霸(Monolith)的前端工程拆分成一个一个的小工程.它们完全具备独立的开发.运行能力.整个系统就将由这些小工程协同合作,实现所有页面的展示与交互. 可以跟微服务这么对比着去理解: 微服务 微前端 一个微服务就是由一组接口构成,接口地址一般是 URL.当微服务收到一个接口的请求时,会进行路由找到相应的逻辑,输出响应内容. 一个微前端则是由一组页面构成,页面地址也是 URL.当微前端收到一个页面 URL 的请求时,会进行

WebDriver - 添加失败截图

WebDriver失败截图可以通过两种方式实现: 1. Use WebdriverEventListener 第一步:创建自己的WebDriverEventListener 创建自己的WebDriverEventListener 重写Onexception 方法, 当webdriver 遇到异常的时候执行截图动作. import java.io.File; import java.io.IOException; import java.io.FileOutputStream; import ja

定制化Azure站点Java运行环境(1)

Azure website提供了为现代化的web应用程序快速部署的PAAS平台,可以让用户几分钟之内快速的将自己的应用部署到云端,并且提供了自动扩展(auto-scaling),SSL,多种语言(Java,Python,PHP, Node.JS, .Net) 等的支持,并且可以和其他Azure服务无缝整合等特性,赢得了很多用户的青睐. 作为PAAS平台,Azure website的app运行环境,OS等底层设施都由微软进行管理,用户只需要关心自己的App和Data即可,但在一些情况下,用户希望能

大数据平台一键安装OS【定制化OS镜像制作】

 定制化 大数据平台一键安装OS 大数据平台一键安装OS系列 大数据平台一键安装OS[搭建脚本篇] 定制化OS镜像制作 1.操作环境 操作环境:VMware Workstarion 9 and vSphere client 系统:CentOS -6.8-x86_64 工具:gconf-editor anaconda repodata createrepo mkisofs rsync 2.主要思路 定制化是通过kickstart脚本来实现的,linux系统安装完毕后在root目录下会生成anaco

定制化Azure站点Java运行环境(3)

定制化Azure Website提供的默认的Tomcat和JDK环境 在我们之前的测试中,如果你访问你的WEB站点URL时不加任何上下文,实际上你看到的web界面是系统自带的测试页面index.jsp,位于/site/wwwroot/webapps/ROOT目录下,是Tomcat默认的根目录. 由于要检测JVM的usage信息以便确定,定制化修改的Java参数是否生效,所以我们需要写一些测试代码,打印出当前JVM的参数信息;首先使用FileZilla连接到你的网站,进入到/site/wwwroo