有没有办法将lcov代码覆盖率报告聚焦到只有一个或两个目录?

32

我最近开始使用lcov来可视化我的代码覆盖率,这是一个很棒的工具。

有件事情让我不得不注意:它会生成我所使用的所有文件的代码覆盖率报告,包括那些我不感兴趣的文件。例如,它会给我boost和mysql++文件的代码覆盖率报告。

是否有一种简单的方法可以强制lcov仅为特定文件生成覆盖率报告?

我尝试使用-k参数,如下所示:

/usr/bin/lcov -q -c -i -b . -d .obj -k src/ -k include/ -o app_base.info
{现在运行单元测试}
/usr/bin/lcov -q -c -b . -d .obj -k src/ -k include/ -o app_test.info /usr/bin/lcov -q -a app_base.info -a app_test.info -o app_total.info /usr/bin/genhtml -q -o lcov_output_directory app_total.info

(这意味着我只想要"include"和"src"目录的覆盖率文件。)

然而,这似乎没有起作用。报告仍然显示我所有的外来文件。非常感谢您的任何建议。谢谢!

3个回答

36

我使用了--directory标志以及--no-external标志来排除不需要的文件。

从man手册中可以得到外部文件的定义:

外部源文件是指不在--directory--base-directory指定的目录之一中的文件。

所以我的命令看起来是这样的:

$ lcov  --directory src -c -o report.info --no-external
Capturing coverage data from src
Found gcov version: 4.2.1
Scanning src for .gcda files ...
Found 4 data files in src
Processing src/C####.gcda
  ignoring data for external file /usr/include/c++/4.2.1/bits/allocator.h

那是在 lcov 1.10 中,对吧? - jackyalcine
没错,它已经在1.10中添加了,请参见:http://ltp.sourceforge.net/coverage/lcov/changes.php - peetasan
是的,对于Ubuntu用户来说很糟糕,因为它还没有被添加到“raring”或“saucy”的存储库中。我一直在使用“--extract”方法,但这将使生活变得更加轻松。 - jackyalcine

34

lcov支持一个命令行参数--remove,可以精确地执行您所要求的操作。


(翻译:lcov支持使用命令行参数--remove来满足您的需求。)

16
--extract选项可能更有用。首先生成包含所有信息的跟踪文件,然后将您关心的目录提取到第二个跟踪文件中。 - Dan
2
请查看此页面,它提供了一个非常有用的 --remove 使用示例: http://qiaomuf.wordpress.com/2011/05/26/use-gcov-and-lcov-to-know-your-test-coverage/. - sdmythos_gr
1
你应该提供一个例子。使用 --remove 会在我们的报告中留下源文件。搜索会带你到我们已经阅读过的 man 页面。 - jww

2

一种可能的方法是限制使用覆盖率标志(-fprofile-arcs -ftest-coverage)编译哪些文件。如果您不想让make文件系统选择性地构建测试仪器化的文件,下面的技巧可能适用于您:

  • 无需测试仪器构建应用程序。
  • 删除要进行测试仪器化的源代码的.o文件。
  • 开启测试仪器并重新构建。只有被删除的目标文件将使用测试仪器重新构建。
  • 运行lcov。

这样应该只会在目标区域产生gcov工件,这些工件会被lcov脚本盲目消耗。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接