JaCoCo官方教程
標簽: Jacoco
1 概念
1.1 任務 - Mission
JaCoCo應該為基于Java VM的環境中的代碼覆蓋率分析提供標準技術。重點是提供一個輕量級,靈活且文檔齊全的庫,以與各種構建和開發工具集成。
有幾種適用于Java的開源覆蓋技術。在實現Eclipse插件EclEmma時,觀察到它們都不是真正為集成而設計的。它們中的大多數特別適合特定工具(Ant任務,命令行,IDE插件),并且不提供允許在不同上下文中嵌入的文檔化API。 EMMA和Cobertura是最好的和廣泛使用的兩個開源工具。這兩個工具都不再由原始作者積極維護,并且不支持當前的Java版本。由于缺乏回歸測試,因此很難進行維護和添加功能。
因此,我們啟動了JaCoCo項目,以為基于Java VM的環境中的代碼覆蓋率分析提供一種新的標準技術。重點是提供一個輕量級,靈活且文檔齊全的庫,以與各種構建和開發工具集成。提供了Ant任務,Maven插件和EclEmma Eclipse插件作為參考使用方案。同樣,許多其他工具供應商和開源項目也將JaCoCo集成到了他們的工具中。
產品定義
特征
- 指令(C0),分支(C1),行,方法,類型和圈復雜度的覆蓋率分析
- 基于Java字節碼,因此無需源文件也可以工作
- 通過基于 Java-agent 的即時檢測進行簡單集成。其他集成方案(例如自定義類加載器)也可以通過API來實現
- 與框架無關的:與基于Java VM的應用程序(如純Java程序,OSGi框架,Web容器或EJB服務器)平滑集成
- 與所有已發布的Java類文件版本兼容
- 支持不同的JVM語言
- 幾種報告格式(HTML,XML,CSV)
- 遠程協議和JMX控制可在任何時間點從coverage agent請求執行數據dump
- Ant任務,用于收集和管理執行數據并創建結構化的覆蓋率報告
- Maven插件可收集覆蓋率信息并在Maven構建中創建報告
非功能特性
- 簡單的用法以及與現有構建腳本和工具的集成
- 良好的性能和最小的運行時開銷,尤其是對于大型項目
- 輕量級實現,對外部庫和系統資源的依賴性最小
- 全面的文檔
- 完整記錄的API(JavaDoc)以及與其他工具集成的示例
- 基于JUnit測試用例的功能全面的回歸測試
1.2 整合矩陣 - Integration Matrix
目前,JaCoCo已與以下產品和技術集成在一起。
JaCoCo 提供的集成
Technology | Documentation | Remarks |
---|---|---|
Java API | JaCoCo JavaDoc | |
Java Agent | JaCoCo Manual | |
Command Line Tools | JaCoCo Manual | Since version 0.8.0 |
Apache Ant | JaCoCo Manual | |
Apache Maven | JaCoCo Manual | Since version 0.5.3 |
Eclipse | EclEmma Project | Since version 2.0 |
第三方集成
與往常一樣,上面列出的所有商標均為其各自所有者的財產。
1.3 覆蓋率計數器 - Coverage Counters
JaCoCo使用一組不同的計數器來計算覆蓋率指標。所有這些計數器都從Java類文件中包含的信息派生而來,這些信息基本上是Java字節碼指令以及調試信息(可選地嵌入在類文件中)。即使沒有可用的源代碼,這種方法也可以對應用程序進行高效的即時檢測和分析(instrumentation and analysis)。在大多數情況下,可以將收集到的信息映射回源代碼,并可視化到行級粒度。無論如何,這種方法存在局限性。必須使用調試信息編譯類文件,以計算行級覆蓋率并提供源高亮顯示。并非所有Java語言構造都可以直接編譯為相應的字節碼。在這種情況下,Java編譯器會創建所謂的合成代碼,有時會導致意外的代碼覆蓋率結果。
指令 - Instructions(C0覆蓋率)
JaCoCo計數的最小單位是單個Java字節代碼指令。指令覆蓋率提供有關已執行或遺漏(executed or missed)的代碼量的信息。該度量完全獨立于源格式,并且即使在類文件中沒有調試信息的情況下也始終可用。
分支 - Branches(C1覆蓋率)
JaCoCo還為所有if和switch語句計算分支覆蓋率。此度量標準統計方法中此類分支的總數,并確定已執行或遺漏的分支的數量。分支覆蓋始終可用,即使類文件中沒有調試信息也是如此。請注意,在此計數器定義的上下文中,異常處理不視為分支。
如果尚未使用調試信息編譯類文件,則可以將決策點映射到源代碼行并高亮:
- 無覆蓋范圍:該行沒有分支執行(紅色菱形)
- 部分覆蓋:僅執行了該行中的一部分分支(黃色菱形)
- 全面覆蓋:該行中的所有分支均已執行(綠色菱形)
圈復雜度 - Cyclomatic Complexity
JaCoCo 還為每種非抽象方法計算圈復雜度,并匯總了類,包和組的復雜度。根據 McCabe1996 的定義,圈復雜度是可以(線性)組合生成一種方法的所有可能路徑的最小路徑數。因此,復雜度值可以作為完全覆蓋某個軟件的單元測試用例數量的指示。即使類文件中沒有調試信息,也總是可以計算復雜度數字。
圈復雜度v(G)的形式定義基于方法的控制流圖作為有向圖的表示:
v(G)= E- N 2
其中,E是邊數,N是節點數。 JaCoCo根據分支數(B)和決策點數(D)使用以下等效方程式計算方法的圈復雜度:
v(G)= B - D + 1
根據每個分支的覆蓋狀態,JaCoCo還可以計算每種方法的覆蓋和遺漏復雜度。缺少的復雜性再次表明完全覆蓋模塊的測試用例的數量。請注意,由于JaCoCo不考慮異常處理,因為分支try / catch塊也不會增加復雜性。
行
對于已使用調試信息編譯的所有類文件,可以計算各個行的覆蓋率信息。當已執行至少一個分配給該源代碼行的指令時,該源代碼行被視為已執行。
由于單行通常會編譯為多字節代碼指令,因此,源代碼高亮顯示每行包含源代碼的三種不同狀態:
- 無覆蓋:該行中沒有指令被執行(紅色背景)
- 部分覆蓋:僅執行了該行中的一部分指令(黃色背景)
- 全面覆蓋:該行中的所有指令均已執行(綠色背景)
根據源格式,源代碼的一行可能會引用多個方法或多個類。因此,不能簡單地添加方法的行數以獲得包含類的總數。單個源文件中的多個類的行也是如此。 JaCoCo根據覆蓋的實際源代碼行計算類和源文件的代碼行覆蓋率。
方法
每個非抽象方法都包含至少一條指令。當至少一個指令已被執行時,一種方法被視為已執行。由于JaCoCo在字節碼級別上工作,因此構造函數和靜態初始化程序也被視為方法。這些方法中的某些方法在Java源代碼中可能沒有直接的對應關系,例如隱式生成的常量的默認構造函數或初始化器。
類
當至少一個類的方法已執行時,該類被視為已執行。 請注意,JaCoCo將構造函數以及靜態初始化程序視為方法。 由于Java接口類型可能包含靜態初始化器,因此此類接口也被視為可執行類。
智能推薦
[譯] SwiftUI 官方教程 (一)
SwiftUI 簡介 SwiftUI 是一種為任何 Apple 平臺聲明用戶界面的現代化方式。以前所未有的速度,創建漂亮、動態的應用程序。 只需要描述一次的布局 為你的視圖聲明任何狀態的內容和布局,一旦狀態發生改變, SwiftUI 會自動更新視圖的渲染。 構建可復用的組件 將小型、獨立視圖組合到更大,更復雜的界面中。在任何為 Apple 平臺所設計的應用之間,共享您的自定義視圖。 ...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...