2011-02-24 63 views
7

Cobertura,我無法得到它報告斷言語句的條件路徑被採取。這是一個已知的限制嗎?爲什麼Cobertura無法報告斷言分支路徑被覆蓋?

我有一個JUnit測試,期望和AssertionError被拋出,並且它正確傳遞。問題是Cobertura報告assert分支未被覆蓋。


經過更多的調查後,我看到部分分支覆蓋被檢測到。該生產線是問題是:

assert data != null; 

和的Cobertura報告覆蓋範圍爲:

條件覆蓋率75%(3/4)[各條件50%,100%]。

Cobertura預計會有哪些不同的分支條件?

回答

3

我能夠通過運行JUnit兩次獲得100%的覆蓋率;一次啓用斷言,一次斷言禁用。

+2

你能發佈相關的POM配置(兩次運行JUnit測試)嗎? – 2012-04-16 14:49:11

10

我碰到同樣的問題,所以我花了一些時間來逆向工程,答案是捐給Stack  溢出。

對於每一個Java assert語句來,的Cobertura跟蹤的兩個條件:

  1. 無論給定的斷言語句與斷言檢查啓用或禁用執行。
  2. 謂詞是否實際評估爲true或false。

因此,總共有四個結果是可能的。在一個HTML報告爲給定的行中提供 的信息包括

  • 結果爲條件1(取出的2 0-2可能性,解決與檢查啓用或禁用執行),
  • 和結果條件2(從2中取出0-2個可能性:斷言通過或失敗)。
  • 整體結果(0-4開出4)

典型場景的是:

  • 運行的Cobertura一次,斷言檢查禁用。 您會得到:
    啓用/禁用:50%(禁用); 通過/失敗:0%(未達到);因此整體爲25%。
    的Cobertura將報告爲

    Conditional coverage 25% (1/4) [each condition 50%, 0%]

  • 運行的Cobertura一次,斷言檢查啓用。 通常,您的斷言總是如此,因此您得到:
    啓用/禁用:50%(啓用); 通過/失敗:50%(始終爲真);因此整體:50%。

  • 運行Cobertura兩次,一次斷言檢查 啓用,一次沒有。 假設斷言總是如此,我們得到:
    啓用/禁用:100%(啓用和禁用); 通過/失敗:50%(始終爲真);因此整體75%。

然後,如果我們添加一些測試用例來確保定聲明 失敗至少一次,並通過至少一次,我們得到 所有數字爲100%。

但是請注意,如果你是通過合同, 使用斷言在設計風格,你一般不會甚至能夠讓他們失敗了, 一看便知到另一個堆棧溢出 問題,Cobertura coverage and the assert keyword

最後:雖然這些數字是可以解釋的,但我不確定它們是否非常有用。我的偏好是能夠從總體報告中省略斷言相關的報道。 Clover可以做到這一點,但我不知道這個功能很好的開源覆蓋率分析工具。

+1

哇!也許'javac'黑客用noop代替所有斷言陳述可能有助於修復覆蓋率。請參閱http://scg.unibe.ch/staff/adriankuhn/javacompiler/forceassertions瞭解如何完成此操作。然而,最終Cobertura應該被固定以忽略斷言。補丁,任何人? – akuhn 2011-07-15 09:10:04

+0

諾言拯救覆蓋報告 - 好主意! – avandeursen 2011-07-15 09:20:30

+0

如果你是單元測試你的類,它不應該很難讓斷言失敗。我想這取決於你在什麼級別進行單元測試。另外,我會提醒不要將assert轉換爲no-ops,因爲你可能最終隱藏了assert邏輯中的一個bug。 – cmcginty 2011-07-23 19:44:29

相關問題