使用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就是检测的结果:
双击打开后如下所示: