如何使用 CMake 和 Catch2 覆盖测试
How to get coverage for tests with CMake and Catch2
我正在尝试在使用 Catch2
进行测试的 C++
项目上使用 lcov
打印覆盖率。我能够 运行 我的测试并获得结果。但是,我无法获得任何报道。这是显示的错误。
Capturing coverage data from .
Found gcov version: 9.3.0
Using intermediate gcov format
Scanning . for .gcda files ...
geninfo: WARNING: no .gcda files found in . - skipping!
Finished .info-file creation
Combining tracefiles.
Reading tracefile coverage.base
lcov: ERROR: no valid records found in tracefile coverage.base
我当前的工具链是 WSL
。我正在使用 Conan
进行依赖管理。该解决方案具有以下结构:
my project/
├─ build/
│ ├─ build files
├─ core/
│ ├─ library files
├─ main/
│ ├─ main runtime
├─ tests/
│ ├─ test runtime/
├─ CMakeLists.txt
每个文件夹都有它的 CMakeLists.txt
文件并被识别为一个目标。我还使用 this CMake Module 注册覆盖目标。
我的根 CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.16)
project(my-project)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "-O0")
include(build/conanbuildinfo.cmake)
conan_basic_setup()
add_subdirectory(core)
option(BUILD_TESTING "Builds only the test executable." OFF)
option(CODE_COVERAGE "Collect coverage from test library" OFF)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(tests)
add_test(NAME project-tests COMMAND ./bin/tests)
if(CODE_COVERAGE)
include(CodeCoverage.cmake)
append_coverage_compiler_flags()
setup_target_for_coverage_lcov(NAME coverage EXECUTABLE ./bin/tests BASE_DIRECTORY ../coverage)
endif()
else()
add_subdirectory(main)
endif()
为了获得报道,我使用了以下命令(在 build/
上)。
cmake .. -DCODE_COVERAGE=ON -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug
make
make coverage
据我了解,它似乎缺少一些覆盖信息所需的文件,但我不知道如何制作它们。根据我在网上查看的内容,我拥有所有必要的编译器标志。我在这里看不到 wrong/missing 是什么。
我相信你忘了添加适当的标志
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
我正在尝试在使用 Catch2
进行测试的 C++
项目上使用 lcov
打印覆盖率。我能够 运行 我的测试并获得结果。但是,我无法获得任何报道。这是显示的错误。
Capturing coverage data from .
Found gcov version: 9.3.0
Using intermediate gcov format
Scanning . for .gcda files ...
geninfo: WARNING: no .gcda files found in . - skipping!
Finished .info-file creation
Combining tracefiles.
Reading tracefile coverage.base
lcov: ERROR: no valid records found in tracefile coverage.base
我当前的工具链是 WSL
。我正在使用 Conan
进行依赖管理。该解决方案具有以下结构:
my project/
├─ build/
│ ├─ build files
├─ core/
│ ├─ library files
├─ main/
│ ├─ main runtime
├─ tests/
│ ├─ test runtime/
├─ CMakeLists.txt
每个文件夹都有它的 CMakeLists.txt
文件并被识别为一个目标。我还使用 this CMake Module 注册覆盖目标。
我的根 CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.16)
project(my-project)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "-O0")
include(build/conanbuildinfo.cmake)
conan_basic_setup()
add_subdirectory(core)
option(BUILD_TESTING "Builds only the test executable." OFF)
option(CODE_COVERAGE "Collect coverage from test library" OFF)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(tests)
add_test(NAME project-tests COMMAND ./bin/tests)
if(CODE_COVERAGE)
include(CodeCoverage.cmake)
append_coverage_compiler_flags()
setup_target_for_coverage_lcov(NAME coverage EXECUTABLE ./bin/tests BASE_DIRECTORY ../coverage)
endif()
else()
add_subdirectory(main)
endif()
为了获得报道,我使用了以下命令(在 build/
上)。
cmake .. -DCODE_COVERAGE=ON -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug
make
make coverage
据我了解,它似乎缺少一些覆盖信息所需的文件,但我不知道如何制作它们。根据我在网上查看的内容,我拥有所有必要的编译器标志。我在这里看不到 wrong/missing 是什么。
我相信你忘了添加适当的标志
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")