代码测试~

来源:互联网 发布:ipad做动画软件 编辑:程序博客网 时间:2024/05/20 18:46

 

几个link:

http://blog.csdn.net/ashhyc/archive/2007/04/10/1558598.aspx

http://www.itqun.net/content-detail/233955.html

http://blog.chinaunix.net/u2/66806/showart_2229074.html

http://hi.baidu.com/lianxl1983/blog/item/211b0a50fcbf645b1138c25e.html

 

Linux 下的代码覆盖率检查工具 gcov lcov 昨天试了试,遇到奇怪的问题

为各位看官方便,先把问题背景描述一下,下面节选网上的一段介绍 “
 

一、关于gcov工具
gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。
1、如何使用gcov
用GCC编译的时候加上-fprofile-arcs -ftest-coverage选项,链接的时候也加上。
fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这

些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵

工具代码。gcov主要使用.gcno和.gcda两个文件。
.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。
Gcov执行函数覆盖、语句覆盖和分支覆盖。

举个例子,程序代码由main.c和tmp.c两个文件组成,编译、链接、运行程序
编译:gcc -fprofile-arcs -ftest-coverage -o myapp main.c tmp.c
运行:./myapp
然后 输入
命令: gcov main.c,gcov tmp.c

这个时候当前目录下有了新的文档main.c.gcov,和tmp.c.gcov

……

 
   现在说我们的问题,加了-fprofile-arcs -ftest-coverage 选项编译后运行,但不是没有.gcda 就是缺少 .gcno 总不能一次全部输出,不过偶尔会出全。几经周折发现了问题的规律,特记录如下: 每次运行都需要重新编译 .o文件,否则就会出现上面描述的问题,其机理尚不清楚,解决办法,只能每次运行程序前先 清理掉 .o文件 然后编译,再运行即可输出 gcno ,gcda 供gcov使用。
 
  已找到问题是:gcda 文件只有在新程序执行后才生成,上次有脚本有误(可能是执行的不是新程序)导致了错误的判断。
 
note : lcov -z 会清除 .gcda 文件
 
 
参考  lcov 的使用方式
 

LCOV README 文件(翻译)

 

作者:终南   <li.zhongnan@hotmail.com>

-------------------------------------------------
- README file for the LTP GCOV extension (LCOV) -
- Last changes: 2008-11-17                      -
-------------------------------------------------

说明
-----------
GCOV 是一个 GNU 工具,当运行一个特定的测试用例后,通过GCOV 可以查看一个程序的那些代码被实际执行。 LCOV 是GCOV的一个扩展工具。该扩展由一套 PERL 脚本组成,基于 GCOV 的文本式输出来实现以下增强的功能:


    * 基于 HTML 的输出:使用条形图和不同的颜色来表示。

    * 支持大型项目:信息汇总页面提供三个层次的代码覆盖细节信息:目录视图、文件视图和源代码视图,允许快速浏览代码覆盖数据。

LCOV 最初为支持 Linux 内核代码覆盖评估而设计,但是同样可用于测量标准用户空间应用程序的代码覆盖率。


README 目录
-----------------------
1. 相关文件
2. 安装 LCOV
3. 如何访问内核代码覆盖数据的示例
4. 如何访问用户空间应用程序代码覆盖数据的示例
5. 问题和评论



1. 相关文件
------------------
README             - 该 README 文件
CHANGES           - 各发行版本的更新列表
bin/lcov                - 收集 LCOV 代码覆盖数据的工具
bin/genhtml         - 根据 LCOV 数据生成 HTML 输出的工具
bin/gendesc        - 创建说明文件的工具,同时也被 genhtml 使用
bin/geninfo         - 内部工具(创建 LCOV 数据文件)
bin/genpng          - 内部工具(创建源代码文件的 png 图形汇总信息)
bin/install.sh        - 内部工具(安装和卸载)
descriptions.tests - LTP 软件包的测试说明文件,被 gendesc 使用
man                      - 放置 LCOV 使用工具的 man 页面的目录
example               - 用来演示 LCOV 的示例文件目录
lcovrc                  - LCOV 配置文件
Makefile               - Makefile 文件,包含 'install' 和 'uninstall' 目标


2. 安装 LCOV
------------------
可以从以下页面选择下载 LCOV 软件包,RPM 或 tarball 形式:
    
http://ltp.sourceforge.net/coverage/lcov.php

为安装 tarball,将软件包解压到一个目录然后运行:

make install

也可以使用匿名 CVS 来获取最新版本(但可能是不稳定的版本):

cvs -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp login

(当询问密码时,按回车即可)

cvs -z3 -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp export -D now utils

切换到 utils/analysis/lcov 目录然后输入:

make install


3. 如何访问内核代码覆盖数据的示例
---------------------------------------------------
前提条件:从以下页面下载并安装 gcov-kernel 软件包:

http://sourceforge.net/projects/ltp

将最终的 gcov 内核模块文件复制到 system wide modules 目录或者 PERL 脚本所在目录。以 root 身份, 执行:

a) 重置计数器

     lcov --zerocounters

b) 收集当前代码覆盖状态到一个文件

     lcov --capture --output-file kernel.info

c) 获取 HTML 输出

     genhtml kernel.info

使用 web 浏览器打开 index.html 文件查看代码覆盖结果。


4. 如何访问用户空间应用程序代码覆盖数据的示例
---------------------------------------------------------------------
前提条件:使用 GCC 以 -fprofile-arcs 和-ftest-coverage 选项编译程序。假设编译目录名称为 "appdir",然后执行:

a) 重置计数器

     lcov --directory appdir --zerocounters

b) 收集当前代码覆盖状态到一个文件(应用程序启动和停止至少一次后,该命令才能正常工作)

     lcov --directory appdir --capture --output-file app.info

c) 获取 HTML 输出

     genhtml app.info

使用 web 浏览器打开 index.html 文件查看代码覆盖结果。


5. 问题和评论
-------------------------
参见软件包中的 man 页面,以便获取如何使用 LCOV 工具的详细信息。

有关这些工具的问题和评论,请通过电子邮件联系,LTP 电子邮件列表:ltp-coverage@lists.sourceforge.net

 

 原文地址 http://hi.baidu.com/li_zhongnan/blog/item/8a386bca49b4d241f31fe737.html