问题

我们在使用gtest工具进行测试时, 一般结果会直接输出到终端, 对阅读很不友好, 如何能够利用gtest测试的结果, 做成一个可以展示的html页面, 让gtest测试结果看上起一目了然, 清清楚楚, 是今天讨论的话题

概述

采用常规的方式, 直接在百度搜索, 关于展示gtest测试结果文章很少, 有的一些, 因为需要安装各种依赖或者其他因素, 用起来也不是非常友好.

但是经过不懈的搜索, 还是能够找到一些, 比如一些通过gtest将结果保存到xml中, 然后将xml转化成html, 最后展示出来.

实际gtest官方并没有提供一个成熟的直接美观展示gtest结果的工具, 网上存在的一些大多是基于gtest处理的中间结果进行展示的. 以下提供一些具体的方案.

前提

本文是展示gtest测试结果, 所以需要用gtest写一些测试程序, 关于gtest测试程序编写设计, 此处不在详述. 因下文的所有方法都是基于gtest输出xml结果进行处理的, 所以这里在运行gtest测试的时候, 需要使用
–gtest_output=xml: 保存输出结果.

此处从网上找了一个结果, 下文中会使用这个结果作为测试用:
test.xml

<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="22" failures="3" disabled="0" errors="0" time="73.802" name="AllTests"><testsuite name="TEST_CStart" tests="14" failures="0" disabled="0" errors="0" time="35.012"><testcase name="Normal_ORAY" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_ORAY" status="run" time="0" classname="TEST_CStart" /><testcase name="Normal_NOIP" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_NOIP" status="run" time="0.001" classname="TEST_CStart" /><testcase name="Normal_HIVIEW" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_HIVIEW" status="run" time="0" classname="TEST_CStart" /><testcase name="Normal_CHANGEIP" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_CHANGEIP" status="run" time="0.001" classname="TEST_CStart" /><testcase name="Normal_3322" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_3322" status="run" time="0" classname="TEST_CStart" /><testcase name="Normal_Dyndns" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_Dyndns" status="run" time="0" classname="TEST_CStart" /><testcase name="Normal_easy" status="run" time="5.001" classname="TEST_CStart" /><testcase name="WithInited_easy" status="run" time="0.001" classname="TEST_CStart" /></testsuite><testsuite name="TEST_CStop" tests="2" failures="0" disabled="0" errors="0" time="0"><testcase name="Normal" status="run" time="0" classname="TEST_CStop" /><testcase name="WithoutInited" status="run" time="0" classname="TEST_CStop" /></testsuite><testsuite name="TEST_DynipCInit" tests="1" failures="0" disabled="0" errors="0" time="0.001"><testcase name="Normal_DYNIP" status="run" time="0" classname="TEST_DynipCInit" /></testsuite><testsuite name="TEST_DynipCLogSet" tests="1" failures="0" disabled="0" errors="0" time="0"><testcase name="Normal_DYNIP" status="run" time="0" classname="TEST_DynipCLogSet" /></testsuite><testsuite name="TEST_DynipCRegist" tests="1" failures="1" disabled="0" errors="0" time="19.998"><testcase name="Normal_DYNIP" status="run" time="19.998" classname="TEST_DynipCRegist"><failure message="Value of: DynipCRegist(&amp;ptDynipCRInfo,dwDnsAddr)
  Actual: 4105
Expected: 0x1004
Which is: 4100" type=""><![CDATA[../_gtest.c:400
Value of: DynipCRegist(&ptDynipCRInfo,dwDnsAddr)Actual: 4105
Expected: 0x1004
Which is: 4100]]></failure></testcase></testsuite><testsuite name="TEST_DynipCRefresh" tests="1" failures="1" disabled="0" errors="0" time="3.795"><testcase name="Normal_DYNIP" status="run" time="3.795" classname="TEST_DynipCRefresh"><failure message="Value of: DynipCRefresh(&amp;ptDynipCRInfo,dwDnsAddr)
  Actual: 4117
Expected: 0x1014
Which is: 4116" type=""><![CDATA[../_gtest.c:413
Value of: DynipCRefresh(&ptDynipCRInfo,dwDnsAddr)Actual: 4117
Expected: 0x1014
Which is: 4116]]></failure></testcase></testsuite><testsuite name="TEST_DynipCDeleteRegist" tests="1" failures="1" disabled="0" errors="0" time="14.994"><testcase name="Normal_DYNIP" status="run" time="14.994" classname="TEST_DynipCDeleteRegist"><failure message="Value of: DynipCDeleteRegist(htonl(638699), htonl(3372250290UL),inet_addr(&quot;8.8.8.8&quot;))
  Actual: 4105
Expected: 0x1000
Which is: 4096" type=""><![CDATA[../_gtest.c:425
Value of: DynipCDeleteRegist(htonl(638699), htonl(3372250290UL),inet_addr("8.8.8.8"))Actual: 4105
Expected: 0x1000
Which is: 4096]]></failure></testcase></testsuite><testsuite name="TEST_CGetVersion" tests="1" failures="0" disabled="0" errors="0" time="0"><testcase name="Normal" status="run" time="0" classname="TEST_CGetVersion" /></testsuite>
</testsuites>

方法

方法一

github链接: https://github.com/NeilZhy/gtest-report-prettify
clone该项目代码, 按readme操作, 展示部分截图如下:

方法二

github链接:https://github.com/NeilZhy/gtest2html
clone该项目代码, 按readme执行操作, 此处若选择gtest2html.xslt, 则展示效果截图如下:

在readme的指令中, 可以将gtest2html.xslt替换成gtest2html2.xsl, 则展示效果截图如下:

提示: 方法二中使用的实际是一种方式, 只不过使用了不同的配置, 生成的页面效果不一样, 学习了解xslt的语法, 可以按照自己的风格生成多种多样的展示结果

方法三

github链接: https://github.com/NeilZhy/vjunit
clone项目代码, 按照readme说明操作, 展示截图如下:


需要注意的是, 方法三中的展示结果中没有总结果, 只有每一个测试的结果, 如果想要在结果中展示总结过, 可以修改test.xml, 复制一行

<testsuites tests="22" failures="3" disabled="0" errors="0" time="73.802" name="AllTests">

修改成

<testsuite tests="22" failures="3" disabled="0" errors="0" time="73.802" name="AllTests">
</testsuite>

粘贴到第三行的上面, 并和第三行保持对齐一致, 就可以生成比较好看的结果啦

总结

多使用github比使用搜索来的快些

展示gtest测试结果 -- 将gtest输出的xml结果转化成html展示相关推荐

  1. Gtest 测试指导 入门基础(A)

    Gtest 测试指导 入门基础(A) Table of Contents • 1 Gtest的基本使用,包括下载,安装,编译. o 1.1 下载 o 1.2 编译  1.2.1 Gtest静态库的编 ...

  2. gtest 测试部分_全部关于测试–第1部分

    gtest 测试部分 这是三个系列文章中的第一篇. 测试思路 技巧 工具和提示 心态 测试代码是需要学习的东西. 吸收如何做好需要花费时间. 这是一种应该始终练习和改进的技巧. 过去,开发人员没有进行 ...

  3. gtest 测试部分_全部关于测试–第2部分

    gtest 测试部分 这是有关测试的系列文章的第二篇. 在第一部分中,我解释了在开发测试时需要具备的心态. 或者,换句话说,开发可测试的代码. 在这一部分中,我将介绍一些测试方法的技术. 我将描述的技 ...

  4. 测试框架之GTest

    gtest是google的一个C/C++测试框架,由C++实现,可在http://code.google.com/p/googletest/下载其源码及库文件. gtest用法和cppunit用法差不 ...

  5. android hal单元测试,用于HAL测试的参数化gtest

    对于HAL接口,可能有多种实现.为了测试HAL实现的每个实例,标准方法是编写一个值参数化的gtest . 基本测试设置 gtest必须继承基类testing::TestWithParam ,其参数是每 ...

  6. 项目gtest测试框架 - GoogleTest(十)

    精简版本的C++单元测试框架 ,通过编写这个简单的测试框架,将有助于我们理解gtest. 1. 目录 类型 文件 说明 文件 ./CMakeLists.txt 整体项目工程文件 目录 ./debian ...

  7. LSTM模型在测试集上的输出全都是一样的怎么办

    为什么LSTM模型在测试集上的输出全都是一样的? 答:输入的幅值太大了!!把输入幅度缩放到0到1里去!!!

  8. 把aspx页面输出成xml的方法注意事项

    先贴代码 Response.Charset = "gb2312"; Response.ContentType = "text/xml"; Response.Co ...

  9. 将json对象输出为xml文件

    一.pom中引入jdom依赖 <dependency><groupId>org.jdom</groupId><artifactId>jdom</a ...

最新文章

  1. 数据中心是虚拟现实的基石
  2. 以ajax请求方式进行文件下载操作失败的原因及解决方案
  3. 《Effective C#》Item 15:利用using和try-finally来释放资源
  4. Google Palette算法详解以及OC化
  5. c语言项目为什么要build?(gcc、makefile、cmake(qmake)、CMakeLists.txt)(qmake、cmake、qbs区别解析)(qmake还是cmake,mingw作用)
  6. Asp.net HttpClient Proxy(Fiddler)
  7. t580 thinkpad_聊聊ThinkPad T580:除了大屏,还有什么
  8. 简单工厂模式、工厂方法模式与抽象工厂模式的区别(转)
  9. impala的详细介绍--图文描述
  10. [FFmpeg] 绘制矩形框
  11. 雅虎网站页面性能优化的34条黄金守则
  12. Apollo添加新的can通信接口的GPS设备
  13. ARRI阿莱MXF修复方法
  14. 2017百度之星程序设计大赛 - 资格赛 1004
  15. java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒
  16. 7-1 图深度优先遍历(c++)
  17. 360度反馈调查表中的问题示范
  18. 程序员,30岁+,看完让你不再焦虑
  19. too many open files in system报错处理方案
  20. CentOS8.1启动时出现Failed to start Switch Root错误如何解决?

热门文章

  1. 干货分享 | 大数据零基础学习路线:新手从入门到精通
  2. 常见2D和3D视觉算法
  3. location在php中什么意思,location是什么意思
  4. 个人项目总结------珠宝管理系统
  5. IOS-H5app逆向笔记
  6. JQ获取 改变css样式
  7. word2016 章节多行排序序号接着上面的
  8. bcedit双系统更改启动项名称_Win7/Win10双系统自动设置当前系统为默认启动项
  9. Spring--注解回顾
  10. 0x80000000