使用CMake和gcov locv测试代码覆盖率---简单案例(含代码工程)

使用CMake和gcov locv测试代码覆盖率—简单案例

代码工程下载:使用CMake和gcov locv测试代码覆盖率-简单案例


这些工具必须在Linux下使用

参考:
cmake + gtest安装使用 C++单元测试 gcov locv代码覆盖率
CMake添加gcov代码覆盖测试支持

最近在研究高性能计算(HPC),恶补些代码方面的知识,顺便记录下,参考的书籍是并行计算与高性能计算

高性能计算一般是基于Linux的底层进行,国内大部分用的都是Windows系统,如果不想捣鼓双系统,就需要安装虚拟机。虚拟机一般有两种方法,要么使用虚拟化软件(推荐VMWare),要么使用微软的WSL子系统

此处使用WSL子系统运行Ubuntun22.04的方式进行。
此种方法可以参考:Windows11离线安装wsl2(适用于 Linux 的 Windows 子系统)和Ubuntu

1、gcov locv简介

此处参考一文详解C/C++代码覆盖率–gcov/lcov/gcovr

gcov

gcov是由gcc工具链提供的代码覆盖率生成工具,可以很方便的和GCC编译器配合使用,通常情况下,直接安装gcc工具链,也就同时包含了gcov命令行工具。

lcov

lcov是gcov工具的图形前端,收集多个源文件的gcov数据,生成描述覆盖率的HTML页面。生成的结果中会包含概述页面,方面浏览。

lcov在linux系统中一般不自带,使用下面方式安装:

apt install lcov

2、在CMakelist.txt中启用

在原始的写好的CMakelist.txt中添加下面内容:

OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF)

IF (ENABLE_GCOV AND NOT WIN32 AND NOT APPLE)
  SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
  SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -lgcov")
ENDIF()

这边的CMakelist.txt沿用使用CMake和CTest自动测试代码的,因此全部的CMakelist如下:

cmake_minimum_required (VERSION 3.0)
project (TimeIt)

# Enables CTest functionality in CMake
enable_testing()


OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF)

IF (ENABLE_GCOV AND NOT WIN32 AND NOT APPLE)
  SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
  SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -lgcov")
ENDIF()

# CMake has a built-in routine to find most MPI packages 
# Defines MPI_FOUND if found
# MPI_INCLUDE_PATH (being replaced by MPI_<lang>_INCLUDE_PATH)
# MPI_LIBRARIES (being replaced by MPI_<lang>_LIBRARIES)
find_package(MPI)

# Adds build targets of TimeIt and MPITimeIt with source code file(s) TimeIt.c and MPITimeIt.c
add_executable(TimeIt TimeIt.c)

add_executable(MPITimeIt MPITimeIt.c)
# Need an include path to the mpi.h file and to the MPI library
target_include_directories(MPITimeIt PUBLIC ${MPI_INCLUDE_PATH})
target_link_libraries(MPITimeIt ${MPI_LIBRARIES})

# This gets all files with the extension 'ctest' and adds it to the test list for CTest
# The ctest file needs to be executable or explicitly launched with the 'sh' command as below
file(GLOB TESTFILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.ctest")
foreach(TESTFILE ${TESTFILES})
     add_test(NAME ${TESTFILE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
              COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TESTFILE})
endforeach()

# A custom command, distclean, to remove files that are created
add_custom_target(distclean COMMAND rm -rf CMakeCache.txt CMakeFiles
                  CTestTestfile.cmake Makefile Testing cmake_install.cmake)

值得注意的是,基于如上的CMakelist.txt,在启用gcov时需要添加额外的指令传参:

cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_GCOV=1 ..

其中:
-DCMAKE_BUILD_TYPE=Debug用于启用调试模式,这时候编译时会禁用优化,否则编译器会对代码做一些优化,例如行合并,从而影响行覆盖率结果(cmake + gtest安装使用 C++单元测试 gcov locv代码覆盖率

-DENABLE_GCOV=1用于启用在原始的写好的CMakelist.txt中添加的内容

3、编译与使用流程

STEP1:
首先确保cd到了build文件夹中:
在这里插入图片描述


STEP2:
使用下面的cmake命令,启用gcov:

cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_GCOV=1 ..

在这里插入图片描述


STEP3:执行make命令并运行
执行make命令:
在这里插入图片描述
运行编译得到的TimeIt文件(必不可少):
在这里插入图片描述


STEP4:调用lcov命令进行可视化
先执行下面命令生成info文件,命令中TimeIt是使用CMake和CTest自动测试代码中的主要C代码名字,-d要指向源代码目录:

lcov -d /home/HPC_WorkSpace/Chapter2/Listing1_gcov -
t TimeIt -o TimeIt.info -b . -c  --no-external

在这里插入图片描述

使用下面的命令生成html可视化,此处指向刚刚生成的info文件:

genhtml -o report TimeIt.info

在这里插入图片描述

此时会在build文件夹下生成report文件夹:
在这里插入图片描述
其中index.html就是检测的结果:
在这里插入图片描述
双击打开后如下所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怡步晓心l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值