Gcov将文件名和函数名视为计算代码覆盖率的输入

时间:2019-01-22 06:51:06

标签: gcov

当前,在我们的项目中,我们的客户和我们的团队并行工作,以构建团队两个模块所需的代码。我们正在使用gcov进行代码覆盖。当前,生成的覆盖率显示了两个团队。有什么方法可以只为我们的模块生成单位gcov覆盖率。(我们的模块不是单独构建的)。

有什么方法可以仅对我们的文件运行(或者)是否可以基于函数名运行?

1 个答案:

答案 0 :(得分:0)

是的,有两种主要方法可以控制生成的覆盖率报告:

  1. 告诉生成器(例如lcovgcovr)以包含/排除某些文件格式
  2. 仅编译启用了覆盖率的源文件。

(1)比(2)容易得多。例如,如果您使用的是lcov,请考虑使用--extract选项:

  

如果您只想提取覆盖范围数据,请使用此开关                 跟踪文件中的特定文件集。附加命令                 行参数将被解释为外壳通配符模式                 (请注意,可能需要对其进行相应的转义以防止                 外壳先展开)。中的每个文件条目                 至少匹配这些模式之一的跟踪文件将是                 提取。

(2)可能很难(或不可能),具体取决于您的构建系统。为此,您将需要:

  1. 仅用--coverage编译模块(对于GNU编译器,等效于-ftest-coverage -fprofile-arcs
  2. 将您的图书馆与lgcov关联。

这将产生*.gcno个“注释”文件,这些文件将覆盖--coverage标记的文件的源文件仅 告知coverage生成器。然后,在运行测试套件时,仅应为同一组文件生成*.gcda文件。运行最终的覆盖率报告/ HTML生成器只会为您的模块生成报告。

为说明起见,这是一个简单的CMake文件,该文件仅生成covered.cxx的覆盖率信息。请注意target_compile_options库的额外target_link_librariescovered

add_executable(${PROJECT_NAME} main.cxx)                  

add_library(not-covered SHARED not-covered.cxx)           
add_library(covered SHARED covered.cxx)                   

target_compile_options(covered PRIVATE --coverage)        
target_link_libraries(covered PRIVATE --coverage)         

target_link_libraries(${PROJECT_NAME} covered not-covered)