有沒有一種簡單的方法來判斷我錯過了哪個分支?即我有一些像這樣的代碼:Eclemma說4分支中沒有1分支,但是哪個分支?
if (x || y) {
// do stuff
}
在覆蓋突出有Eclipse的一個黃點,說:
1 4分支錯過
,但我想知道哪個分支丟失。
有沒有一種簡單的方法來判斷我錯過了哪個分支?即我有一些像這樣的代碼:Eclemma說4分支中沒有1分支,但是哪個分支?
if (x || y) {
// do stuff
}
在覆蓋突出有Eclipse的一個黃點,說:
1 4分支錯過
,但我想知道哪個分支丟失。
在github上回購了Eclemma的母公司,jacoco的open issue,表明這樣的功能實際上是有點難以包括。
然而,即使沒有Eclemma功能,如果目標只是找出在特定情況下錯過的分支,您可以用儀器來跟蹤您的代碼。最簡單的例子是老式的打印語句:
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
然後看輸出,看到你竟然打什麼分支(例如java ... | grep "BRANCH:" | sort | uniq
)。 (不是非常令人滿意的,我知道。)
什麼可以x
和y
是什麼?
true || true
是真(不適用的,因爲JVM的優化:如果所述第一條件是true
,第二個將不能評價由於短路評價)false || true
是真true || false
是truefalse || false
是false有可能無論是從擴大你的x
或y
謂詞if
塊中嵌套的語句或語句隱含的分支。
閱讀本: http://emma.sourceforge.net/faq.html#q.fractional.examples
答案是true|| true
不是蓋的。
這是因爲一旦JVM已經找到的第一個條件爲真,那麼就不會運行第二個條件(它優化),這意味着代碼從不運行的那部分。
正如Maroun說,3超過了4個分支將允許有條件通過。如果您仍然擔心代碼覆蓋率,則可以將條件重構爲&&
而不是||
。
(x || y)
與(!(!x && !y))
相同,這將允許您測試所有條件,因爲現在只有三個分支。
條件的原始形式是經常出現在後衛聲明:
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
這不會讓你檢查,如果obj
是null
並有一個錯誤,因爲它會拋出一個空指針異常。
如果代碼覆蓋率是非常重要的,那麼就使用這種形式:
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
有一個很容易woarkaround - 只是把每個謂詞邏輯在單獨一行,像這樣:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
現在,當你運行analisys中,標記應直接指向錯過的分支。在你將它覆蓋之後,你可以正確地重新格式化你的代碼。
HTH
問題是,我怎麼知道哪些分支沒有被跟蹤?我知道肯定不是假/假的情況,因爲在某些情況下執行「else」情況。 – tor 2013-03-19 08:07:22
它不應該是真正的||沒有涵蓋的真實案例? – Jason 2013-12-30 16:03:24
我只是偶然發現了這個問題 - 不得不回過頭去記住舊的數字邏輯真值表和「不關心」條件。 – 2016-01-07 23:17:44