13

我有相同的源文件(C 和 Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试)。这两个目标构建在不同的位置,因此目标文件、.gcno 和 .gcda 文件是分开的。并非所有源文件都编译到单元测试中,因此并非所有对象都将存在。所有源文件都编译到产品构建中。

有没有办法结合两组 .gcda 文件来获得单元测试和集成测试的总覆盖率(因为它们在产品构建上运行)?

我正在使用lcov。

Mac OS X 10.6、GCC 4.0

谢谢!

4

5 回答 5

10

最后我设法通过lcov解决了我的问题。

基本上我所做的如下:

  • 使用标志编译应用程序-fprofile-arcs -ftest-coverage --coverage
  • 将应用程序的副本分发到每个节点。
  • 并行执行每个节点中的应用程序。(此步骤在访问主机的应用程序目录中生成覆盖信息)
  • 让 lcov 完成他的工作:
    • lcov --directory src/ --capture --output-file coverage_reports/app.info
  • 生成html输出:
    • genhtml -o coverage_reports/ coverage_reports/app.info

我希望这可以对某人有所帮助。

于 2013-09-10T08:22:24.060 回答
8

由于您使用的是 lcov,您应该能够将 gcov .gcda 文件转换为 lcov 文件并将它们与 lcov 合并--add-tracefile

手册页添加跟踪文件的内容。使用 -a 开关指定多个跟踪文件,通过将匹配测试和文件名组合的执行计数相加来组合这些文件中包含的覆盖率数据。

于 2010-07-30T14:50:34.867 回答
2

请参阅下面的更新。

我认为这样做的预期方法不是.gcda直接组合文件,而是使用创建独立的覆盖数据文件

lcov -o unittests.coverage -c -d unittests
lcov -o integrationtests.coverage -c -d integrationtests

然后每个覆盖数据代表一个“运行”。您当然可以创建单独的图形或 html 视图。但是您也可以使用--add-tracefile,-a来组合数据

lcov -o total.coverage -a unittests.coverage -a integrationtests.coverage

您可以从中total.coverage生成总报告,genhtml例如使用。

更新:我发现实际上可以.gcda直接使用 合并文件gcov-tool,不幸的是在 Mac 上不容易获得,所以这个更新没有回答原始问题。

但是gcov-tool您甚至可以将许多集合逐步合并为一个:

gcov-tool merge dir1 dir -o dir
gcov-tool merge dir2 dir -o dir
gcov-tool merge dir3 dir -o dir

尽管这没有记录在案,并且可能存在依赖风险。

这非常快,并且避免了 lcov 上的迂回方式,后者在合并多个集合时要慢得多。在我的机器上合并大约 80 组 70 个文件需要不到 0.5 秒。而且你仍然可以lcov在聚合集上做一个,如果你需要的话,这也快得多。cov-mode我使用直接使用文件的Emacs .gcov

有关详细信息,请参阅此答案

于 2020-04-15T14:30:10.320 回答
1

我通过 lcov multi -d 参数合并它,如下所示。有用。

lcov -c -d ./tmp/ -d ./tmp1/ -o ./tmp/coverage.info
于 2017-04-20T06:30:34.053 回答
0

一个更简单的替代方法是编译一次共享的 C/ObjC 文件(生成.o文件或更好的是,单个.a静态库),然后链接到每个测试中。在这种情况下,gcov 将自动将结果合并到单个.gcno/.gcda对中(请注意,测试必须连续运行,以避免访问 gcov 文件时出现竞争)。

于 2022-01-09T05:53:14.187 回答