2013-03-19 61 views

回答

6

在github上回購了Eclemma的母公司,jacocoopen issue,表明這樣的功能實際上是有點難以包括。

然而,即使沒有Eclemma功能,如果目標只是找出在特定情況下錯過的分支,您可以用儀器來跟蹤您的代碼。最簡單的例子是老式的打印語句:

if (x || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

然後看輸出,看到你竟然打什麼分支(例如java ... | grep "BRANCH:" | sort | uniq)。 (不是非常令人滿意的,我知道。)

13

什麼可以xy是什麼?

  • true || true(不適用的,因爲JVM的優化:如果所述第一條件是true,第二個將不能評價由於短路評價)
  • false || true
  • true || falsetrue
  • false || falsefalse
+1

問題是,我怎麼知道哪些分支沒有被跟蹤?我知道肯定不是假/假的情況,因爲在某些情況下執行「else」情況。 – tor 2013-03-19 08:07:22

+7

它不應該是真正的||沒有涵蓋的真實案例? – Jason 2013-12-30 16:03:24

+0

我只是偶然發現了這個問題 - 不得不回過頭去記住舊的數字邏輯真值表和「不關心」條件。 – 2016-01-07 23:17:44

0

有可能無論是從擴大你的xy謂詞if塊中嵌套的語句或語句隱含的分支。

閱讀本: http://emma.sourceforge.net/faq.html#q.fractional.examples

+0

是的,我想通了。有4種不同的x和y布爾值可能的組合,我猜測他們中只有三種被觀察過。問題是,我怎麼知道哪個案例沒有發生?或者等同地觀察哪些情況? – tor 2013-03-19 08:11:17

+0

「覆蓋4個分支中的1個」表示3個分支未被覆蓋。我認爲它應該是顯而易見的(從覆蓋塊內部突出顯示)哪些代碼路徑未被覆蓋。 – 2013-03-19 17:40:14

+1

對不起,我的錯誤完全了!該消息實際上表示「錯過了4個分支中的1個」。我會立即更新... – tor 2013-03-20 03:30:48

4

答案是true|| true不是蓋的。

這是因爲一旦JVM已經找到的第一個條件爲真,那麼就不會運行第二個條件(它優化),這意味着代碼從不運行的那部分。

正如Maroun說,3超過了4個分支將允許有條件通過。如果您仍然擔心代碼覆蓋率,則可以將條件重構爲&&而不是||

(x || y)(!(!x && !y))相同,這將允許您測試所有條件,因爲現在只有三個分支。

條件的原始形式是經常出現在後衛聲明:

if (obj == null || obj.hasError()) 
{ 
    throw new RuntimeException(); 
} 

這不會讓你檢查,如果objnull並有一個錯誤,因爲它會拋出一個空指針異常。

如果代碼覆蓋率是非常重要的,那麼就使用這種形式:

if (!(obj != null && !obj.hasError())) 
{ 
    throw new RuntimeException(); 
} 
+1

,或者可能會使用''''或'&'急切的操作符,除非您故意短路操作,在這種情況下,您永遠無法獲得完整的分支覆蓋。 – tkokasih 2014-08-15 09:25:16

+0

@BrettPyke'&&'的情況下,如何有三個分支? – ishan3243 2015-02-06 08:41:15

+5

@BrettPyke如果你將(x || y)轉換爲!(!x &&!y),你有與表達式相同的快捷方式問題!(false && false)。 – 2015-12-16 11:54:55

3

有一個很容易woarkaround - 只是把每個謂詞邏輯在單獨一行,像這樣:

if (x 
    || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

現在,當你運行analisys中,標記應直接指向錯過的分支。在你將它覆蓋之後,你可以正確地重新格式化你的代碼。

HTH