Jenkins中集成Gcov代码覆盖率报告
最近終于把gcov代碼覆蓋報(bào)告集成到j(luò)enkins中了,總算是完成工作,寫(xiě)篇博客總結(jié)下。
我循序漸進(jìn)地用了三個(gè)工具:gcov, lcov, gcovr
這三個(gè)工具原理(其實(shí)gcovr依賴(lài)于GNU的gcov的)都是收集你程序run之后所產(chǎn)生的*.gcda文件,總的來(lái)說(shuō),我個(gè)人覺(jué)得比較喜歡lcov,應(yīng)為lcov的報(bào)告讀起來(lái)很不錯(cuò),可惜它不能集成到Jenkins。。。
從頭說(shuō)起。。。
一開(kāi)始我用的是GNU tool gcov,網(wǎng)上學(xué)習(xí)了下gcov,生成了xx.cpp.gcov報(bào)告,然后就可以查看了,gcov給我的感覺(jué)是比較基礎(chǔ),最大的缺點(diǎn)是不能統(tǒng)計(jì)所有代碼的覆蓋信息(我是用cmake,有可能我的CMakeLists.txt中有好多target,比如,我寫(xiě)了個(gè)CMakeLists.txt,這個(gè)文件中產(chǎn)生2個(gè)目標(biāo),一個(gè)叫hello_world,一個(gè)叫g(shù)oodbye_world,這個(gè)hello_world里有2個(gè)源文件,然后這個(gè)goodbye_world里假設(shè)也有兩個(gè)文件,但是我想查看總的代碼覆蓋情況,也就是兩個(gè)目標(biāo)run之后4個(gè)源文件的代碼覆蓋情況),而且生成的報(bào)告不是那么human-readable。
隨后,又開(kāi)始研究,找到了一個(gè)叫l(wèi)cov前端工具,將lcov和genhtml連起來(lái)用確實(shí)生成的HTML報(bào)告讀起來(lái)很棒,行覆蓋率、分支什么的都有,而且又能收集多個(gè)目標(biāo)執(zhí)行后的代碼覆蓋率,但是lcov生成的報(bào)告不能被Jenkins追蹤,也沒(méi)有覆蓋率趨勢(shì)。
于是,又再次研究,用Google搜到篇老外的文章,http://www.semipol.de/archives/320,里面講了用gcovr可以生成xml文件,這個(gè)xml文件是可以被Cobertura讀取解析,而這個(gè)Cobertura是Jenkins的一個(gè)現(xiàn)有java統(tǒng)計(jì)覆蓋率的插件,這下就找到方向了!
有了方向,我就開(kāi)始做了,首先:在Jenkins上找到了Cobertura這個(gè)插件并安裝,然后,配置下你的編譯,我是直接執(zhí)行了shell腳本,就是Jenkins的構(gòu)建的Execute shell,比如,sh mybuild.sh,緊接著,在你的Jenkins工程中增加post-build action,見(jiàn)下圖,讓這個(gè)插件去讀這個(gè)coverage.xml文件,接下來(lái)就是怎么生成這個(gè)coverage.xml文件了。
隨后,我在網(wǎng)上下了個(gè)gcovr,是用gcovr -x -r "source_dir" --output "output_dir/coverage.xml"生成了上面插件需要的coverage.xml文件,你可以把它寫(xiě)到上面的mybuild.sh中,其實(shí)mybuild.sh肯定還有其他shell命令,比如先運(yùn)行你的程序,進(jìn)入目錄什么的。
ok,如果編譯沒(méi)什么錯(cuò)誤的話(huà),最后你就能在Jenkins中看到gcov的報(bào)告了。
至此,Jenkins集成Gcov報(bào)告就結(jié)束了,如果你用的是cmake的話(huà),我強(qiáng)烈推薦下老外寫(xiě)的CMake腳本,這些腳本很強(qiáng)大,可以集成到你的CMakeLists.txt中,使你不需要去寫(xiě)gcovr -x -r "source_dir".....這些命令了,因?yàn)槔贤庵苯訉?xiě)好了,額,open source就是強(qiáng)大??!
Cmake coverage 腳本:https://code.cor-lab.de/projects/rsc/repository/revisions/master/entry/cmake/Modules/EnableCoverageReport.cmake
相關(guān)解析腳本: https://code.cor-lab.de/projects/rsc/repository/revisions/master/entry/cmake/Modules/ParseArguments.cmake
找lcov腳本: https://code.cor-lab.de/projects/rsc/repository/revisions/master/entry/cmake/Modules/FindLcov.cmake
找gcovr腳本:https://code.cor-lab.de/projects/rsc/repository/revisions/master/entry/cmake/Modules/Findgcovr.cmake
gcovr下載地址:https://pypi.python.org/pypi/gcovr/ 解壓后,使用scripts/gcovr就可以了
下載完上述4個(gè)腳本和gcovr工具后,你就可以在你的CMakelists.txt中加入了,具體我不解釋了,自行查看,下面示范怎么使用:
set(CMAKE_MODULE_PATH "helloworld/cmake/modules" ${CMAKE_MODULE_PATH}) #我把這些腳本放到cmake/modlues目錄下
include(ConfigureCodeCoverage)
if(CODE_COVERAGE)
ENABLE_COVERAGE_REPORT(FILTER "/usr/include/*;/usr/lib/*")
endif(CODE_COVERAGE)
編譯:
先運(yùn)行 cmake --build . --use-stderr
然后運(yùn)行cmake --build . --use-stderr -- target Coverage
運(yùn)行完畢后,你就可以看到locv和gcovr生成的報(bào)告了,因?yàn)槔贤庖呀?jīng)講lcov,gcovr集成進(jìn)EnableCoverageReport.cmake這個(gè)腳本中了。
一些鏈接:
Gcovr user guide:http://gcovr.com/guide.html#gettingStarted
總結(jié)
以上是生活随笔為你收集整理的Jenkins中集成Gcov代码覆盖率报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 路由器怎么设置多台电脑上网有个路由器多台
- 下一篇: 新路由器怎么设置才能上网新路由器如何上网