我有相同的源文件(C 和 Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试)。这两个目标构建在不同的位置,因此目标文件、.gcno 和 .gcda 文件是分开的。并非所有源文件都编译到单元测试中,因此并非所有对象都将存在。所有源文件都编译到产品构建中。
有没有办法结合两组 .gcda 文件来获得单元测试和集成测试的总覆盖率(因为它们在产品构建上运行)?
我正在使用lcov。
Mac OS X 10.6、GCC 4.0
谢谢!
我有相同的源文件(C 和 Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试)。这两个目标构建在不同的位置,因此目标文件、.gcno 和 .gcda 文件是分开的。并非所有源文件都编译到单元测试中,因此并非所有对象都将存在。所有源文件都编译到产品构建中。
有没有办法结合两组 .gcda 文件来获得单元测试和集成测试的总覆盖率(因为它们在产品构建上运行)?
我正在使用lcov。
Mac OS X 10.6、GCC 4.0
谢谢!
最后我设法通过lcov解决了我的问题。
基本上我所做的如下:
-fprofile-arcs -ftest-coverage --coverage
lcov --directory src/ --capture --output-file coverage_reports/app.info
genhtml -o coverage_reports/ coverage_reports/app.info
我希望这可以对某人有所帮助。
由于您使用的是 lcov,您应该能够将 gcov .gcda 文件转换为 lcov 文件并将它们与 lcov 合并--add-tracefile
。
从手册页:添加跟踪文件的内容。使用 -a 开关指定多个跟踪文件,通过将匹配测试和文件名组合的执行计数相加来组合这些文件中包含的覆盖率数据。
请参阅下面的更新。
我认为这样做的预期方法不是.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
。
有关详细信息,请参阅此答案。
我通过 lcov multi -d 参数合并它,如下所示。有用。
lcov -c -d ./tmp/ -d ./tmp1/ -o ./tmp/coverage.info
一个更简单的替代方法是编译一次共享的 C/ObjC 文件(生成.o
文件或更好的是,单个.a
静态库),然后链接到每个测试中。在这种情况下,gcov 将自动将结果合并到单个.gcno
/.gcda
对中(请注意,测试必须连续运行,以避免访问 gcov 文件时出现竞争)。