代码覆盖率分析是评估测试完整性的重要手段,能帮助开发者识别未被测试覆盖的代码区域。在Ubuntu系统中,gcov(GCC内置工具)与lcov(覆盖率数据可视化工具)的组合是最常用的解决方案,以下是详细操作步骤:
首先需要安装gcc/g++(编译器,自带gcov)、lcov(生成可视化报告)等工具。在终端执行以下命令:
sudo apt update
sudo apt install gcc g++ make lcov
注:
gcc-multilib和g++-multilib仅在需要支持32位程序时安装(默认情况下无需额外安装)。
使用g++编译C++代码时,必须添加**-fprofile-arcs(生成代码执行路径数据)和-ftest-coverage**(生成覆盖率计数器)选项,以开启覆盖率统计功能。例如:
g++ -fprofile-arcs -ftest-coverage -o my_program my_program.cpp
编译完成后,会生成可执行文件my_program,同时会在当前目录下生成.gcno文件(编译时记录的覆盖率元数据)。
执行编译后的可执行文件,程序运行时会生成.gcda文件(实际执行的覆盖率数据,存储在对应源文件的目录中)。例如:
./my_program
运行后,当前目录或其子目录中会生成.gcda文件(如my_program.cpp.gcov)。
使用lcov工具收集.gcno和.gcda文件中的数据,并生成HTML格式的可视化报告:
.表示当前目录),生成coverage.info文件:lcov --capture --directory . --output-file coverage.info
/usr/include),可通过--remove选项排除,避免报告混乱:lcov --remove coverage.info '/usr/*' --output-file coverage_filtered.info
genhtml(lcov自带工具)将coverage.info转换为HTML格式,便于浏览器查看:genhtml coverage_filtered.info --output-directory coverage_report
注:若未过滤数据,直接使用
coverage.info即可。
打开生成的HTML报告目录,用浏览器查看index.html文件(如coverage_report/index.html)。报告中会显示:
若项目使用Boost.Test框架编写单元测试,可通过CMake配置自动启用覆盖率分析:
sudo apt install libboost-all-dev
cmake_minimum_required(VERSION 3.10)
project(MyTestProject)
set(CMAKE_CXX_STANDARD 11)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)
add_executable(my_tests test_file.cpp)
if(CMAKE_COMPILER_IS_GNUCXX)
target_compile_options(my_tests PRIVATE -fprofile-arcs -ftest-coverage)
target_link_options(my_tests PRIVATE -fprofile-arcs -ftest-coverage)
endif()
target_link_libraries(my_tests Boost::unit_test_framework)
mkdir build && cd build
cmake ..
make
./my_tests
后续步骤与gcov+lcov方法一致,生成覆盖率报告即可。
以上方法覆盖了Ubuntu下C++代码覆盖率分析的主流场景,开发者可根据项目需求选择合适的工具组合。