【发布时间】:2019-01-22 06:51:05
【问题描述】:
目前在我们的项目中,我们的客户和我们的团队并行工作,以构建两个团队模块所需的代码。我们使用 gcov 进行代码覆盖。目前生成的覆盖范围显示了两个团队。有没有办法只为我们的模块生成单元 gcov 覆盖率。(我们的模块不是单独构建的)。
有什么方法可以只为我们的文件运行(或)是否可以基于函数名运行?
【问题讨论】:
标签: gcov
目前在我们的项目中,我们的客户和我们的团队并行工作,以构建两个团队模块所需的代码。我们使用 gcov 进行代码覆盖。目前生成的覆盖范围显示了两个团队。有没有办法只为我们的模块生成单元 gcov 覆盖率。(我们的模块不是单独构建的)。
有什么方法可以只为我们的文件运行(或)是否可以基于函数名运行?
【问题讨论】:
标签: gcov
是的,有两种主要方法可以控制生成的覆盖率报告:
lcov、gcovr)包含/排除某些文件模式(1) 比 (2) 容易得多。例如,如果您使用lcov,请考虑--extract 选项:
如果您只想提取覆盖率数据,请使用此开关 跟踪文件中的特定文件集。附加命令 行参数将被解释为 shell 通配符模式 (请注意,它们可能需要相应地转义以防止 壳首先扩展它们)。中的每个文件条目 至少匹配其中一种模式的跟踪文件将是 提取出来的。
(2) 可能很困难(或不可能),具体取决于您的构建系统。为此,您需要:
--coverage 编译您的模块(相当于 GNU 编译器的 -ftest-coverage -fprofile-arcs)lgcov 链接。这将生成 *.gcno 'notes' 文件,告诉覆盖生成器您的源文件仅用于您使用 --coverage 标志编译的文件。然后,在运行您的测试套件时,应该只为同一组文件生成*.gcda 文件。运行最终覆盖率报告/HTML 生成器只会为您的模块生成报告。
为了说明,这里有一个简单的 CMake 文件,它只生成 covered.cxx 的覆盖率信息。注意covered 库的额外target_compile_options 和target_link_libraries。
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)
【讨论】: