一. 修改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
版权归原作者 cjjmt 所有, 如有侵权,请联系我们删除。