汇总不同绝对目录的lcov输出

时间:2018-07-02 11:11:46

标签: gitlab-ci lcov

我在不同的测试套件上使用代码覆盖率,并且这些套件在不同的目录下启动。 假设我的suite1在目录/path1/mysoft/src中启动,而我的suite2在目录/path2/mysoft/src/中启动

我使用/path1/mysoft(分别是path2)在lcov -d . -c -o suite1.info(分别与suite2)中启动lcov。

然后,我想累计两个测试套件的覆盖率。我将suite1.infosuite2.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文件。

感谢您的帮助!

1 个答案:

答案 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可以找到它们。