gcovr
1.1、gcovr简介
是什么 ?:a utility for managing the use of the gcov utility and generating summarized code coverage results.
开发语言:Python
官方主页:https://gcovr.com
源码仓库:https://github.com/gcovr/gcovr
1.2、通过包管理器安装gcovr
操作系统包管理器安装命令
Allpippip install gcovr
WindowsChocolateychoco install -y gcovr
macOSHomeBrewbrew install gcovr
GNU/LinuxHomeBrewbrew install gcovr
aptsudo apt-get install -y gcovr
CentOSyumsudo yum install -y gcovr
dnfsudo dnf install -y gcovr
openSUSEzyppersudo zypper install -y gcovr
Alpine Linuxapksudo apk add gcovr

Arch Linux

ArcoLinux

Manjaro Linux

pacmansudo pacman -Syyu --noconfirm
sudo pacman -S    --noconfirm gcovr
Gentoo LinuxPortagesudo emerge gcovr
1.3、通过编译源码安装gcovr

step1、安装依赖

安装时CPythonpipgit
运行时CPython

step2、安装gcovr

pip install git+https://github.com/gcovr/gcovr

说明:上面这个命令等同于如下的命令:

git clone https://github.com/gcovr/gcovr.git
cd gcovr
python setup.py install
1.4、gcovr命令
1.5、gcovr综合使用示例

需求:编写一个四则运算中的加法运算的实现,使用CUnit进行单元测试,使用gcovr生成测试覆盖率统计报告

设计:工程结构如下

add
└── src
    ├── include
    │   └── add.h
    ├── lib
    │   └── add.c
    └── test
        └── add.c
为了让大家看清楚整个步骤,我们尽量让工程结构简单,为此我们这里不使用诸如gmakecmakeautotools之类的构建工具,实际开发过程会使用它们。
在开始之前,请确保已经安装好了CUnit

1、编写src/include/add.h

#ifndef ADD_H
#define ADD_H
    int add(int a, int b);
#endif

2、编写src/lib/add.c

#include <add.h>

int add(int a, int b) {
    return a + b;
}

3、编写src/test/add.c

#include <CUnit/CUnit.h>
#include <CUnit/Basic.h>
#include <add.h>

void test_add() {
    CU_ASSERT_EQUAL(add(0, 0), 0);
    CU_ASSERT_EQUAL(add(0, 1), 1);
    CU_ASSERT_EQUAL(add(1, 0), 1);
    CU_ASSERT_EQUAL(add(1, -1), 0);
}

// http://cunit.sourceforge.net/example.html
int main() {
    /* initialize the CUnit test registry */
    if (CUE_SUCCESS != CU_initialize_registry()) {
        return CU_get_error();
    }

    /* add a suite to the registry */
    CU_pSuite pSuite = CU_add_suite("Suite_1", NULL, NULL);
    if (NULL == pSuite) goto cleanup; 

    /* add the tests to the suite */
    if (NULL == CU_add_test(pSuite, "test add()", test_add)) goto cleanup; 

    CU_basic_set_mode(CU_BRM_VERBOSE);

    CU_basic_run_tests();

cleanup:
    CU_cleanup_registry();
    return CU_get_error();
}

4、使用cc命令编译单元测试程序

cc -o add-test --coverage -Isrc/include -lcunit src/test/add.c src/lib/add.c
在编译源代码的时候,必须使用--coverage这个编译器选项,该选项的作用是生成*.gcno文件。每一个.c源文件对应生成一个*.gcno文件。

5、运行单元测试程序

./add-test
运行完成之后,会生成*.gcda文件。每一个.c源文件对应生成一个*.gcda文件。

6、生成HTML格式的统计报告

mkdir coverage && gcovr -r . --html --html-details -o coverage/index.html

7、查看coverage目录中的内容

8、在Web浏览器中打开coverage/index.html