我有相同的源文件(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
希望这对某些人有所帮助。
--add-tracefile
将它们合并。lcov -o unittests.coverage -c -d unittests
lcov -o integrationtests.coverage -c -d integrationtests
--add-tracefile
(简写为-a
)组合数据。”lcov -o total.coverage -a unittests.coverage -a integrationtests.coverage
通过使用例如genhtml
,您可以从total.coverage
生成总报告。
更新:我发现实际上可以直接使用gcov-tool
合并.gcda
文件,但不幸的是这些工具在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
操作,这也非常快速。我使用Emacs cov-mode
直接使用.gcov
文件。有关详细信息,请参见此答案。我使用以下的lcov多-d参数合并它。它有效。
lcov -c -d ./tmp/ -d ./tmp1/ -o ./tmp/coverage.info
.o
文件或者更好的是,单个.a
静态库),然后链接到每个测试中。在这种情况下,gcov会自动合并结果到单个.gcno
/.gcda
对中(注意测试必须按顺序运行,以避免访问gcov文件时出现竞争)。
--coverage
在编译时等同于-fprofile-arcs -ftest-coverage
,在链接时等同于-lgcov
,因此同时使用所有这些选项是冗余的。 - Bulletmagnet