将 Gcov 与 CMake 和 Catch 结合使用
Using Gcov with CMake and Catch
我想使用 Gcov 报告我的静态库 Catch 测试套件的覆盖率,使用 CMake 编译。
.
├── CMakeLists.txt
├── bin
├── CMakeModules
│ └── CodeCoverage.cmake
├── src
│ ├── some_function.cpp
│ ├── another_function.cpp
│ └── library_name.hpp
└── test
└── main.cpp
我遵循了说明 here, and added CMakeModules/CodeCoverage.cmake
(参见上面的文件系统树)。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(my_project CXX)
set(CMAKE_CXX_STANDARD 11)
# Link CMake Gcov module
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules)
include(CodeCoverage.cmake)
append_coverage_compiler_flags()
# Library
file(GLOB_RECURSE LIBRARY_SOURCE_FILES src/*.cpp)
add_library(library STATIC ${LIBRARY_SOURCE_FILES})
# Tests
file(GLOB_RECURSE TEST_SOURCE_FILES test/*.cpp)
add_executable(test ${TEST_SOURCE_FILES})
target_link_libraries(test PRIVATE library)
set_target_properties(test
PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_SOURCE_DIR}/bin)
# Create a make target for the coverage executable
APPEND_COVERAGE_COMPILER_FLAGS()
SETUP_TARGET_FOR_COVERAGE_LCOV(
NAME coverage
EXECUTABLE bin/test
DEPENDENCIES library test)
如果任何测试函数失败,二进制 bin/test
将 return 一个非零值。这会导致 coverage
make 目标失败:
$ make coverage
...
make[3]: *** [CMakeFiles/coverage.dir/build.make: CMakeFiles/coverage] Error 3
make[2]: *** [CMakeFiles/Makefile2: CMakeFiles/coverage.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2: CMakeFiles/coverage.dir/rule] Error 2
这些错误指向 Makefile 中调用测试二进制文件的行:
# build.make
CMakeFiles/coverage: bin/test
bin/test
关于如何解决这个问题有什么建议吗?
根据SETUP_TARGET_FOR_COVERAGE_LCOV
命令的implementation,它将EXECUTABLE
子句的全部内容传递给add_custom_target
的COMMAND
子句。后者接受 shell 命令行,因此您可以创建一个运行测试但始终 returns 为零的命令行。例如。那样:
EXECUTABLE bin/test || /bin/true
我想使用 Gcov 报告我的静态库 Catch 测试套件的覆盖率,使用 CMake 编译。
.
├── CMakeLists.txt
├── bin
├── CMakeModules
│ └── CodeCoverage.cmake
├── src
│ ├── some_function.cpp
│ ├── another_function.cpp
│ └── library_name.hpp
└── test
└── main.cpp
我遵循了说明 here, and added CMakeModules/CodeCoverage.cmake
(参见上面的文件系统树)。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(my_project CXX)
set(CMAKE_CXX_STANDARD 11)
# Link CMake Gcov module
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules)
include(CodeCoverage.cmake)
append_coverage_compiler_flags()
# Library
file(GLOB_RECURSE LIBRARY_SOURCE_FILES src/*.cpp)
add_library(library STATIC ${LIBRARY_SOURCE_FILES})
# Tests
file(GLOB_RECURSE TEST_SOURCE_FILES test/*.cpp)
add_executable(test ${TEST_SOURCE_FILES})
target_link_libraries(test PRIVATE library)
set_target_properties(test
PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_SOURCE_DIR}/bin)
# Create a make target for the coverage executable
APPEND_COVERAGE_COMPILER_FLAGS()
SETUP_TARGET_FOR_COVERAGE_LCOV(
NAME coverage
EXECUTABLE bin/test
DEPENDENCIES library test)
如果任何测试函数失败,二进制 bin/test
将 return 一个非零值。这会导致 coverage
make 目标失败:
$ make coverage
...
make[3]: *** [CMakeFiles/coverage.dir/build.make: CMakeFiles/coverage] Error 3
make[2]: *** [CMakeFiles/Makefile2: CMakeFiles/coverage.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2: CMakeFiles/coverage.dir/rule] Error 2
这些错误指向 Makefile 中调用测试二进制文件的行:
# build.make
CMakeFiles/coverage: bin/test
bin/test
关于如何解决这个问题有什么建议吗?
根据SETUP_TARGET_FOR_COVERAGE_LCOV
命令的implementation,它将EXECUTABLE
子句的全部内容传递给add_custom_target
的COMMAND
子句。后者接受 shell 命令行,因此您可以创建一个运行测试但始终 returns 为零的命令行。例如。那样:
EXECUTABLE bin/test || /bin/true