mysql编译gcov_CMake编译项目集成gcov/lcov代码覆盖率测试

这篇博客介绍了如何在CMake项目中集成gcov和lcov进行代码覆盖率测试,特别是在涉及MySQL编译的情况下。通过提供一个简单的示例程序,演示了在复杂目录结构下如何配置CMakeLists.txt,以及如何生成和解析覆盖率报告。文章还解决了lcov报告中不包含branch覆盖率、排除不需要的文件以及创建脚本自动化流程等问题。
摘要由CSDN通过智能技术生成

转自https://blog.csdn.net/lostaway/article/details/40948841,并针对自己项目做了小幅修改,在此感谢原作者

完整演示项目Github地址:https://github.com/lostaway/EasonCodeShare/tree/master/CMakeGcovSupport

初始项目目录结构:

CMakeGcovSupport

├── CMakeLists.txt

├── bin

├── build

├── include

│   └── name.h

├── libgreeting

│   ├── CMakeLists.txt

│   ├── include

│   │   └── greeting.h

│   └── src

│       ├── CMakeLists.txt

│       ├── greeting.cpp

│       └── yelp.cpp

└── src

├── CMakeGcovSupport.cpp

├── CMakeLists.txt

└── name.cpp

示例程序是个很简单的输出一行问候语的程序。为了演示复杂目录结构下CMake集成Gcov/lcov的方法,故意将输出问候语的函数单独放到了 libgreeting 静态库中。执行如下编译命令:

$ cd CMakeGcovSupport

$ mkdir build

$ cd build

$ cmake -DENABLE_COVERAGE=ON ..

$ gmake all

执行 CMake 外部编译之后,CMake 在 build 目录内为我们生成了 .gcno 文件:

CMakeGcovSupport

├── CMakeLists.txt

├── bin

│   └── CMakeGcovSupport

├── build

│   ├── ......

│   ├── libgreeting

│   │   ├── ......

│   │   └── src

│   │       ├── CMakeFiles

│   │       │   ├── ......

│   │       │   ├── greeting.dir

│   │       │   │   ├── ......

│   │       │   │   ├── greeting.cpp.gcno

│   │       │   │   ├── greeting.cpp.o

│   │       │   │   ├── ......

│   │       │   │   ├── yelp.cpp.gcno

│   │       │   │   └── yelp.cpp.o

│   │       │   └── ......

│   │       └── ......

│   └── src

│       ├── CMakeFiles

│       │   ├── ......

│       │   ├── CMakeGcovSupport.dir

│       │   │   ├── CMakeGcovSupport.cpp.gcno

│       │   │   ├── CMakeGcovSupport.cpp.o

│       │   │   ├── ......

│       │   │   ├── name.cpp.gcno

│       │   │   ├── name.cpp.o

│       │   │   └── ......

│       │   └── progress.marks

│       └── ......

├── include

├── libgreeting

└── src

为了避免接下来执行程序过程中,未覆盖的源码文件的覆盖率信息丢失,我们需要对覆盖率信息进行初始化操作:

$ cd CMakeGcovSupport

$ lcov -d build -z

$ lcov -d build -b . --no-external --initial -c -o CMakeGcovSupportInitialCoverage.info

然后我们执行 bin 中的 CMakeGcovSupport, main() 函数中将会调用 Greeting() 和 Name()  函数,而不会调用到 Yelp() 函数。

$ cd CMakeGcovSupport

$ cd bin

$ ./CMakeGcovSupport

$ Hello, gcov.

此时我们会看到在 .gcno 所在目录,有同名的 .gcda 覆盖率数据文件生成了。执行以下命令,生成覆盖率测试报告:

$ cd CMakeGcovSupport

$ lcov -d build -b . --no-external -c -o CMakeGcovSupportCoverage.info

$ genhtml -o CMakeGcovSupportCoverageReport --prefix='pwd' CMakeGcovSupportInitialCoverage.info CMakeGcovSupportCoverage.info

用浏览器打开 CMakeGcovSupportCoverageReport 目录中的 index.html 查看覆盖率报告。

以下部分为具体实施时可能会遇到的问题:

1.报告中不包含branch覆盖率信息

原因在于lcov 1.10以后版本默认不包含branch coverage信息,需要通过修改 vim /etc/lcovrc 文件默认打开branch分支信息的输出,具体修改如下:

# Specify if branch coverage data should be collected andprocessed.

lcov_branch_coverage = 1       #去掉注释,值改为1

# Include branch coverage datadisplay (can be disabled by the --no-branch-coverage option of genhtml)

genhtml_branch_coverage = 1      #去掉注释,值改为1

---------------------------------------------------------------

或者在lcov命令后加上参数 lcov -d -b -c -o result.info --rc lcov_branch_coverage=1

再在genhtml命令后加上参数 genhtml -o result result.info --branch-coverage

2.对于复杂项目,不想包含某个文件夹内的文件覆盖率信息,即反向去除不需要的文件,可以使用 --remove 参数

lcov --remove all.info '*/lib/*' -o result.info

正向提取需要的文件,可以使用 --extract 参数

lcov --extract all.info '*/src/*' -o result.info

注意:lcov 不允许同时使用--extract  和  --remove

3.使用 --no-external 参数排除外部库

也可以将命令写成脚本文件:

# InitialCoverage.sh 此脚本文件在编译动作完成后运行,需使用chmod +x InitialCoverage.sh将其转变为可执行文件

$!/bin/sh

echo "Start initialize lcov coverage"

lcov -d cmake-build-release/src -z

lcov -d cmake-build-release/src -b . --no-external --initial -c -o InitialCoverage.info

lcov --remove InitialCoverage.info '*/lib/*' -o InitCoverage.info

rm -rf InitialCoverage.info

exit 1

# ReportCoverage.sh 此脚本文件在runtest或gtest后运行

#!/bin/sh

echo "Start report lcov coverage"

lcov -d cmake-build-release/src -b . --no-external -c -o ReportCoverage.info

lcov --remove ReportCoverage.info '*/lib/*' -o ResultCoverage.info

genhtml -o CoverageReport --prefix='pwd' InitCoverage.info ResultCoverage.info

rm -rf InitCoverage.info

rm -rf ReportCoverage.info

rm -rf ResultCoverage.info

exit 1

另外,CMakeLists.txt中需要添加以下几行:

set(ENABLE_COVERAGE TRUE)

if(ENABLE_COVERAGE)

message(STATUS "Use gcov for code coverage test")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")

endif()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值