lcov
1.1、lcov简介
是什么 ?:an extension of gcov, a command-line tool which provides information about what parts of a program are actually executed (i.e. "covered") while running a particular test case.
开发语言:perl
官方主页:http://ltp.sourceforge.net/coverage/lcov.php
源码仓库:https://github.com/linux-test-project/lcov
1.2、通过包管理器安装lcov
操作系统包管理器仓库安装命令
Allvcpkgofficial
vcpkg install lcov
vcpkg install lcov:x64-osx
vcpkg install lcov:x64-linux
vcpkg install lcov:x64-windows
WindowsChocolateyofficialchoco install -y lcov
macOSHomeBrewofficialbrew install lcov
GNU/LinuxHomeBrewofficialbrew install lcov
aptofficialsudo apt-get install -y lcov
CentOSyumsudo yum install -y lcov
dnfsudo dnf install -y lcov
openSUSEzyppersudo zypper install -y lcov
Alpine Linuxapkofficialsudo apk add lcov

Arch Linux

ArcoLinux

Manjaro Linux

pacmanofficialsudo pacman -Syyu --noconfirm
sudo pacman -S    --noconfirm lcov
Gentoo LinuxPortageofficialsudo emerge lcov
1.3、通过编译源码安装lcov
1.4、lcov中包含的命令
1.5、lcov综合使用示例

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

设计:工程结构如下

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、生成测试覆盖率统计数据

lcov -c -o test.info -d .

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

genhtml test.info -o output/

8、查看output目录中的内容

9、在Web浏览器中打开output/index.html