日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

持续集成Java覆盖率合并

發布時間:2025/1/21 java 91 豆豆
生活随笔 收集整理的這篇文章主要介紹了 持续集成Java覆盖率合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

原來:

后來:(丑了點,但是鏈接進去和上圖中三個一樣,但直觀明了)

#!?/usr/bin/python #?-*-?coding:?utf8?-*-import?os import?re import?sys import?datetime''' @author?????:???U{peterguo<mailto:?peterguo@vip.qq.com>} @copyright??:???tencent @date???????:???2014-03-24 @version????:???1.0.0.0 @desc???????:???1.統計當前目錄下的覆蓋率報表2.如果存在多份報表,則合并生成一個簡單的總表3.支持Java項目(C++后續支持)@note???????????1.生成的覆蓋率總表為./coverage_report/index.html?點擊鏈接失敗則是因為相對路徑問題4.調用時請配合如下shell腳本進行strParam=""for?item?in?`find?.?-name?"frame-summary.html"`dosubPrjName=`echo?$item?|?awk?-F"/"?'{print?$2}'`strParam="$strParam?$subPrjName:$item"donepython?~/bin/merge_cov.py?$strParam '''def?RecursiveListLocDir(strPath,?topdown?=?True):'''遞歸掃描目錄下的所有文件'''vRet?=?[]for?root,?dirs,?files?in?os.walk(strPath,?topdown):for?name?in?files:vRet.append(os.path.join(root,?name))for?name?in?dirs:vRet.append(os.path.join(root,?name)?+?"/")return?vRetclass?CovData(object):'''項目覆蓋率?Java使用:mvn?cobertura:cobertura?Cpp使用:gcov'''????def?__init__(self,?strProjectName,?strHtmlFilePath):'''strHtmlFilePath:?c++?:?index.htmljava:?frame-summary.html'''self.projectMame?=?strProjectName???????????????????????????#項目名,按照目錄級別獲取self.strHtmlFilePath?=?strHtmlFilePath??????????????????????#記錄下原始html,以便拼接鏈接self.strTime?=?datetime.datetime.now().strftime("%Y-%m-%d?%H:%M:%S")???#生成時間self.strType?=?{"index.html":"cpp",?"frame-summary.html":"java"}[os.path.basename(strHtmlFilePath)]if?self.strType?==?"cpp":lRet?=?CovData.GetCppCovIndexHtml(strHtmlFilePath)if?self.strType?==?"java":lRet?=?CovData.GetJavaCov(strHtmlFilePath)self.dLines??=?{"Hit":lRet[0],?"Total":lRet[1],?"Cov":100.0*lRet[0]/(lRet[1]+0.0001)}self.dBranch?=?{"Hit":lRet[2],?"Total":lRet[3],?"Cov":100.0*lRet[2]/(lRet[3]+0.0001)}def?showResult(self):'''按照一定格式打印出來'''print?self.projectMame,?self.strTime,?self.strType,?str(self.dLines),?str(self.dBranch)@staticmethoddef?GetCppCovIndexHtmlOld(strHtmlFilePath):'''index.html'''vPath?=?strHtmlFilePath.split(os.sep)covData?=?CovData()covData.projectMame?=?vPath[-2]?cov_re?=?r"<td?class=\"headerCovTableEntry(\D+)\">(\d+[\.]\d+)"f?=?open(strHtmlFilePath,?'r')html_text?=?f.read()cov_list?=?re.findall(cov_re,html_text)#行覆蓋率covData.strLinesCov?=?str(cov_list[0][1])#函數覆蓋率covData.strFuncCov?=?str(cov_list[1][1])#分支覆蓋率covData.strBranchCov?=?str(cov_list[2][1])cov_re?=?r"<td?class=\"headerCovTableEntry\">(\d+)"hit_total_list?=?re.findall(cov_re,html_text)covData.strLinesHit?=?str(hit_total_list[0])covData.strLinesTotal?=?str(hit_total_list[1])covData.strFuncHit?=?str(hit_total_list[2])covData.strFuncTotal?=?str(hit_total_list[3])covData.strBranchHit?=?str(hit_total_list[4])covData.strBranchTotal?=?str(hit_total_list[5])cov_re?=?r"<td?class=\"headerValue\">(\d+[-]\d+[-]\d+)"time_list?=?re.findall(cov_re,html_text)#時間covData.strTime?=?(time_list[0])return?covData@staticmethod??????def?GetCppCovIndexHtml(strHtmlFilePath):'''index.html'''fp?=?open(strHtmlFilePath,?'r')strCovHtml?=?fp.read()fp.close()#C++覆蓋率直接可以獲取,如下代碼備用lObj?=?re.findall(r"<td?class=\"headerCovTableEntry(\D+)\">(\d+[\.]\d+)",?strCovHtml)fLinesCov?=?float(str(lObj[0][1]))fFuncCov?=?float(str(lObj[1][1]))fBranchCov?=?float(str(lObj[2][1]))lObj?=?re.findall(r"<td?class=\"headerCovTableEntry\">(\d+)",?strCovHtml)nLinesHit,?nLinesTotal???=?int(str(lObj[0])),?int(str(lObj[1]))nFuncHit,?nFuncTotal?????=?int(str(lObj[2])),?int(str(lObj[3]))nBranchHit,?nBranchTotal?=?int(str(lObj[4])),?int(str(lObj[5]))#考慮到項目一般關注行覆蓋率和分支覆蓋率,這里忽略函數覆蓋率return?nLinesHit,?nLinesTotal,?nBranchHit,?nBranchTotal@staticmethod??def?GetJavaCov(strHtmlFilePath):'''frame-summary.html'''fp?=?open(strHtmlFilePath,?'r')strCovHtml?=?fp.read()fp.close()lObj?=?re.findall('''span?class="text">[0-9]{1,}/[0-9]{1,}''',?strCovHtml)?lTmp?=?re.split("[>/']",?str(lObj[0:2]))nLineHit,?nLinesTotal?=?int(lTmp[2]),?int(lTmp[3]),?nBranchHit,?nBranchTotal?=?int(lTmp[6]),?int(lTmp[7])fLinePer?=?nLineHit?*?100.0?/?nLinesTotalfBranPer?=?nBranchHit?*?100.0?/?nBranchTotal#考慮到項目一般關注行覆蓋率和分支覆蓋率,這里忽略函數覆蓋率return?nLineHit,?nLinesTotal,?nBranchHit,?nBranchTotal@staticmethoddef?DumpCov(loCov,?strTargetHtml):'''拼接一個簡單的html頁面,里面帶鏈接,可以跳轉到真正的html覆蓋率報表'''nLinesHit,?nLinesTotal,?nBranchHit,?nBranchTotal?=?0,?0,?0,?0print?"\nMerging?...?into..........?",?strTargetHtml???#生成html總報表?strReportHead?=?'''<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"/><title>覆蓋率報告</title></head><body><table?align="center"?width="70%"?border="1pix"><thead><tr><td?align="center">模塊名稱</td><td?align="center">Hit/Total(行)</td><td?align="center">行覆蓋率</td><td?align="center"?>Hit/Total(分支)</td><td?align="center">分支覆蓋率</td></tr></thead><tbody>'''strReportTail?=?'''</tbody></table><script?type="text/javascript"></body></html>'''?strReportRowFmt?=?'''<tr><td?align="center">%s</td><td?align="center">%d/%d</td><td?align="center"><a?href="%s">%.3f%%</td><td?align="center">%d/%d</td><td?align="center"><a?href="%s">%.3f%%</td></tr>'''fp?=?file(strTargetHtml,?"wt")?fp.write(strReportHead)for?oCovData?in?loCov:oCovData.showResult()nLinesHit???+=?oCovData.dLines["Hit"]nLinesTotal?+=?oCovData.dLines["Total"]????????????nBranchHit??+=?oCovData.dBranch["Hit"]????????????nBranchTotal+=?oCovData.dBranch["Total"]??????????#模塊覆蓋率情況strSourceFileName?=?oCovData.strHtmlFilePathstrRow?=?strReportRowFmt?%?(oCovData.projectMame,?oCovData.dLines["Hit"],?oCovData.dLines["Total"],?"."+strSourceFileName,?oCovData.dLines["Cov"],?\oCovData.dBranch["Hit"],?oCovData.dBranch["Total"],?"."+strSourceFileName,?oCovData.dBranch["Cov"]?)fp.write(strRow)??fLinesCov???=?100.0?*?nLinesHit?/?(nLinesTotal?+?0.0001)fBranchCov??=?100.0?*?nBranchHit?/?(nBranchTotal?+?0.0001)#總體覆蓋率情況strSourceFileName?=?strTargetHtmlstrRow?=?strReportRowFmt?%?("匯總",?nLinesHit,?nLinesTotal,?"."+strSourceFileName,?fLinesCov,?nBranchHit,?nBranchTotal,?"."+strSourceFileName,?fBranchCov)fp.write(strRow)?fp.write(strReportTail)fp.close()print?"Summary:?",?nLinesHit,?nLinesTotal,?fLinesCov,?nBranchHit,?nBranchTotal,?fBranchCov@staticmethoddef?MergeCov(lParams,?strTargetIndexHtml):loCov?=?[]????for?strParm?in?sys.argv[1:]:strProjectName,?strCovHtml?=?strParm.split(":")oCovData?=?CovData(strProjectName,?strCovHtml)oCovData.showResult()????????????loCov.append(oCovData)????????CovData.DumpCov(loCov,?strTargetIndexHtml)def?usage(strScriptName):print?"Usage:?python?%s?proj1:./abc/def/index.html?proj2:./aab/def/index.html"?%?strScriptNameprint?"Exam?:?python?%s?cpp:/usr/local/tomcat/webapps/jenkins/workspace/helloworld-cpp/coverage_result/index.html?java:/usr/local/tomcat/webapps/jenkins/workspace/helloworld-freestyle/target/site/cobertura/frame-summary.html"?%?strScriptNamesys.exit(0)if?__name__?==?"__main__":if?len(sys.argv)?==?1:usage(sys.argv[0])if?not?os.path.exists("./coverage_report"):?os.mkdir("./coverage_report")?CovData.MergeCov(sys.argv[1:],?"./coverage_report/index.html")


典型構建腳本舉例:

#!?/bin/bash#note???:?build,?ut,?coverage,?deploy #author?:?peterguo #date???:?2014.04.24#處理補丁問題 /data/home/jenkins/bin/reverse_patch.sh#findbugs?html?report /usr/maven/bin/mvn?compile?site#執行編譯,ut,覆蓋率 /usr/maven/bin/mvn?install?package?assembly:assembly?cobertura:cobertura?findbugs:findbugs#收集所有的單元測試結果 /bin/mkdir?./xml_test_report?-p;?/bin/cp?$(/usr/bin/find?.?-name?"TEST*xml")?./xml_test_report#同時匯總出一份帶鏈接的html匯總報表 strParam="" for?item?in?`find?.?-name?"frame-summary.html"` dosubPrjName=`echo?$item?|?awk?-F"/"?'{print?$2}'`strParam="$strParam?$subPrjName:$item" done python?~/bin/merge_cov.py?$strParam#部署到測試環境 SRC_PKG=`find?./target/?-name?"jstorm-*tar.gz"` /data/home/jenkins/bin/md5_upload.exp?storm?storm?10.187.139.144?$SRC_PKG?/data/home/storm/deploy/$(basename?$SRC_PKG) /data/home/jenkins/bin/md5_upload.exp?storm?storm?10.187.139.145?$SRC_PKG?/data/home/storm/deploy/$(basename?$SRC_PKG)


轉載于:https://my.oschina.net/sanpeterguo/blog/212771

總結

以上是生活随笔為你收集整理的持续集成Java覆盖率合并的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久一区二区 | 成人自拍视频在线 | 欧美男人操女人 | 国产精品啪啪啪视频 | 少妇饥渴放荡91麻豆 | 人人干干人人 | 日本韩国欧美一区 | 精品探花| 久久久久国产综合av天堂 | 爱情岛论坛自拍亚洲品质极速最新章 | 国产精品极品白嫩在线 | 欧美性生活网址 | 久久免费视频3 | 日本护士╳╳╳hd少妇 | 浪漫樱花在线观看高清动漫 | 成 人 a v天堂| av久操 | 欧美激情欧美激情在线五月 | 日本一二三视频 | 黄色a网站 | 少妇av一区二区 | 国产亚洲欧美一区二区 | 97超碰人人看 | 久久久久久中文 | 毛片视频网址 | 精品久久久视频 | 潘金莲一级淫片a.aaaaa播放 | 四虎久久| 男女羞羞的视频 | www在线观看免费视频 | 亚洲一区二区三区久久 | 国产精品亚洲αv天堂无码 伊人性视频 | 成人va在线观看 | 亚洲AV无码国产精品 | 国产大奶在线观看 | 操一操干一干 | 一个色综合导航 | www.sesehu.com| 亚洲精品一区二区在线观看 | 天天干狠狠干 | 黄色一级片免费观看 | 亚洲热av | 日本人dh亚洲人ⅹxx | 91视频在线观看视频 | 制服丝袜在线一区 | 97午夜| 国产资源在线视频 | 欧美做爰猛烈床戏大尺度 | 国产精品国产三级国产专播精品人 | 性欧美一级 | 国产在线视频二区 | 色综合久久网 | 亚洲免费人成 | 草草影院国产 | 国产主播在线播放 | 成人黄色片免费 | 亚洲精品天天 | 少妇久久久久久久久久 | 久久久久亚洲精品中文字幕 | 少妇av在线 | 亚洲在线一区二区三区 | 涩涩视频软件 | 日本在线视频播放 | 国产人妻人伦精品1国产 | 伊人色综合久久天天 | 国产 日韩 欧美 综合 | 国产96在线 | 又黄又爽的视频 | 免费一级a毛片夜夜看 | 精品免费国产一区二区三区四区 | 国产cao| 国产日韩成人内射视频 | 免费人成网站 | 国产成人无码久久久精品天美传媒 | 黄色亚洲网站 | 爽爽爽av| 精品欧美一区二区三区在线观看 | 日韩精彩视频 | 91动态图| 色婷婷色 | 香蕉视频911 | 国产一区二区三区在线免费 | 亚洲国产私拍精品国模在线观看 | 日韩va在线观看 | 欧美日韩国产精品一区二区三区 | 黄色短视频在线观看 | 玖玖爱精品| 午夜精品美女久久久久av福利 | 四虎影视永久免费观看 | 999综合网| 久久久精品视频一区 | 2019中文在线观看 | 日本中文字幕影院 | a天堂在线资源 | 欧美一级在线视频 | 老湿机69福利区午夜x片 | 国产aⅴ精品一区二区三区久久 | 成人久久一区二区 | a级免费毛片 |