展示gtest测试结果 -- 将gtest输出的xml结果转化成html展示
问题
我们在使用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(&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(&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("8.8.8.8"))
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展示相关推荐
- Gtest 测试指导 入门基础(A)
Gtest 测试指导 入门基础(A) Table of Contents • 1 Gtest的基本使用,包括下载,安装,编译. o 1.1 下载 o 1.2 编译 1.2.1 Gtest静态库的编 ...
- gtest 测试部分_全部关于测试–第1部分
gtest 测试部分 这是三个系列文章中的第一篇. 测试思路 技巧 工具和提示 心态 测试代码是需要学习的东西. 吸收如何做好需要花费时间. 这是一种应该始终练习和改进的技巧. 过去,开发人员没有进行 ...
- gtest 测试部分_全部关于测试–第2部分
gtest 测试部分 这是有关测试的系列文章的第二篇. 在第一部分中,我解释了在开发测试时需要具备的心态. 或者,换句话说,开发可测试的代码. 在这一部分中,我将介绍一些测试方法的技术. 我将描述的技 ...
- 测试框架之GTest
gtest是google的一个C/C++测试框架,由C++实现,可在http://code.google.com/p/googletest/下载其源码及库文件. gtest用法和cppunit用法差不 ...
- android hal单元测试,用于HAL测试的参数化gtest
对于HAL接口,可能有多种实现.为了测试HAL实现的每个实例,标准方法是编写一个值参数化的gtest . 基本测试设置 gtest必须继承基类testing::TestWithParam ,其参数是每 ...
- 项目gtest测试框架 - GoogleTest(十)
精简版本的C++单元测试框架 ,通过编写这个简单的测试框架,将有助于我们理解gtest. 1. 目录 类型 文件 说明 文件 ./CMakeLists.txt 整体项目工程文件 目录 ./debian ...
- LSTM模型在测试集上的输出全都是一样的怎么办
为什么LSTM模型在测试集上的输出全都是一样的? 答:输入的幅值太大了!!把输入幅度缩放到0到1里去!!!
- 把aspx页面输出成xml的方法注意事项
先贴代码 Response.Charset = "gb2312"; Response.ContentType = "text/xml"; Response.Co ...
- 将json对象输出为xml文件
一.pom中引入jdom依赖 <dependency><groupId>org.jdom</groupId><artifactId>jdom</a ...
最新文章
- 数据中心是虚拟现实的基石
- 以ajax请求方式进行文件下载操作失败的原因及解决方案
- 《Effective C#》Item 15:利用using和try-finally来释放资源
- Google Palette算法详解以及OC化
- c语言项目为什么要build?(gcc、makefile、cmake(qmake)、CMakeLists.txt)(qmake、cmake、qbs区别解析)(qmake还是cmake,mingw作用)
- Asp.net HttpClient Proxy(Fiddler)
- t580 thinkpad_聊聊ThinkPad T580:除了大屏,还有什么
- 简单工厂模式、工厂方法模式与抽象工厂模式的区别(转)
- impala的详细介绍--图文描述
- [FFmpeg] 绘制矩形框
- 雅虎网站页面性能优化的34条黄金守则
- Apollo添加新的can通信接口的GPS设备
- ARRI阿莱MXF修复方法
- 2017百度之星程序设计大赛 - 资格赛 1004
- java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒
- 7-1 图深度优先遍历(c++)
- 360度反馈调查表中的问题示范
- 程序员,30岁+,看完让你不再焦虑
- too many open files in system报错处理方案
- CentOS8.1启动时出现Failed to start Switch Root错误如何解决?