代码覆盖率
在 CLion 中,您可以运行带有代码覆盖率测量的 CMake 应用程序和测试。 代码覆盖率结果提供了运行期间执行的代码行百分比以及特定行被命中的次数。
CLion 依赖于 llvm-cov/gcov 集成来收集和显示代码覆盖率数据。 这些工具需要特殊的覆盖率编译器标志,您可以 手动传递它们,或者让 CLion 自动添加它们。
运行带有覆盖率的 CMake 应用程序或测试
运行覆盖率 操作适用于 CMake 应用程序和测试配置(Boost.Test、 Google Test 或 Catch)。
您可以从配置切换器旁边的工具栏或从边栏菜单调用 运行覆盖率:


当您调用 运行覆盖率 ,但未找到覆盖率文件( .gcov 或 .profraw )时,CLion 会建议添加覆盖率标志:

如果您点击 修复并重新运行 ,CLion 将执行以下操作:
搜索现有的 CMake 配置文件 ,该文件具有与当前使用的配置文件相同的构建类型、工具链和 CMake 选项,但添加了覆盖率的编译器选项(请参阅 覆盖率编译器标志)。 如果找到一个,CLion 将切换到它并使用它运行您的配置以进行覆盖率。
如果未找到这样的配置文件,CLion 将创建一个新配置文件,复制当前配置文件中的 构建类型、 工具链 和 CMake 选项 参数,并将覆盖率标志作为
CMAKE_CXX_FLAGS和CMAKE_C_FLAGS传递到 CMake 选项中。 然后 CLion 将切换到这个新创建的配置文件,并使用它运行您的配置以进行覆盖率。
覆盖率编译器标志
如果您手动传递覆盖率标志,可以根据您偏好的编译器和覆盖率工具选择以下选项之一:
GCC
"""
-fprofile-arcs -ftest-coverage或--coverage"""在这种情况下,将使用 gcov 工具。
Clang/Clang-cl
这里有两个选项:
使用与 GCC 相同的标志,以通过 llvm-cov gcov 收集 gcov 风格的覆盖率。
使用
-fprofile-instr-generate -fcoverage-mapping调用 Clang 的基于插桩的分析 ,它使用一对llvm-profdata merge和llvm-cov export命令。
您可以通过 设置CMAKE_CXX_FLAGS 变量(CMAKE_C_FLAGS 用于 C 项目)或使用其他替代方法,例如 add_compile_options 命令来提供标志。
覆盖率结果
当覆盖率数据准备好时,覆盖率工具窗口会自动打开。 最初,它显示启动期间每个文件夹的文件覆盖百分比。 如果双击一个文件夹,您将看到 行覆盖率 和 分支覆盖率 列。

行覆盖率 显示每个文件覆盖了多少行。 请注意,根据您使用的编译器和标志,其工作方式存在以下差异:
GCC/gcov(
--coverage标志)提供精确的行覆盖率。 当一行中有多个代码块时,如果至少执行了其中的一些语句,该行将被视为完全覆盖(在编辑器中标记为绿色)。Clang/llvm-cov,当程序使用
-fprofile-instr-generate-fcoverage-mapping编译时,提供语句覆盖率。 如果一行中的所有语句未被执行,该行将被标记为部分覆盖(黄色)。分支覆盖率 考虑了每个控制结构的所有分支。
它支持 LLVM 版本 12.0.0 或更高版本以及任何版本的 GCC。 在 macOS 上,AppleClang 的版本对应于较早的 LLVM 版本(请参阅 此表)。 AppleClang 12.0.x 对应于 LLVM 10.0.x,不支持分支覆盖率。 为了解决此问题,您可以切换到 GCC 或更改覆盖率编译器标志为
--coverage:
GCC 和 gcov 工具在计算分支覆盖率时会考虑编译器生成的分支。 这可能会影响结果,例如,当您使用异常处理时。
在任何文件中,您可以检查边栏指示器并点击特定行旁边的指示器,以了解该行被命中的次数:

完全执行的行标记为绿色。 黄色标记表示该行仅部分执行。
要修改覆盖率高亮显示的颜色,请点击 或转到 并展开 行覆盖率 节点。
CLion 还在项目视图中显示覆盖率统计信息:

合并多次运行的结果
当您重新运行覆盖率分析时,CLion 会提示您选择如何呈现新结果:

添加到活动套件 – 新结果将添加到先前收集的统计信息中。
替换活动套件 – 已收集的数据将被覆盖。
不应用收集的覆盖率数据 – 新结果将被忽略。
覆盖率设置
代码覆盖率设置汇总在 中:

在 工具 部分,您可以提供 gcov/llvm-cov/llvm-profdata 的自定义路径。 默认情况下,CLion 从 PATH 环境变量中获取路径。
故障排查
如果您得到空的覆盖率报告,请检查您正在使用的 编译器版本与 gcov / llvm-cov 的版本匹配 工具(默认或自定义)。

在 更换编译器 或从一个 Windows 工具链 切换到另一个时,请记住这一点。