欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

展示C代码覆盖率的gcovr工具简介及相关命令使用示例

程序员文章站 2022-07-01 18:33:36
最近,因为要展示某项目的单元测试的代码覆盖率,我无意间在网上找到了gcovr工具。使用之后,觉得这个工具相当的不错,于是便写下这篇文章,可供相关的开发人员参考。 简而言之,gcovr是一个将单元测试...

最近,因为要展示某项目的单元测试的代码覆盖率,我无意间在网上找到了gcovr工具。使用之后,觉得这个工具相当的不错,于是便写下这篇文章,可供相关的开发人员参考。

简而言之,gcovr是一个将单元测试中的代码覆盖率以多种方式(包括列表方式、xml文件方式、html网页方式等)展示出来的工具,目前最新的版本是3.2。gcovr的下载地址是:https://pypi.python.org/pypi/gcovr/。

该工具运行在linux之下,解压后,将scripts目录下的gcovr拷贝到/usr/bin目录下就可以了。

下面以寻找栈的增长方向的findstackdirection.c程序为例,介绍gcovr的使用方法。

程序源代码为:

/**********************************************************************
* 版权所有 (c)2015, zhou zhaoxiong。
*
* 文件名称:findstackdirection.c
* 文件标识:无
* 内容摘要:寻找栈的增长方向
* 其它说明:无
* 当前版本:v1.0
* 作    者:zhou zhaoxiong
* 完成日期:20151218
*
**********************************************************************/
#include 

// 重定义数据类型
typedef unsigned char  uint8;
typedef signed   int   int32;

// 函数声明
void findstackdirection(void);


/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号      修改人              修改内容
* ---------------------------------------------------------------
* 20151218        v1.0     zhou zhaoxiong          创建
***********************************************************************/
int32 main()
{
    findstackdirection();

    return 0; 
}


/**********************************************************************
* 功能描述:查找栈增长方向
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号      修改人              修改内容
* ---------------------------------------------------------------
* 20151218        v1.0     zhou zhaoxiong          创建
***********************************************************************/
void findstackdirection(void)
{
    uint8  istackaddr        = 0;        // 用于获取栈地址
    static uint8 *pstackaddr = null;     // 用于存放第一个istackaddr的地址 

    if (pstackaddr == null)              // 第一次进入
    {                          
        pstackaddr = &istackaddr;        // 保存istackaddr的地址
        findstackdirection();            // 递归 
    }
    else                                 // 第二次进入 
    {  
        if (&istackaddr > pstackaddr)        // 第二次istackdirection的地址大于第一次istackdirection, 那么说明栈增长方向是向上的
        {   
            printf("stack grows up!\n");
        }
        else if (&istackaddr < pstackaddr)   // 第二次istackdirection的地址小于第一次istackdirection, 那么说明栈增长方向是向下的
        {  
            printf("stack grows down!\n");
        }
        else
        {
            printf("bad stack!\n");
        }
    }
} 

1.程序编译及执行
将示例程序上传到linux机器上,并在程序所在的目录下使用“gcc -fprofile-arcs -ftest-coverage -fpic -o0 findstackdirection.c -o findstackdirection”命令对程序进行编译,生成findstackdirection.gcno和findstackdirection文件。

编译命令中的“-fprofile-arcs -ftest-coverage -fpic”用于产生能够被gcovr命令处理的文件。

接着执行“./findstackdirection”命令,又生成了findstackdirection.gcda文件。

2.输出列表形式的代码覆盖率
在程序所在的目录下运行“gcovr -r .”命令,可看到输出结果如下:

------------------------------------------------------------------------------
                  gcc code coverage report
directory: .
------------------------------------------------------------------------------
file                   lines    exec  cover   missing
------------------------------------------------------------------------------
findstackdirection.c      14      12    85%   65,73
------------------------------------------------------------------------------
total                     14      12    85%
------------------------------------------------------------------------------

这就是代码覆盖率报告,我们可以看到,程序运行之后,覆盖了85%的代码。

3.输出分支覆盖率
在程序所在的目录下运行“gcovr -r . –branches”命令,可看到输出结果如下:

------------------------------------------------------------------------------
                 gcc code coverage report
directory: .
------------------------------------------------------------------------------
file                   branches   taken  cover   missing
------------------------------------------------------------------------------
findstackdirection.c        6        4    66%   63,67
------------------------------------------------------------------------------
total                       6        4    66%
------------------------------------------------------------------------------

我们可以看到,程序一共有6个分支,执行了其中的4个。

4.输出展示覆盖率的xml文件
在程序所在的目录下运行“gcovr -r . –xml-pretty”命令,可看到输出结果如下:




 
  
   .
  
 
 

我们可以看到,命令的执行结果是输出了xml格式的代码覆盖率报告。

5.输出展示覆盖率的html文件
在程序所在的目录下运行“gcovr -r . –html -o findstackdirection.html”命令,可看到在当前目录下生成了findstackdirection.html文件。用打开,其内容如下图所示:
展示C代码覆盖率的gcovr工具简介及相关命令使用示例

这个html文件以图形化的方式直观地展示了代码的覆盖率。

我们还可以添加“–html-details”选项为代码工程中的每个文件生成一个独立的web页。例如,我们在程序所在的目录下运行“gcovr -r . –html –html-details -o findstackdirection2.html”命令,可看到在当前目录下生成了findstackdirection2.html文件和findstackdirection2.findstackdirection.c.html文件。用浏览器打开findstackdirection2.html文件,其内容如下图所示:
展示C代码覆盖率的gcovr工具简介及相关命令使用示例

可以看到,页面上的“findstackdirection.c”文字有一条下划线,单击该文字,出现的一个新的页面,其内容如下图所示:
展示C代码覆盖率的gcovr工具简介及相关命令使用示例python编写的开源软件,大小只有几十kb,但功能强大。让我们一起向开发该软件的前辈们致敬!