ros/ros2 测试代码覆盖率检测

ros/ros2 测试代码覆盖率检测

写在前面

本文档是关于如何在ros/ros2的项目中检测测试代码的覆盖率。本文以ros2项目为例。

相关名词

gcc是linux平台下的C、C++ 编译器

编译参数:

-fprofile-arcs:使得编译后的文件运行生成弧跳变的次数和其他的概要信息,用于生成.gcda
-ftest-coverage:生成.gcno文件,汇总文件源码块信息和行号

生成文件:

.gcno:是由-ftest-coverage编译时产生的,它包含了重建基本块图和相应的块的源码的行号的信息
.gcda:是有-fprofile-arcs产生的,它包含了程序运行时生成执行次数
.gcov:文本格式的覆盖信息由gcno和gcda合并而成

gcov是配合gcc产生覆盖信息报告的工具;

lcov:是将gcov产生的报告信息,以更直观的方式显示出来工具.图表图文方式;

genhtml:把lcov产生的信息生成html

配置ros2项目

通用的编译配置项目

写一个通用的编译配置项目,这样在每一个需要检测测试代码覆盖率的项目中都可以直接使用,例:ros2_common
.
├── cmake
│ └── ros2_coverage.cmake
├── CMakeLists.txt
├── package.xml
└── ros2_common-extras.cmake

编译项目

colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Debug -DCOVERAGE_ENABLED=True

运行项目测试代码

colcon test

参数解释

生成全量覆盖率
lcov -b <测试代码路径> -d -c -o result.info --rc lcov_branch_coverage=1
-b为指定原代码路径,即生成gcno数据时编译的代码路径
-d为gcda所在目录,可以将所有的gcda放置在一个目录中
-c代表生成覆盖率数据,后面不用给其他参数
-o指定生成的文件名
-r移除文件
–rc lcov_branch_coverage=1表示包含分支数据

Merg多份覆盖率数据
lcov -a phase1.info -a phase2.info -o out.info
其中phase1.info以及phase2.info为独立了的两份覆盖率数据,整合成一份out.info文件

生成html格式的覆盖率报告
genhtml -o result out.info
其中out.info为要解析的覆盖率数据文件,生成的网页会放在result目录下

执行步骤

生成初始零覆盖数据。 这会添加未运行到报表的文件

lcov -c  --initial --rc lcov_branch_coverage=1 --directory build --output-file ${LCOVDIR}/initialcoverage.info

捕获执行的代码数据

lcov -c  --rc lcov_branch_coverage=1 --directory build --output-file ${LCOVDIR}/testcoverage.info

将初始零覆盖率报告与执行的行报告相结合

lcov -a ${LCOVDIR}/initialcoverage.info -a ${LCOVDIR}/testcoverage.info --rc lcov_branch_coverage=1 --o ${LCOVDIR}/fullcoverage.info

仅包含此工作空间内的文件(例如,过滤掉stdio.h等)

lcov -e ${LCOVDIR}/fullcoverage.info "${PWD}/*" --rc lcov_branch_coverage=1 --output-file ${LCOVDIR}/workspacecoverage.info

删除build子目录中的文件,因为它们是生成的文件(如消息,服务等)

lcov -r ${LCOVDIR}/workspacecoverage.info "${PWD}/build/*" --rc lcov_branch_coverage=1 --output-file ${LCOVDIR}/projectcoverage.info

生成html

 genhtml ${LCOVDIR}/projectcoverage.info --output-directory ${LCOVDIR}/html --branch-coverage -p ${PWD}

你可能感兴趣的:(gtest)