持续集成Java覆盖率合并
生活随笔
收集整理的這篇文章主要介紹了
持续集成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覆盖率合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA struts2
- 下一篇: Banana PI 香蕉派项目