欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解

 更新時(shí)間:2021年03月03日 11:13:50   作者:robothy  
這篇文章主要介紹了使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

Jacoco是Java Code Coverage的縮寫,顧名思義,它是獲取Java代碼執(zhí)行覆蓋率的一個(gè)工具,通常用它來(lái)獲取單元測(cè)試覆蓋率。它通過(guò)分析Java字節(jié)碼來(lái)得到代碼執(zhí)行覆蓋率,因此它還可以分析任何基于JVM的語(yǔ)言(如Croovy、Kotlin)的覆蓋率。本文不討論如何用Jacoco獲取單元測(cè)試的代碼覆蓋率,而是從Jacoco的原理出發(fā),介紹如何通過(guò)Jacoco獲取SIT或者UAT的測(cè)試覆蓋率。更準(zhǔn)確來(lái)講,是獲取一個(gè)應(yīng)用執(zhí)行過(guò)的代碼占總代碼的比率。包括字節(jié)碼指令覆蓋率,分支覆蓋率,圈復(fù)雜度覆蓋率,行覆蓋率,方法覆蓋率和類覆蓋率。

Jacoco原理簡(jiǎn)介

Jacoco通過(guò)修改喂給JVM的字節(jié)碼來(lái)達(dá)到獲取那些代碼執(zhí)行了的目的。修改方式有兩種,一種在線(on-the-fly),是通過(guò)Java agent,在JVM執(zhí)行字節(jié)碼之前動(dòng)態(tài)對(duì)其進(jìn)行修改,這種方式更靈活,也是Jcoco的一大特性。另一種是離線(offline)模式,在Java程序字節(jié)碼文件(.class文件)生成之前進(jìn)行修改,這樣的字節(jié)碼就不純了。一般在無(wú)法使用on-the-fly方式的時(shí)候才使用offline方式。

上面這些概括起來(lái)講,Jacoco最牛X的地方就在于它能夠知道一個(gè)基于JVM的應(yīng)用程序中哪些代碼(指令、分支、行、方法、類)被執(zhí)行了。用它除以總代碼量,就得到了代碼執(zhí)行覆蓋率。

由此,我們可以推斷出Jacoco生成單元測(cè)試覆蓋率報(bào)告的原理:?jiǎn)卧獪y(cè)試代碼會(huì)調(diào)用被測(cè)試代碼,被測(cè)試代碼的字節(jié)碼指令會(huì)被Jacoco截獲,用被截獲的代碼量除以總代碼量,就算出了單元測(cè)試代碼覆蓋率。舉一反三,在SIT或者UT的時(shí)候,也需要執(zhí)行Java應(yīng)用程序中的代碼,因此可以也通過(guò)Jacoco獲取被執(zhí)行過(guò)的代碼,從而計(jì)算出SIT,UT測(cè)試代碼覆蓋率。

使用Jacoco生成代碼執(zhí)行覆蓋率報(bào)告

接下來(lái)通過(guò)一個(gè)實(shí)驗(yàn)介紹如何使用Jacoco獲取一個(gè)Java web應(yīng)用代碼的執(zhí)行率。就拿Tomcat自帶的example應(yīng)用來(lái)做實(shí)驗(yàn),我們?cè)趩?dòng)Tomcat時(shí)帶上Jacoco的Java agent;然后在頁(yè)面上做一些點(diǎn)擊操作,觸發(fā)后臺(tái)Java代碼的執(zhí)行;再抓取包含執(zhí)行情況數(shù)據(jù),放到.exec的二進(jìn)制文件中;最后由這些二進(jìn)制文件生成html格式的報(bào)告,驗(yàn)證被覆蓋的代碼是否和我們點(diǎn)擊的內(nèi)容相關(guān)。

下載Jacoco(https://www.jacoco.org),解壓縮。

下載Tomcat(https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/ 清華mirror),然后解壓縮,進(jìn)入bin目錄,找到catalina.bat文件(Windows)。

修改如下代碼,讓Tomcat在啟動(dòng)時(shí)帶上Javacoco的agent。

set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"

修改為

set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -javaagent:C:\Users\Robot\Application\jacoco-0.8.5\lib\jacocoagent.jar=destfile=jacoco.exec,output=tcpserver"

其中指定了javaagent是C:\Users\Robot\Application\jacoco-0.8.5\lib\jacocoagent.jar,解壓Jacoco可以得到;指定了output是tcpserver,也就是需要通過(guò)訪問(wèn)一個(gè)地址才能獲取到數(shù)據(jù)。默認(rèn)地址是本地IP地址,端口號(hào)是6300。其它參數(shù)說(shuō)明見(jiàn):https://www.jacoco.org/jacoco/trunk/doc/agent.html。

設(shè)置完成之后,雙擊Tomcat bin目錄下的startup.bat,啟動(dòng)Tomcat。控制臺(tái)可以看見(jiàn)javaagent設(shè)置生效。此時(shí)Jacoco就可以動(dòng)態(tài)地?cái)r截喂給JVM的字節(jié)碼,并且監(jiān)聽(tīng)6300端口號(hào)和所以本機(jī)地址,等待獲取代碼執(zhí)行情況數(shù)據(jù)(暫且稱為.exec文件數(shù)據(jù))的請(qǐng)求。

輸入地址http://127.0.0.1:8080/ ,打開(kāi)Tomcat 歡迎頁(yè)面,做一些點(diǎn)擊操作,可以確定它已經(jīng)執(zhí)行了一些字節(jié)碼。

獲取執(zhí)行情況數(shù)據(jù),在jacococli.jar所在目錄(與jacocoagent.jar目錄一致)執(zhí)行命令:

java -jar jacococli.jar dump --port 6300 --destfile data/jacoco-it.exec

Jacoco會(huì)在當(dāng)前目錄下生成data/jacoco-it.exec文件,這個(gè)文件是一個(gè)二進(jìn)制文件,我們無(wú)法直接查看它,需要用它生成html或者其它格式的文件。

執(zhí)行如下命令生成html報(bào)告。--classfiles制定應(yīng)用程序的class文件所在目錄,--html指定html報(bào)告所在目錄。

java -jar jacococli.jar report data/jacoco-it.exec --classfiles C:/Users/Robot/Application/apache-tomcat-9.0.29/webapps/examples/WEB-INF/classes --html html

打開(kāi)html目錄下的index.html文件就可以看到報(bào)告了。

小結(jié)

上面實(shí)驗(yàn)比較簡(jiǎn)單,只為輔助對(duì)Jacoco原理的理解。理解了原理之后,參照官網(wǎng)的手冊(cè)就可以用Jacoco來(lái)做一些實(shí)用的操作,提高Java代碼的質(zhì)量。

以上就是使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解的詳細(xì)內(nèi)容,更多關(guān)于使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java多線程之原子類解析

    Java多線程之原子類解析

    這篇文章主要介紹了Java多線程之原子類解析,Java原子類是一種多線程編程中常用的工具,用于實(shí)現(xiàn)線程安全的操作,它們提供了一種原子性操作的機(jī)制,確保多個(gè)線程同時(shí)訪問(wèn)共享變量時(shí)的數(shù)據(jù)一致性,需要的朋友可以參考下
    2023-10-10
  • idea打開(kāi)和讀取*properties文件亂碼的解決

    idea打開(kāi)和讀取*properties文件亂碼的解決

    本文主要介紹了idea打開(kāi)和讀取*properties文件亂碼的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java中的ReadWriteLock讀寫鎖詳解

    Java中的ReadWriteLock讀寫鎖詳解

    這篇文章主要介紹了Java中的ReadWriteLock讀寫鎖詳解,ReadWriteLock也是一個(gè)接口,提供了readLock和writeLock兩種鎖的操作機(jī)制,一個(gè)資源可以被多個(gè)線程同時(shí)讀,或者被一個(gè)線程寫,但是不能同時(shí)存在讀和寫線程,需要的朋友可以參考下
    2023-12-12
  • 淺談String、StringBuffer和StringBuilder之間的區(qū)別

    淺談String、StringBuffer和StringBuilder之間的區(qū)別

    這篇文章主要介紹了淺談String、StringBuffer和StringBuilder之間的區(qū)別,通過(guò)字面量方式為字符串賦值時(shí),此時(shí)的字符串存儲(chǔ)在方法區(qū)的字符串常量池中,需要的朋友可以參考下
    2023-10-10
  • java 將 list 字符串用逗號(hào)隔開(kāi)拼接字符串的多種方法

    java 將 list 字符串用逗號(hào)隔開(kāi)拼接字符串的多種方法

    這篇文章主要介紹了java 將 list 字符串用逗號(hào)隔開(kāi)拼接字符串,本文給大家分享四種方法,每種方法通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • struts2框架入門

    struts2框架入門

    本文主要介紹了struts2框架的基礎(chǔ)入門知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • springboot內(nèi)置tomcat之NIO處理流程一覽

    springboot內(nèi)置tomcat之NIO處理流程一覽

    這篇文章主要介紹了springboot內(nèi)置tomcat之NIO處理流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 2018年java技術(shù)面試題整理

    2018年java技術(shù)面試題整理

    小編為大家整理了2018年最新的關(guān)于java技術(shù)相關(guān)的面試題,以及給出了最簡(jiǎn)簡(jiǎn)答方式,學(xué)習(xí)下吧。
    2018-02-02
  • 深入學(xué)習(xí)SpringCloud之SpringCloud簡(jiǎn)介

    深入學(xué)習(xí)SpringCloud之SpringCloud簡(jiǎn)介

    Spring Cloud是一個(gè)一站式的開(kāi)發(fā)分布式系統(tǒng)的框架,為開(kāi)發(fā)者提供了一系列的構(gòu)建分布式系統(tǒng)的工具集,本文給大家介紹springcloud的相關(guān)知識(shí),感興趣的朋友跟隨一起看看吧
    2021-04-04
  • java對(duì)象和json的來(lái)回轉(zhuǎn)換知識(shí)點(diǎn)總結(jié)

    java對(duì)象和json的來(lái)回轉(zhuǎn)換知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了一篇關(guān)于java對(duì)象和json的來(lái)回轉(zhuǎn)換知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01

最新評(píng)論