本文首發於:Jenkins 中文社區html
對於 JaCoCo,有所瞭解但又不是很熟悉。 "有所瞭解"指的是在 CI 實踐中已經使用 JaCoCo 對單元測試代碼覆蓋率統計: 當代碼 push 到代碼倉庫後,用 JaCoCo 進行單元測試代碼覆蓋率統計,並將相應數據推送到 SonarQube。 "不是很熟"指的是應用場景也僅限於此,並未進行過多研究與實踐。java
前不久,有測試同事提出,想要在實際測試時,用 JaCoCo 統計功能測試代碼覆蓋率。 其主要目的是在通過功能測試後,經過查看代碼覆蓋率統計的相關指標,加強對軟件質量的信心。 經查閱資料,證實這是可行的。git
因爲對 JaCoCo 不甚瞭解,因而查閱官網資料對 JaCoCo 進一步瞭解。web
JaCoCo,即 Java Code Coverage,是一款開源的 Java 代碼覆蓋率統計工具。 它由 EclEmma 團隊根據多年來使用和集成現有庫的經驗教訓而建立。服務器
JaCoCo 應該爲基於 Java VM 的環境中的代碼覆蓋率分析提供標準技術。 重點是提供一個輕量級的、靈活的、文檔良好的庫,以便與各類構建和開發工具集成。app
對 JaCoCo 能夠與現有構建腳本和工具進行集成這裏作進一步說明: 官方提供了 Java API、Java Agent 、CLI、Ant 、Maven、Eclipse 這幾種集成方式; 第三方提供了諸如與 Gradle、IDEA、Jenkins 等其它工具的集成方式。框架
JaCoCo 不只支持統計本地服務的代碼覆蓋率,也支持統計遠程服務的代碼覆蓋率。 單元測試覆蓋率統計就是統計本地服務的代碼覆蓋率,代碼和運行的服務在一臺機器上,筆者這裏經過使用 JaCoCo Maven 插件完成的。 而功能測試代碼覆蓋率統計則是統計遠程服務的代碼覆蓋率,代碼和運行的服務通常不在一臺機器上,這裏須要藉助 JaCoCo Java agent 實現。maven
備註:實際上,JaCoCo Maven 插件也使用了 JaCoCo Java agent,不過用戶不須要直接關係 Java agent 及其選項,Maven 插件都透明地處理了。tcp
能夠從 JaCoCo 官網下載分發包,也能夠從 Maven 倉庫(中央倉庫或私服)下載。 分發包的 lib 目錄下,包括如下庫:工具
須要將 jacocoagent.jar 推送到部署應用的服務器上,筆者這裏用 Ansible 進行了批量推送。 Java 應用啓動腳本須要加入相似下面的 JVM 參數:
JAVA_OPTS="$JAVA_OPTS -javaagent:/path/jacocoagent.jar=includes=*,output=tcpserver,append=false,address=$IP,port=$JACOCO_PORT"
這樣在應用成功啓動後,會暴露一個 TCP 服務,客戶端能夠鏈接到這個服務並獲取執行數據文件。
相關屬性說明以下:
Jenkins 任務大體有幾個步驟:拉取代碼,構建,dump 應用執行數據( jacoco.exec ),解析 JaCoCo 產生的 jacoco.exec 文件,而後生成覆蓋率報告(HTML 格式)。 拉取代碼這裏無需多說,配置下從代碼倉庫(SVN/Git)和分支地址就能夠了,比較簡單。 構建這裏用了 Jenkins Pipeline Maven Integration Plugin ,筆者這裏所用的 Maven 命令是 mvn clean package -Dmaven.test.skip=true 。 dump 應用執行數據這裏有多種方式:Ant、CLI、Maven,由於Java 應用是用 Maven 構建的,這裏選擇了 Maven Jacoco Plugin。 解析 JaCoCo 產生的 jacoco.exec 文件,而後生成覆蓋率報告(HTML 格式)筆者這裏使用了 Jenkins Jacoco Plugin。
Jenkins Pipeline 案例以下:
pipeline { agent any tools { jdk 'JDK1.8' } stages { stage('Checkout'){ steps{ git branch: '${GIT_BRANCH}', credentialsId: 'xxx-xxx-xx-xx-xxx', url: '${GIT_URL}' } } stage('Build') { steps{ withMaven(maven: 'maven'){ sh "mvn clean package -Dmaven.test.skip=true" } } } stage('DumpFromServer'){ steps { withMaven(maven: 'maven'){ sh 'mvn org.jacoco:jacoco-maven-plugin:0.8.4:dump -Djacoco.address=${SERVER_IP} -Djacoco.port=${JACOCO_PORT}' } } } stage('JacocoPublisher') { steps { jacoco() } } } }
JaCoCo 覆蓋率報告,部分截圖以下:
筆者所實現的方式並未覆蓋任何場景,可是大同小異,相關工具的使用詳情能夠查看官網文檔,由於它是最全面的。 筆者但願這個實踐能給有相似訴求的同行一些參考,固然筆者也但願可以和你們互相交流。 同時筆者的 JaCoCo 實踐之路並未結束,可能在使用的過程當中會有一些問題須要解決, 後續也將考慮使用 Jenkins API 爲須要統計功能測試代碼覆蓋率的 Java 應用實例自動生成一個對應的 Jenkins 任務, 並在 Java 應用實例銷燬後,對相應的 Jenkins 任務進行清理等其它功能。
做者:王冬輝