1

在使用 lcov(用于 C++ 开发)对我的产品执行测试覆盖后,我想绘制一个矩阵以在测试名称和它所覆盖的文件之间建立对应关系。
我们的想法是快速查看 1 个测试文件所涵盖的代码。

例如:

xxxx |文件 1 |文件 2 |文件 3 |文件 4 | 文件 5 |
测试 1 | 是 | 否 | 是 | 是 | 是 |
测试 2 | 是 | 否 | 否 | 没有 | 否 |
测试 3 | 是 | 是 | 否 | 否 | 是 |

在我的项目中,我需要运行数千次测试来检查数千个文件的覆盖率,因此矩阵会很大。

不幸的是,GCOV 在设计上似乎不是这样工作的,因为我们将只有一组涵盖整个代码的 gcda 文件,而且看起来不可能确定哪个测试涵盖了代码的哪一部分。

我能想到的唯一解决方案是以下一个:

for current_test in all_tests do:
    run 1 current_test
    retrieve gcda -> .info file
    extract from the .info file the name of covered code files
    append the matrix with current_test / code filename

问题是它会非常长,因为这样做,1 次测试大约需要 5 分钟......我将花费数周时间等待......

任何想法都会受到欢迎。

非常感谢你的帮助。问候,托马斯

4

1 回答 1

1

不幸的是,gcov 数据不包括测试名称,它们必须在后处理中添加。因此,如果您停留在基于 gcov 的覆盖率集合中,那么您的顺序循环是明智的方法。

您可以尝试的解决方法:

  • 使用适当的GCOV_PREFIX变量运行测试,以便将覆盖范围写入不同的目录,而不是在目标文件旁边。

  • 使用不同的覆盖工具。例如,kcov 执行运行时检测并将覆盖结果写入您指定的目录。但是,覆盖数据格式不适用于基于 gcov 的工具。

  • 将您的测试分布在多台机器上。

我的猜测是 GCOV_PREFIX 可能适用于您的场景,以便您可以轻松地并行运行测试。这个变量有点繁琐,因为您需要知道目标文件的绝对路径,但与为覆盖矩阵等待数天相比,弄清楚这一点可能更容易。

于 2018-07-20T16:28:56.293 回答