在單元測試中,很容易知道已經覆蓋了哪些程式碼區域。但是我們能及時知道API呼叫的動態範圍嗎?我們一直在思考,既然已經編寫了許多 E2E 測試用例,但是我們應該繼續編寫多少剩餘測試?
在單元測試中,很容易知道已經覆蓋了哪些程式碼區域。但是我們能及時知道API呼叫的動態範圍嗎?我們一直在思考,既然已經編寫了許多 E2E 測試用例,但是應該繼續編寫多少剩餘測試?永遠不夠?或者我們可以止步於此?
我們需要一個可以告訴當下在哪裡的女巫,她就是 Java Agent。
什麼是 Java Agent什麼是Java代理?Java代理是為應用程式提供檢測功能的軟體元件。在代理的上下文中 ,檢測提供了重新定義在執行時載入的類內容的功能。
幸運的是,我們有 Jacoco 代理。Jacoco 代理是 Java 代理之一,它可以在 JVM 載入類檔案時標記類程式碼,並在呼叫任何程式碼後及時計算覆蓋範圍。我們可以轉儲覆蓋資料並上傳到SonarQube 以使其視覺化。獲取最新的Jacoco代理
我們可以從其官方網站(https://www.eclemma.org/jacoco/) 獲得最新的 jacoco 代理。請隨時將最新的* .zip檔案下載到本地計算機並解壓縮。只需要使用以下兩個檔案:
lib / jacocoagent.jar –> Java代理用以標記程式碼lib / jacococli.jar –> CLI轉儲覆蓋率資料並生成報告宿主應用程式啟動引數設定開始了!假設有一個偽裝的後端服務應用程式,我們將其命名為“ MyBackendService.jar”。該服務提供了一些RESTful API。一旦任何外部應用程式呼叫了這些API,我們都希望在服務執行良好時計算覆蓋率。啊..聽起來像是基本的E2E測試場景,對吧?最大的不同是,我們將自動開啟瀏覽器來模擬使用者操作(鍵入或單擊)以與後端服務進行互動。
有一種經典的方式(java -jar any.jar)來啟動後端服務並設定引數“ -javaagent”的值。
java -javaagent:/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar MyBackendService.jar
output = tcpserver:這代表JacocoAgent將偵聽埠以處理進一步的請求,以下載覆蓋資料。port = 6300:這意味著jacoco代理正在偵聽哪個埠。include = :這意味著我們可以過濾應該包括哪些原始碼。例如include = com.fizz.api。:com.buzz.controller。*如果我們通過 Docker 執行後端服務怎麼辦?我強烈建議您在 docker 映象中構建jacocoagent。有一個可能的 Dockerfile 示例,如下所示:
#### Dockerfile #####ENV JACOCOAGENT_OPTION -javaagent:/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=*,append=trueCOPY ${JACOCO_AGENT} /jacocoagent.jarADD /MyBackendService.jar /App.jarENTRYPOINT java ${JACOCOAGENT_OPTION} -server -jar /App.jarWatch out! Don't forget to expose the port jacocoagent is litening on. docker run -d -p 32399:33399 -p 6300:6300 myBackendServiceImage:latest
轉儲覆蓋率資料
幾次之後,我假設您的後端 API 服務已經被呼叫了很多次。現在是時候轉儲 coverage 資料了。
java -jar /lib/jacococli.jar dump --address localhost --port 6300 --destfile ./coverage.exec
執行上面的命令以從 jacocoagent tcp 伺服器檢索 coverage 資料,並將資料寫入名為 coverage.exec 的本地檔案。
生成視覺化報告覆蓋率資料檔案(coverage.exec)對任何人都沒有意義。我們可以將其視覺化為 html 或 xml 報告。這是人類友好的格式。
java -jar /lib/jacococli.jar report ./coverage.exec --classfiles ./build/classes --html htmlReportFolder --xml xmlReportFileName.xml
–classfiles:此引數是必需的,它必須是已編譯的類檔案的目錄路徑。例如,如果使用Maven作為構建工具,則應為“ yourPorjectDirectory / taget / classes”。如果是Gradle,則應為“ yourProjectDirectory / build / classes”。
您應該能夠檢查 htmlReportFolder 或 xml 檔案以立即檢視覆蓋範圍,或者出現了其他意外情況。
將報告上傳到SonarQube(可選)如果您有一個獨立的 SonarQube 伺服器,這非常好,因為我們可以將覆蓋率資料報告上傳到 Sonar Web 伺服器,以便其他任何人都可以檢視。
./mvnw sonar:sonar -Dsonar.coverage.jacoco.xmlReportPaths=./xmlReportFileName.xml -Dsonar.java.binaries=./build/classes -Dsonar.sources=./src/main/java -Dsonar.inclusions="**/*Api.java,**/*Controller.java"
sonar.coverage.jacoco.xmlReportPaths:我們在上一步中生成的xml報告檔案的完整路徑。sonar.java.binaries:編譯的類目錄。sonar.inclusions:這是可選的,您可能想知道僅呼叫了多少個api。結論通常,這是您其中一個可能的解決方案,並且記住僅在基於 JVM 的語言中有效。視覺化您的 E2E 測試覆蓋範圍可以指導回答我們身在何處的問題。