【发布时间】:2017-03-31 06:54:19
【问题描述】:
我正在尝试使用 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 在 unittest 作业的工作区中生成覆盖率报告,就像我在这里尝试做的那样?如果是,哪些是为 lcov -d 和 -b 标志指定的正确路径?如果没有,我需要进行哪些更改才能使其正常工作?
【问题讨论】:
标签: gcc jenkins code-coverage gcov lcov