【问题标题】:How to get coverage for tests with CMake and Catch2如何使用 CMake 和 Catch2 获得测试覆盖率
【发布时间】:2021-01-06 20:44:26
【问题描述】:

我正在尝试在使用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

据我了解,它似乎缺少一些覆盖信息所需的文件,但我不知道如何制作它们。从我在网上查看的内容来看,我拥有所有必要的编译器标志。我看不出这里有什么问题/遗漏。

【问题讨论】:

  • 您在构建时是否看到相关的覆盖率标志?
  • 您是否使用一个目录build 进行所有编译?然后不要忘记make clean。为不同的构建配置提供不同的构建目录会更好也更安全。
  • @StephenNewell 我在构建时看不到它们。我没有看到实际执行的命令。我看到覆盖模块将标志附加到解决方案中。
  • @zkoza 我是 CMake 新手。如果您有任何关于最佳实践的资源,我很乐意阅读它们!为了回答你的问题,我在做make之后尝试做make clean,但变化不大。
  • 我认为自己是一个中级 cmake 用户并自学。但请参阅:stackoverflow.com/questions/13116488/…@AntonArtiukh 的答案是可以的,因为它很简单而且很有效。但这违背了 cmake 的精神(一切都应该尽可能独立于平台)。该链接显示了更专业的解决方案。选择更适合您的。

标签: c++ cmake code-coverage catch2


【解决方案1】:

我相信你忘了添加适当的标志

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")

【讨论】:

猜你喜欢
  • 2015-02-12
  • 2013-05-07
  • 1970-01-01
  • 2019-11-06
  • 2019-01-22
  • 1970-01-01
  • 2017-02-13
  • 2014-05-11
  • 2019-06-28
相关资源
最近更新 更多