独望枫

人在尘世间,有缘自相见,变化千千万,未开窍,已迷恋
posts - 45, comments - 0, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

在《生成单元覆盖率》一文中,我们已经可以成功的生成代码覆盖率报告,但是,不知道各位读者有没发现,整个过程是有一定繁杂的,多个命令搭配诸多不同的参数,对于初初接触的人来说,敲一下看一眼,生怕敲错、或者cv大法来来回回好几趟,生成个报告,没个三几分钟都不行;对于长期使用的熟悉老手来说,或许轻而易举,一切自在心中流淌在手中……但是敲起命令来还得等命令执行完再敲一个,中间CPU空闲时段过长,效率尚有提升空间……

本文记录一下将生成覆盖率脚本化处理过程。

设计思路:通过脚本对qt工程进行编译并运行,然后再通过脚本收集必要的受关注的覆盖率信息进行生成覆盖率报告,最后查看报告。

这样的话,应该会有三个脚本:

编译和运行脚本 : 通过qmake命令对qt工程进行编译,并且在编译成功后运行编译生成的可执行程序,这样就可以得到gcnogcda文件了

收集覆盖率信息、筛选需关注的源码覆盖率信息 : 通过lcov命令对生成的gcnogcda数据进行收集整理,并生成覆盖率报告

查看覆盖率报告 : 将查看覆盖率报告单独出来,主要是方便后续使用。因为我们可能不会频繁的生成覆盖率报告,但可能存在多次查看覆盖率报告的可能性

基于上述的设计思路,可以实现出下面三个脚本:

build_run.sh // 编译运行脚本

currentpath=$(pwd)                                 // 获取当前*.pro工程的目录

cd ..                                                              // 进入上一级目录

buildfolder='build'                                   

if [ ! -d "$buildfolder" ]; then                  // 判断是否已经存在编译目录build

mkdir $buildfolder                        // 不存在的话,先创建一个编译目录build

fi

 

cd $buildfolder                                           // 进入编译目录build

rm ./*                                                           // 删除编译目录build中的前一次编译内容

 

qmake $currentpath                                 // 对当前*.pro工程目录下的pro文件执行qmake,此举会生成Makefile

make clean;                                                // 清除一下

make -j4                                                      // make进行编译

 

./utdemo                                                     // 运行编译后生成的target [utdemo]

 

-j4 : j命令是GCC编译起允许多个编译指令并行,加速编译速度。4是标明允许4个编译指令并行。

计算机生成了可选文字:

lcovreport.sh // 收集处理覆盖率数据并生成覆盖率报告

if [ "$1" == "1" ]; then

#        排除(-r)头文件/gtest/usr的信息,收集所有单元测试及源码的覆盖率信息生成覆盖率报告

    lcov -c -d ../build -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*.h" -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*/gtest/*" -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*/usr/*" -o all.info --rc lcov_branch_coverage=1\

    &&genhtml --branch-coverage -o result all.info

else

#        排除(-r)头文件/gtest/usr的信息、单元测试的信息,只收集所有源码的覆盖率信息生成覆盖率报告()

    lcov -c -d ../build -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*/test_src/*" -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*.h" -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*/gtest/*" -o all.info --rc lcov_branch_coverage=1\

    &&lcov -r all.info "*/usr/*" -o all.info --rc lcov_branch_coverage=1\

    &&genhtml --branch-coverage -o result all.info

fi

-r : 表示remove,从跟进的*.info文件中移除 *.info后面接着的内容

计算机生成了可选文字:

checkreport.sh  // 查看html形式的覆盖率报告

firefox result/index.html

有了三个脚本,那么我们就可以只调用这三个脚本就可生成了。

当然,也可以更进一步弄个 onekey.sh:

./build_run.sh&&./lcovreport.sh&&./checkreport.sh

编译、运行、收集、生成报告、查看报告,一次过搞掂:一键式服务

 

 

对应的demo源码工程,请点击coveragereport_gcov_lcov

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理