簡體   English   中英

這三種代碼覆蓋率分析方法有什么區別?

[英]What are the differences between the three methods of code coverage analysis?

該聲納頁面基本上列出了不同代碼覆蓋率分析工具采用的各種方法:

  1. 源代碼檢測 (由Clover使用
  2. 離線字節代碼檢測 (由Cobertura使用
  3. 即時字節代碼檢測 (由Jacoco使用

這三種方法是什么,哪種方法效率最高?為什么?如果效率問題的答案是“它取決於”,那么請解釋原因?

源代碼檢測包括在編譯之前向源代碼添加指令。 這些指令用於跟蹤代碼的哪些部分已被執行。

離線字節碼檢測包括添加相同的指令,但在編譯之后,直接進入字節碼。

即時字節代碼檢測包括在字節代碼中添加相同的指令,但在運行時動態地在JVM加載字節代碼時添加。

此頁面對方法進行了比較。 它可能有偏見,因為它是Clover文檔的一部分。

根據您對“高效”的定義,選擇您最喜歡的那個。 我不認為你會得到巨大的差異。 他們都在做這項工作,無論采用何種方法,大局都是一樣的。

一般來說,對覆蓋范圍的影響是相同的。

源代碼檢測可以提供出色的報告結果 ,因為字節碼檢測無法區分源行中的任何結構,因為代碼塊粒度僅根據源行記錄。

想象一下,我在一行中有兩個嵌套的if語句(或者等價, if(a && b)... * )。 源代碼指示器可以看到這些,並為源行內的if內的多個臂提供覆蓋信息; 它可以根據行和列報告塊。 字節代碼指示器只能看到圍繞條件的一條線。 如果條件a執行,它是否將該行報告為“已覆蓋”,但是否為假?

你可能會認為這是一種罕見的情況(可能是這樣),因此不是很有用。 當你得到虛假的報道然后是現場失敗時,你可能會改變你對實用性的看法。

有一個很好的例子和解釋,字節碼覆蓋如何使得切換語句的覆蓋正確 ,非常困難。

源代碼指導程序也可以實現更快的測試執行,因為它有編譯器幫助優化已檢測的代碼。 特別是,由二進制指令器插入循環內的探測器可能會被JIT編譯器編譯到循環內部。 一個好的Java編譯器會看到檢測產生一個循環不變的結果,並將檢測提升出循環。 (JIT編譯器也可以說是這樣做的;問題是他們是否真的這樣做了)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM