0


OpenHarmony本地代码和接口覆盖率可视化操作梳理

一. 修改gn文件,编译执行测试套

1. 修改业务侧BUILD.gn文件,增加编译选项

涉及到自己子系统的BUILD.gn中cflags或cfalgs_cc及idflags都需要加--coverage字段

C:

C++:

cflags_cc = [

“--coverage”,

]

2.设置lcov统计“branch coverage”的方法(若不需要分支覆盖率,可忽略此步骤)

Lcov(1.10及往后)默认是关闭 分支覆盖率的。

若要locv生成分支branch信息、输出基本块,需要修改/etc/lcovrc或~/.lcovrc文件,修改如下配置:

vi /etc/lcovrc
# Specify if branch coverage data should be collected andprocessed.

lcov_branch_coverage = 1                             //去掉注释,值改为1
# Include branch coverage datadisplay (can be disabled by the --no-branch-coverage option of genhtml)

genhtml_branch_coverage = 1                         //去掉注释,值改为1.

3. 编译测试版本+目标用例

./build.sh --product-name rk3568 --ccache --target-cpu arm64
./build.sh --product-name rk3568 --ccache --target-cpu arm64 --build-target make_test 

tips: make_test为编译全部测试用例,也可编译指定测试用例

Tips:如何检查覆盖率版本是否编译成功?

编译完成后需要在out/产品(rk3568)/obj/目录下,根据源码目录查找到对应的C/C++文件的gcno,说明覆盖率插桩成功

4. 在windows下搭建执行环境,执行测试用例

Windows环境搭建可参考官方文档:

test_developertest: Development self-test framework | 开发者自测试框架

执行测试用例前可检查设备是否在线,start.bat中执行list,若显示online则设备在线。若设备离线,可在config文件夹中的user_config.xml文件中添加port和sn号。

还需要在user_config.xml文件配置用例路径(可参考以上搭建执行环境官方文档)

tips: <testcase>标签表示是否需要编译用例;<dir>标签表示测试用例查找路径。若不配置,覆盖率文件会自动生成在设备侧的对应源码的编译路径下

在windows坏境下启动测试框架developtest/start.bat

执行测试用例,这里以account子系统中的account_event_provider_test为例

run -t UT -ts account_event_provider_test -cov coverage

tips: -t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF,FUZZ,BENCHMARK等。(必选参数)-tp [TESTPART]: 指定部件,可独立使用。-tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。-ts [TESTSUITE]: 指定测试套,可独立使用。-tc [TESTCASE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。-h : 帮助命令。

执行过程中可在设备中查看(tips: 此步是为了查看覆盖率文件是否生成)

hdc_std shell在设备的data/test/obj查看

5. 查看测试生成gcda文件

执行完毕后设备中的gcda会pull到test/developertest/reports/coverage中

Tips:(1)若在步骤3中生成gcda文件,但是在reports中没有生成coverage,检查coverage outpath是否配置正确

(2)在reports在建立coverage/data/cxx/测试套名,然后手动将对应obj目录pull到coverage/data/cxx/测试套名 目录下即可

  • 二. 使用本地代码覆盖率脚本

6. 将localCoverage目录解压并挪至编译机的test目录

localCoverage的python脚本已上传至gitee,链接如下:

本地代码和接口覆盖率: 用于本地代码和接口覆盖率的python脚本

将步骤4中生成的coverage文件夹复制到localCoverage/codeCoverage/results目录下

解压完之后执行

dos2unix test/localCoverage/codeCoverage/codeCoverage_gcov_lcov.py

7. 修改python脚本中的路径

打开**localCoverage/codeCoverage/**** codeCoverage_gcov_lcov.py**

修改CODEPATH至代码根目录

修改OUTPUT路径,此处产品名为rk3568

修改llvm-cov工具的路径:修改codeCoverage目录下的llvm-gcov.sh文件为(可通过在源码路径下搜索find . -name “llvm-cov”即可)

Llvm-gcov.sh文件格式如果是dos,请改成unix(dos2unix llvm-gcov.sh)

exec /home/cjj/open/prebuilts/clang/ohos/linux-x86_64/llvm/bin/llvm-cov gcov "$@"

8. 执行脚本

在test/localCoverage/codeCoverage目录下执行python codeCoverage_gcov_lcov.py即可

若出现下图中错误(若无错误可忽略直接查看报告)

可单独运行“single_test**”后面的命令:

lcov -c -b /home/cjj/open/out/rk3568 -d  /home/cjj/open/test/localCoverage/codeCoverage/results/coverage/data/cxx/AccountEventProviderTest/obj/base/account --gcov-tool /home/cjj/open/test/localCoverage/codeCoverage/llvm-gcov.sh -o /home/cjj/open/test/localCoverage/codeCoverage/results/coverage/reports/cxx/single_test/AccountEventProviderTest/account_output.info --ignore-errors source,gcov

若运行后出现need tool ...llvm-gcov.sh

则可为llvm-gcov.sh赋予执行权限:chmod 777 llvm-gcov.sh

重新执行

lcov -c -b /home/cjj/open/out/rk3568 -d  /home/cjj/open/test/localCoverage/codeCoverage/results/coverage/data/cxx/AccountEventProviderTest/obj/base/account --gcov-tool /home/cjj/open/test/localCoverage/codeCoverage/llvm-gcov.sh -o /home/cjj/open/test/localCoverage/codeCoverage/results/coverage/reports/cxx/single_test/AccountEventProviderTest/account_output.info --ignore-errors source,gcov

若出现以下错误

可执行dos2unix llvm-gcov.sh,将DOS格式文本文件转换成Unix格式

重新运行上述lcov -c -b...脚本直到出现

然后再执行

python codeCoverage_gcov_lcov.py

查看报告:在codeCoverage/results/coverage/reports/cxx/html下生成可视化报告,打开index.html即可查看。

三 . 本地接口覆盖率脚本使用

9. 检查接口覆盖率的必要文件路径

接口覆盖率数据生成是依赖步骤二中代码覆盖率生成的info文件(ohos_codeCoverage.info)

10. 修改localCoverage/interfaceCoverage/get_innerkits_json.py到对应路径:

可直接修改为绝对路径:

11. 执行python get_innerkits_json.py

检查out/rk3568/packages/phone/innerkits/ohos-arm64/kits_modules_info.json文件的存在

12. 修改localcoverage/interfaceCoverage/interfaceCoverage_gcov_lcov.py

修改脚本中的line3~9到对应路径:

13. 执行python interfaceCoverage_gcov_lcov.py

14.查看报告

**在localCoverage/interfaceCoverage/results/coverage/**interface_kits目录挪至本地,查看报告

四. 使用命令行生成本地代码覆盖率(步骤二也可手动操作,已完成步骤二可忽略此步)

1. 将生成的.gcda合并到.o/.gcno文件夹中

.o/.gcno文件路径一般为(可通过find . -name “*.gcno”查找)

Z:\home\cjj\open\out\rk3568\obj\base\account\os_account\services\accountmgr\src\AccountEventProviderTest

tips:gcda文件是执行测试测试用例,在设备上自动生成覆盖率数据文件,.o/.gcno文件是linux编译机上编译过程中生成的。

合并后,gcda,.o/.gcno文件在同一文件夹下

2. 生成info文件

解析gcda依赖特定的gcov版本,可通过-gcov-tool指定,手动创建llvm-gcov.sh文件

在源码根目录下创建文件夹local_tools

mkdir local_tools

创建llvm-gcov.sh文件:

cd local_tools/

touch llvm-gcov.sh

使用项目编译是使用的clang对应的llvm-cov版本,在文件中写入以下内容:

#!/usr/bin/env sh
exec /home/cjj/open/prebuilts/clang/ohos/linux-x86_64/llvm/bin/llvm-cov gcov "$@"

增加可执行权限:

chmod +x llvm-gcov.sh

生成info文件:

cd ~/open/out/rk3568/obj/base/account
lcov -d . -o cov_oa_all.info -c --gcov-tool ~/open/local_tools/llvm-gcov.sh

若直接用此时生成的info文件生成可视化数据,则包含了其他模块的统计信息

3. 去除非本模块信息

cov_oa_all.info包含了其他模块的统计信息,需要去除,使用-remove,根据实际情况设置

例如

lcov -o rm_cov_oa_all.info  --remove cov_oa_all.info  "*/third_party/*" "*/v1/*"

4. 生成可视化数据

genhtml -o result --ignore-errors source rm_cov_oa_all.info


本文转载自: https://blog.csdn.net/cjjmt/article/details/126487676
版权归原作者 cjjmt 所有, 如有侵权,请联系我们删除。

“OpenHarmony本地代码和接口覆盖率可视化操作梳理”的评论:

还没有评论