我正在尝试使用lcov为我的单元测试套件生成覆盖率报告,但是我什至无法捕获跟踪文件。错误消息表明找不到源文件。该代码由构建机器上的Jenkins作业编译,单元测试作为目标机器上的下游作业执行。源代码和gcno文件被传输到下游作业,然后下游作业执行对lcov的调用。以下是所有详细信息,可能需要一杯咖啡。
在构建机器上,执行make
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/
我想要覆盖的源代码在以下子目录中
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/
目标文件和gcno文件在相对于相应cpp文件的子目录o中生成。所以举个例子
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/Myclass.cpp /var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/o/Myclass.o /var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/o/Myclass.gcno
源文件和gcno文件被复制到单元测试机器,并保持相同的文件夹结构,最终在
/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/ Note: There is a difference in the name of the workspace folder, "App-Coverage-Unittest" instead of "App-Coverage" since these two Jenkins jobs cannot have the same name.
所以现在有例如
/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/Myclass.cpp /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.o /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.gcno
单元测试在
/opt/app/test/app
使用GCOV_PREFIX_STRIP和GCOV_PREFIX,我将gcda文件显示在与gcno文件相同的文件夹中,例如
/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.gcno /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.gcda
现在,我想使用lcov生成一份覆盖率报告,但是我似乎不太了解如何正确设置路径。以下示例由Jenkins单元测试作业从/ var / lib / jenkins / workspace / App-Coverage-Unittest /执行。
例如我试过
lcov -d BUILD/app/packages/ -c --no-external -o app.info -b /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/
推理:“-d BUILD / app / packages /”是我想要涵盖的内容,“-b / var / lib / jenkins / workspace / App-Coverage-Unittest / BUILD / app /”是我的项目的基础,我执行了make(但是在具有不同工作空间名称的构建计算机上…)。
我也试过
lcov -d BUILD/app/packages/ --capture --no-external --output-file app.info
推理:“-d BUILD / app / packages /”是我要介绍的内容,请不要设置-b,因为每个gcno / gcda与相应源文件之间的相对路径与构建机器上的相对路径相同,也许lcov可以确定出来。
在这两种情况下,都会出现诸如“无法打开源文件/var/lib/jenkins/workspace/App- Coverage/BUILD/app/packages/subdir/Myclass.cpp”之类的错误消息。注意:此路径中的工作区文件夹是构建计算机的工作区文件夹,而不是单元测试机。我认为这是- b选项要解决的问题。显然,这是非常可疑和有价值的线索。我还会收到诸如“无法打开源文件../../../packages/subdir/Myclass.h”之类的错误,我想这与我包含头文件的方式有关。
我尝试在这里指定所有路径。是否可以使用lcov在单元测试作业的工作空间中生成覆盖率报告,就像我在这里尝试做的那样?如果是,为lcov -d和- b标志指定哪些正确路径?如果没有,我需要更改使其工作吗?
幸运的是,答案是肯定的,这是可能的。我收到了lcov开发人员的答复,为我提供了解决方案,谢谢Peter!
他指出,所有源代码路径在编译步骤中都会硬编码到.gcno文件中。但是,尽管没有找到源文件(并产生警告),但lcov仍将仅基于.gcda和.gcno文件中的数据来生成代码覆盖率输出,即使找不到源代码也是如此。但是,genhtml步骤将失败,因为它无法找到要用代码覆盖率数据进行注释的源代码。
解决方案是使用lcov的“ geninfo_adjust_src_path”配置设置。通过使用此设置,指示lcov在写入输出.info文件时将.gcno文件中找到的源代码路径更改为正确的源代码路径。因此,就我而言:
lcov -d BUILD/app/packages/ --capture --no-external --output-file app.info --rc geninfo_adjust_src_path="/var/lib/jenkins/workspace/App-Coverage/BUILD/ => /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/"
The warnings “Cannot open source file” will still be there when invoking lcov, but the resulting .info file will contain the correct paths and can therefore be converted to HTML on the test machine using genhtml.