2008-10-13 60 views
2

我使用的Maven(2)的Cobertura插件來創建代碼覆蓋率報告,我有以下存根我使用的方法:的Cobertura拒絕承認代碼覆蓋

try { 
    System.exit(0); 
} catch (final SecurityException exception) { 
    exception.printStackTrace(); 
} 
System.err.println("The program never exited!"); 

我知道我需要記錄異常等,但這不是現在的重點...... Cobertura拒絕承認堆棧跟蹤打印後的行被覆蓋。也就是說,在System.err.println聲明之前帶有'}'的行沒有被顯示爲被覆蓋。之前,該方法的結束大括號未被顯示爲涵蓋,因此System.err聲明。任何想法我怎麼能說服cobertura的maven插件,因爲System.err.println陳述被覆蓋,那末端大括號必須被覆蓋?

哦,是的,我使用模擬安全管理器來拋出安全異常,因爲這是我發現在System.exit調用後繼續執行測試的最簡單方式。

回答

1

我有一段時間沒有使用Cobertura(2005?),並且當時看到了這種行爲。 NCover for C#和花括號在catch/finally塊之後存在類似的問題。我的建議是增加到this Cobertura bug report detailing a similar issue。此外,請遵循@ tvanfosson的建議,並意識到沒有在JVM上實際上變成任何東西的大括號的覆蓋,這是您可以忽略的'噪聲'。

8

我會看看覆蓋率報告。仔細檢查我的測試。請注意,代碼真的被覆蓋了,而不用擔心會達到100%。代碼覆蓋範圍最適合用於查找可能忽略與測試打交道的領域,但只關注獲得100%覆蓋範圍的目標是一種不良習慣,可能會導致您跳過僅由於工具顯示而需要編寫測試的不良習慣100%。使用該工具來完成它的功能,但不要陷入讓工具定義你所做的工作的陷阱。

+0

我同意你的說法,但是當代碼大括號和大括號下的代碼被覆蓋時,它是非常令人討厭的,無法達到「完美」的代碼覆蓋率。當代碼是新鮮的時候,這些是我正在做的測試,所以沒有太多的功能。 – MetroidFan2002 2008-10-13 01:54:53

+2

完美的報道是一個謬誤。你需要花時間來覆蓋複雜的代碼,而不是獲取者和設置者。只有在它能幫助你實現你付出的目標 - 提供產品而不是報告的範圍內,保險範圍纔是有價值的。 – ddimitrov 2008-10-13 02:04:32

+0

當然,完美的覆蓋率並不是所有指標的最終結果,但我不同意你測試getter和setter的感受。很多時候,吸氣劑或二道過濾器已被修改成具有無證的副作用,並且很難追查。殺死一個測試解決了這個問題 – MetroidFan2002 2008-10-13 02:07:15

4

在Java類文件格式中,每個方法都用表格映射代碼偏移到行號進行註釋。在這種情況下,右大括號不會產生任何字節碼,因此不會被覆蓋。這是源和字節碼之間的不完美對應的問題。應該由覆蓋工具處理,將此行識別爲非代碼。

我知道Emma有類似的問題。 Clover票價好得多,但是是商業的(不知道它是否也會處理這種情況)。如果你使用IDEA,你應該嘗試他們的new coverage implementation - 這是相當不錯的,積極的發展。

0

我知道這是一個古老的問題,並且Cobertura已經解決了這個問題,但爲了完整性,「}」缺失的覆蓋率是由內部自動「finally」塊引起的。

見你的代碼,因爲這:

try { 
    System.exit(0); 
} catch (final SecurityException exception) { 
    exception.printStackTrace(); 
} finally { 
    // noop 
} 

好在這裏不再發生一些版本。

相關問題