zoukankan      html  css  js  c++  java
  • 嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

    在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率、函数覆盖率,分支覆盖率的数据。

    便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效果,以及指引测试改进的方向。经过多次尝试和研究,

    在嵌入式平台上可以使用gcov这个工具,不过操作稍微复杂点。

    环境要求:

    1、有被测组件的源代码

    2、对应平台的交叉编译器必须包含gcov功能

    3、安装好lcov工具

    4、相应的嵌入式设备

    使用gcov/lcov测试代码覆盖率,总共分为四步:

    1、在组件编译中添加gcov编译参数,然后编译debug版本,同时生成gcno文件

    2、在gtest编译中使用添加编译参数的组件

    3、执行生成的程序,生成代码覆盖文件gcda

    4、使用lcov工具解析gcno和gcda文件,生成html报表文件

     

    下面详细说明四个步骤如何操作:

     

    1、在组件编译中添加编译参数

    我们测试的是组件,文件形式是静态库(.a)或者动态库(.so)。为了统计测试的代码覆盖率,我们需要在编译的时候添加如下参数。

    需要添加的编译参数为:-fprofile-arcs -ftest-coverage;同时添加参数对应的库lgcov

    添加完成后,进行编译。然后查找,找到生成的后缀名为gcno文件的话,则说明成功。

    重要:gcno文件生成的路径,这个一般是根据Makefile脚本指定的不同路径来确定的,有的时候与源代码在一起,有的时候与中间文件在一起。

               但是不管gcno的路径在哪里,要记住这个路径。后续有用的。

    2、在gtest编译中使用带gcov的组件

    A、修改编译脚本,添加-lgcov 编译参数

    B、把使用的库文件替换为添加gcov编译参数的组件

    (如何在嵌入式平台中使用gtest,请参考 http://www.cnblogs.com/StitchSun/p/4430362.html

    3、执行gtest测试程序

       把编译好的测试程序在对应的设备上执行测试,执行没有错误后,然后查看嵌入式设备的目录,到与生成gcno路径一致的目录下,查找gcda文件

       gcda文件生成路径为编译时生成gcno的路径,不过gcno是在编译服务器上,gcda是在程序运行的嵌入式设备上。

     

    4、使用lcov解析gcda和gcno文件

       把设备的gcda文件下载到编译服务器,同时把编译时生成的gcno文件也复制到同一个目录。

       对于前面名称相同的文件,gcda和gcno文件必须在同一目录下。    

     

       要使用lcov工具,可以在http://ltp.sourceforge.net/coverage/lcov.php 下载最新的版本。

       但是这个工具无法直接解析嵌入式平台产生的gcno和gcda格式的文件,需要修改一个地方。

       即这个工具默认的是使用linux系统自带的gcov,需要修改为使用交叉编译器的gcov工具。

       修改的文件为:bin/geninfo 的,把原来的gcov修改为交叉编译的gcov。

     

    修改完成,保存退出。

    以使用的isi3518 交叉编译器为例,执行下面的命令:

         a   /opt/lcov_test/hisi3518/lcov-1.9/bin/lcov -d . -t 'test' -o 'test.info' -b . -c


     

         b   /opt/lcov_test/hisi3518/lcov-1.9/bin/genhtml -o result test.info

           

            

          看到上面的提示,说明执行成功了。把result文件夹下载到windows上,打开里面的index,就可以看到结果了。

         

    常见问题:

    1、geninfo: ERROR: …: reached unexpected end of file

     注意,lcov 最好使用 1.9 及以上版本,否则可能遇到如下错误:

    geninfo: ERROR: …: reached unexpected end of file

     

    2、 gcov解决stamp mismatch with graph file

    使用 hexdump -e '"%x "' -s8 -n4 命令分别解析 XXX.gcno和XXX.gcda文件

    如果生成的码不一致,则说明gcno和gcda不是一次编译生成的,需要重新编译。

    命令使用如下:

    hexdump -e '"%x "' -s8 -n4 dns_shell.gcno 

    3、找不到源代码

    在解析gcno和gcda时,要和源代码在一个服务器上,并且源代码的路径在生成gcno和gcda后

    没有变动过。不然会提示找不到源代码。

     

    参考:

    在研究中,下面的链接有很大的帮助。表示感谢。

    http://blog.sina.com.cn/s/blog_7e4ac8b501018b27.html

     这个参考中的第三步  gcov产生报告信息: test.c.gcov  不用执行

  • 相关阅读:
    浅谈数论
    浅谈数论
    bzoj2190 [SDOI2008]仪仗队
    bzoj2190 [SDOI2008]仪仗队
    35.QQ大数据模型
    34.函数指针数组和多线程
    33.函数指针相关问题
    32.分配数组的方式
    31.内存分配四大函数以及栈上分配内存
    30.锯齿数组
  • 原文地址:https://www.cnblogs.com/StitchSun/p/4480229.html
Copyright © 2011-2022 走看看