C代码覆盖率测试工具Gcov

栏目: 编程工具 · 发布时间: 5年前

内容简介:代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍测试代码如下:

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍 C/C++ 相关的覆盖率测试工具 Gcov

介绍

Gcov 是一个测试覆盖程序,是集成在 GCC 中的,随 GCC 一起发布

使用

编译

测试代码如下:

say.c :

#include <stdio.h>

int say(char *what) {
    printf("------ %s\n", what);
    return 0;
}

main.c

#include <stdio.h>

extern int say(const char *);

int main(int argc, const char *argv[]) {
    
    if (argv[1]) {
        say("hello");
    } else {
        say("bye");
    }
    return 0;
}

添加 -fprofile-arcs -ftest-coverage 编译参数编译程序,生成可执行程序和 *.gcno 文件:

$ gcc -fprofile-arcs -ftest-coverage -O0 say.c main.c

$ ls
a.out  main.c  main.gcno  say.c  say.gcno

数据收集

运行可执行文件,生成 *.gcda :

$ ./a.out
------ bye

$ ls
a.out  main.c  main.gcda  main.gcno  say.c  say.gcda  say.gcno

报告生成

可视化数据

xxxxxxxxxxxxxxxxxxxxxxxxxxx

列表形式

  1. 代码覆盖率
    $ gcovr -r .
    ------------------------------------------------------------------------------
                               GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File                                       Lines    Exec  Cover   Missing
    ------------------------------------------------------------------------------
    main.c                                         5       4    80%   15
    say.c                                          3       3   100%   
    ------------------------------------------------------------------------------
    TOTAL                                          8       7    87%
    ------------------------------------------------------------------------------
    

报告展示程序运行后覆盖了 80% 的代码

  1. 分支覆盖率
    $ gcovr -b -r .
    ------------------------------------------------------------------------------
                               GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File                                    Branches   Taken  Cover   Missing
    ------------------------------------------------------------------------------
    main.c                                         2       1    50%   14
    say.c                                          0       0    --%   
    ------------------------------------------------------------------------------
    TOTAL                                          2       1    50%
    ------------------------------------------------------------------------------
    

报告展示了在 main.c 中有一个分支没有执行到

XML文件形式

$ gcovr --xml-pretty -r .
<?xml version="1.0" ?>
<!DOCTYPE coverage
  SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-04.dtd'>
<coverage branch-rate="0.5" branches-covered="1" branches-valid="2"
 complexity="0.0" line-rate="0.875" lines-covered="7" lines-valid="8"
 timestamp="1537930892" version="gcovr 3.4">
 <sources>
  <source>.</source>
 </sources>
 <packages>
  <package branch-rate="0.5" complexity="0.0" line-rate="0.875" name="">
   <classes>
    <class branch-rate="0.5" complexity="0.0" filename="main.c"
     line-rate="0.8" name="main_c">
     <methods/>
     <lines>
      <line branch="false" hits="1" number="12"/>
      <line branch="true" condition-coverage="50% (1/2)" hits="1" number="14">
       <conditions>
        <condition coverage="50%" number="0" type="jump"/>
       </conditions>
      </line>
      <line branch="false" hits="0" number="15"/>
      <line branch="false" hits="1" number="17"/>
      <line branch="false" hits="1" number="19"/>
     </lines>
    </class>
    <class branch-rate="0.0" complexity="0.0" filename="say.c" line-rate="1.0"
     name="say_c">
     <methods/>
     <lines>
      <line branch="false" hits="1" number="10"/>
      <line branch="false" hits="1" number="11"/>
      <line branch="false" hits="1" number="12"/>
     </lines>
    </class>
   </classes>
  </package>
 </packages>
</coverage>

HTML文件形式

$ gcovr -r . --html -o xxx.html
$ ls
a.out  main.c  main.gcda  main.gcno  say.c  say.gcda  say.gcno  xxx.html

可以发现添加 --html 参数后,可以生成 html 文件,用浏览器打开,如下图:

C代码覆盖率测试工具Gcov

还可以添加 --html-details 选项,为每个代码文件单独生成 html

$ gcovr -r . --html --html-details -o xxx.html
$ ls
a.out  main.c  main.gcda  main.gcno  say.c  say.gcda  say.gcno  xxx.html  xxx.main.c.html  xxx.say.c.html

可以发现多了 xxx.main.c.htmlxxx.say.c.html ,用浏览器打开 xxx.html ,如下图:

C代码覆盖率测试工具Gcov

文件名较之前带上了下划线,单击文件名,可以看到具体的代码覆盖情况,如下图:

C代码覆盖率测试工具Gcov

Reference

About me

C代码覆盖率测试工具Gcov

C代码覆盖率测试工具Gcov This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License .

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

官网 https://gcovr.com/

gcovr是一个用 Python 编写的开源软件,大小只有几十KB

*.gcno 文件, 它包含了程序块和行号等信息

gcovr的下载地址是: https://blog.csdn.net/zhouzhaoxiong1227/article/details/50352944?utm_source=copy

代码覆盖率

-fprofile-arcs -ftest-coverage

分支覆盖率

gcovr -r . –branches

展示覆盖率的XML文件

gcovr -r . –xml-pretty

展示覆盖率的HTML文件

gcovr -r . –html -o FindStackDirection.html

添加“–html-details”选项为代码工程中的每个文件生成一个独立的web页


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTTP/2基础教程

HTTP/2基础教程

Stephen Ludin、Javier Garza / 罗正龙、郑维智 / 人民邮电出版社 / 2018-1 / 49.00元

让网站和应用更快速、更简洁、更稳健,从而有效提升用户体验,这无疑是众多开发者梦寐以求的。然而互联网发展日新月异,HTTP/1.1协议已经难以满足现今的需求。在众多Web性能提升方案中,HTTP/2值得尝试。 本书是HTTP/2实用指南,介绍了HTTP/2的设计初衷和新特性,以及如何才能充分利用这些特性来打造高性能网站及应用。作者用定量分析方法,对比了不同网络环境下及不同浏览器上HTTP/1.......一起来看看 《HTTP/2基础教程》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具