C代码覆盖率测试工具Gcov

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

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

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍 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页


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

查看所有标签

猜你喜欢:

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

代码整洁之道:程序员的职业素养

代码整洁之道:程序员的职业素养

罗伯特·C.马丁 (Robert C.Martin) / 余晟、章显洲 / 人民邮电出版社 / 2016-9-1 / 49.00元

1. 汇聚编程大师40余年编程生涯的心得体会 2. 阐释软件工艺中的原理、技术、工具和实践 3. 助力专业软件开发人员具备令人敬佩的职业素养 成功的程序员在以往的工作和生活中都曾经历过大大小小的不确定性,承受过永无休止的压力。他们之所以能够成功,是因为拥有一个共同点,都深切关注创建软件所需的各项实践。他们将软件开发视为一种需要精雕细琢加以修炼的技艺,他们以专业人士的标准要求自己,......一起来看看 《代码整洁之道:程序员的职业素养》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具