lcov - 如何在运行 lcov 程序的同时生成代码覆盖率
问题描述
我有一个在其他机器上运行 unittest 二进制文件的大型项目。因此,gcda 文件是在其他机器上生成的。然后,我将它们下载到本地机器,但不同的目录。每个目录都有源代码。
例如:目录gcda1/src/{*.gcda, *.gcno, *.h, *.cpp}...
、目录gcda2/src/{*.gcda, *.gcno, *.h, *.cpp}...
。
因为项目很大,所以要同时运行多个lcov进程来生成info文件以节省时间。然后合并这些信息文件。
问题是,当我合并这些信息文件时,它将获取目录信息,例如:
gcda1/src/unittest1.cpp
gcda2/src/unittest1.cpp
我要这个:
src/unittest1.cpp
#src/unittest1.cpp # this is expected to merge with above
我使用的命令:
$ cd gcda1
$ lcov --rc lcov_branch_coverage=1 -c -d ./ -b ./ --no-external -o gcda1.info
$ cd ../gcda2
$ lcov --rc lcov_branch_coverage=1 -c -d ./ -b ./ --no-external -o gcda2.info
$ cd ..
$ lcov -a gcda1/gcda1.info -a gcda1/gcda2.info -o gcda.info
$ genhtml gcda.info -o output
根目录包含源代码。
解决方案
描述
好吧,我终于找到了解决这个问题的方法。
生成的信息文件lcov
是纯文本文件。所以我们可以直接编辑它们。
打开这些文件后,您将看到每个文件行都以SF
. 如下所示:
SF:/path/to/your/source/code.h
SF:/path/to/your/source/code.cpp
...
问题
在我的问题中,这些将是:
// file gcda1.info
SF:/path/to/root_dir/gcda1/src/unittest1.cpp
// file gcda2.info
SF:/path/to/root_dir/gcda2/src/unittest1.cpp
而且,lcov
合并后,它将是:
// file gcda.info
SF:/path/to/root_dir/gcda1/src/unittest1.cpp
SF:/path/to/root_dir/gcda2/src/unittest1.cpp
但是,我希望这样:
// file gcda.info
SF:/path/to/root_dir/src/unittest1.cpp
方法
我解决问题的方法是直接编辑信息文件。
首先,编辑gcda1.info
和,gcda2.info
更改/path/to/root_dir/gcda1/src/unittest1.cpp
为/path/to/root_dir/src/unittest1.cpp
和。/path/to/root_dir/gcda2/src/unittest1.cpp
/path/to/root_dir/src/unittest1.cpp
然后像下面这样合并它们并生成 html 报告:
$ lcov -a gcda1.info -a gcda2.info -o gcda.info
$ genhtml gcda.info -o output
在大型项目中,我们不能手动编辑每个 info 文件,否则会崩溃。
我们可以sed
用来帮助我们。如下所示:
$ sed "s/\(^SF.*\/\)gcda[0-9]+\/\(.*\)/\1\2/g" gcda_tmp.info > gcda.info
推荐阅读
- ios - pod 'Firebase' 未安装
- r - 在 R markdown 中,如何在 r 块设置为 results = 'asis' 时输出可排序表
- ios - SwiftUI 中的 textFieldDidBeginEditing 和 textFieldDidEndEditing
- python - Keras predict_proba 中的神经网络总是返回概率等于 1
- docker - docker image - GraphDriver 的合并/diff/work/LowerDir 组件
- flutter - 我想将变量从一个类传递到另一个类
- aws-lambda - AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误
- vba - 当电子邮件率增加时发送警报的收件箱规则
- sql-server - 我收到语法错误,不知道如何修复它们
- node.js - docker文件中的Mysql连接问题