jacoco(spring boot啟動) agent tcpserver使用方案


公司突然要求自動化測試對代碼的覆蓋率,故研究了一波jacoco相關

現狀

  1. 要拉取的是接口自動化測試的覆蓋率,非單元測試的,所以本身必須是在服務部署通過的情況下進行覆蓋率的收集
  2. 我們這使用的是容器,java springboot的框架

 

agent官網去學習了一波

調研了一波

  • ant和maven的方法都是在編譯過程中單元測試時出分辨率
  • jacoco agent是在服務啟動后,收集代碼覆蓋率

https://www.jacoco.org/jacoco/trunk/doc/

本次主要會用到2個功能 agent和cli

https://www.jacoco.org/jacoco/trunk/doc/agent.html

https://www.jacoco.org/jacoco/trunk/doc/cli.html

 

其實實際使用並不難,主要是在springboot的啟動命令里面加入javaagent的參數配置,官方提供了2種方案(tcpclient沒看到外面有人使用 故先忽略)

  1. output=file
    • 在每次服務結束時統一收集覆蓋率dump
    • java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=file,append=true,destfile=/tmp/jacoco/service/demo/jacoco.exec -jar demo-0.0.1-SNAPSHOT.jar 
  2. output=tcpserver
    • 開放一個tcp端口,可以在過程中收集覆蓋率dump
    • java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar demo-0.0.1-SNAPSHOT.jar 
    • 需要通過jacococli.jar 來獲取dump
    • java -jar jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco-demo.exec
      • 語句解釋:出自https://testerhome.com/topics/20632
        1. -javaagent
          jdk5之后新增的參數,主要用來在運行jar包的時候,以一種方式介入字節碼加載過程,如有興趣自行百度。注意后面有個冒號:

        2. /home/admin/jacoco/jacocoagent.jar
          需要用來介入class文件加載過程的jar包,想深入了解的,百度“插樁”哈。
          這是一個jar包的絕對路徑。

        3. includes=*
          這個代表了,啟動時需要進行字節碼插樁的包過濾,*代表所有的class文件加載都需要進行插樁。
          假如你們公司內部代碼都有相同的包前綴:com.mycompany
          你可以寫成:

          includes=com.mycompany.*
        4. output=tcpserver
          這個地方不用改動,代表以tcpserver方式啟動應用並進行插樁

        5. port=2014
          這是jacoco開啟的tcpserver的端口,請注意這個端口不能被占用

        6. address=192.168.110.1
          這是對外開發的tcpserver的訪問地址。可以配置127.0.0.1,也可以配置為實際訪問ip
          配置為127.0.0.1的時候,dump數據只能在這台服務器上進行dump,就不能通過遠程方式dump數據。
          配置為實際的ip地址的時候,就可以在任意一台機器上(前提是ip要通,不通都白瞎),通過ant xml或者api方式dump數據。
          舉個栗子:
          我如上配置了192.168.110.1:2014作為jacoco的tcpserver啟動服務,
          那我可以在任意一台機器上進行數據的dump,比如在我本機windows上用api或者xml方式調用dump。
          如果我配置了127.0.0.1:2014作為啟動服務器,那么我只能在這台測試機上進行dump,其他的機器都無法連接到這個tcpserver進行dump。

獲取出來的就是exec的dump文件,那么接下來就要生成報告了

官方又提供了2種方案,其他我

  1. ant轉報告
  2. 開發工具直接展示
  3. jacococli.jar 轉報告

ant本身需要安裝環境,還要定制build.xml,個人比較懶,而且平時使用ant的機會也不多,所以沒用這個方案

開發工具直接看結果可以(idea Analyze->Show Coverage Data->選擇exec文件),但后續不利於做二次開發

jacococli.jar 本身有report方法是專門用來轉報告的  

java -jar jacococli.jar report ./jacoco-demo.exec --classfiles /Users/oukotoshuu/IdeaProjects/demo/target/classes/com  --sourcefiles /Users/oukotoshuu/IdeaProjects/demo/src/main/java --html report --xml report.xml

經個人嘗試:

  --classfiles 必須項,是編譯后target 文件夾下的classes里面的com

Jacoco 包含了多種尺度的覆蓋率計數器,包含指令級(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈復雜度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、類(Classes)。

➢ Instructions:Jacoco 計算的最小單位就是字節碼指令。指令覆蓋率表明了在所有的指令中,

哪些被指令過以及哪些沒有被執行。這項指數完全獨立於源碼格式並且在任何情況下有效,不需要類文件

的調試信息。

➢ Branches:Jacoco 對所有的 if 和 switch 指令計算了分支覆蓋率。這項指標會統計所有的分支數

量,並同時支出哪些分支被執行,哪些分支沒有被執行。這項指標也在任何情況都有效。異常處理不考慮在分支范圍內。

➢ Cyclomatic Complexity:Jacoco 為每個非抽象方法計算圈復雜度,並也會計算每個類,包,組的復雜度。根據 McCabe1996 的定義,圈復雜度可以理解為覆蓋所有的可能情況最少使用的測試用

例數。這項參數也在任何情況下有效。

➢ Lines:該項指數在有調試信息的情況下計算。

➢ Methods:每一個非抽象方法都至少有一條指令。若一個方法至少被執行了一條指令,就認為它被執行過。因為 JaCoco 直接對字節碼進行操作,所以有些方法沒有在源碼顯示(比如某些構造方法和由編

譯器自動生成的方法)也會被計入在內。

➢ Classes:每個類中只要有一個方法被執行,這個類就被認定為被執行。同 5 一樣,有些沒有在源碼聲明的方法被執行,也認定該類被執行。

 

 

 

 

  --sourcefiles 理論可以不傳,不傳的話 只能到文件級的展示,再細 需要具體代碼和行數就需要這個了

 

 

 

        --csv  這個維度只能到代碼文件級 pass

 

 

 

        --xml  這個就比較細致了適合目前的需求

 

 

接下來目標就是再實際過程中實施了,到時候看下坑有多大吧,后面根據這個為基礎搞實時的代碼覆蓋率,長路漫漫 學習不止~

 

參考:

https://www.jianshu.com/p/464a140b2c67 

https://testerhome.com/topics/20632


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM