我在不同的测试套件上使用代码覆盖率,并且这些套件在不同的目录下启动。
假设我的suite1在目录/path1/mysoft/src
中启动,而我的suite2在目录/path2/mysoft/src/
中启动
我使用/path1/mysoft
(分别是path2
)在lcov -d . -c -o suite1.info
(分别与suite2
)中启动lcov。
然后,我想累计两个测试套件的覆盖率。我将suite1.info
和suite2.info
文件复制到另一个目录/path3/mysoft
中,该目录也包含程序的源代码。
我可以同时使用lcov -a suite1.info -a suite2.info -o tests.info
进行累积,但是不会累积给定文件src/example.c
的覆盖范围,因为lcov
会考虑/path1/mysoft/src/example.c
和/path2/mysoft/src/example.c
是两个不同的文件。因此累计将无法正常工作。
如何为来自不同基本目录的同一源代码累积代码覆盖率?
一些令人不安的解决方案
lcov -d . -c --rc geninfo_adjust_src_path=/path1 -o suite1.info
删除基本目录。在这种情况下,lcov
将正确累计覆盖率,但是genhtml
将失败,因为它将无法在正确的位置找到源代码。目前,我不知道path3
是什么,因此无法将path1
替换为path3
。lcov
选项在累积geninfo_adjust_src_path
输出时重命名基本目录。我一直无法做到:启动lcov -a suite1.info -a suite2.info --rc geninfo_adjust_src_path='path1 => path3' --rc geninfo_adjust_src_path='path1 => path2' -o tests.info
并没有任何改变。某些上下文
为什么我要在不同的基本目录中启动测试套件?好吧,持续集成确实可以做到这一点。因此path1
类似于/home/gitlab/builds/b8e873c2/0/
。每个测试套件都在不同的工作中启动,并且累积覆盖范围也在另一个工作中完成。每个作业都在不同的基本目录中启动,并且使用工件来检索.info
文件。
感谢您的帮助!
答案 0 :(得分:1)
有一个答案,可能不是最优雅的。由于源文件名以纯文本格式存储,因此可以使用sed
轻松更改它们。
因此,所有启动的命令都应如下所示(提醒每个命令实际上是由不同的作业启动的):
lcov -d . -c --rc geninfo_adjust_src_path=/path1 -o suite1.info # in /path1/mysoft
lcov -d . -c --rc geninfo_adjust_src_path=/path2 -o suite2.info # in /path2/mysoft
# From /path3/mysoft, after retrieving suite1.info and suite2.info
lcov -a suite1.info -a suite2.info | sed 's/^SF:/mysoft/SF:/path3/mysoft' > tests.info
两条首行从/path1
文件中删除了对/path2
或.info
的任何引用。第三行在源文件路径的前面添加对/path3
的引用,以便genhtml可以找到它们。