问题
我们在使用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比使用搜索来的快些