2017-03-07 117 views
0

我已經在我的JUnit測試用例上運行了EclEmma,並且在某些情況下達到了100%。但是,在覆蓋率爲82%或95%的代碼中,我的代碼旁邊有一條消息,指出「2個分支中的1個錯過了」,我似乎無法解決此問題。JUnit測試:如何測試語句不丟失分支?

找過我的課之後,我注意到,此消息只是我旁邊的if語句出現,這是什麼讓我的測試中被100%覆蓋。

我猜我問,如果有人知道如何在JUnit測試if語句,這樣既沒有分支被遺漏。

這是我想測試代碼:

private double height; 
    public void setHeight(double height){ 
     if(height <=0){ 
      this.height = 0; 
     } 
     else{ 
      this.height = height; 
     } 
    }//method close 

(我使用JUnit 4)

+3

調用'setHeight'了負數,正數,並可能與0真的參數,究竟你問? – Seelenvirtuose

+0

因此,使用<= 0的高度進行測試,並使用高度> 0進行測試。這將覆蓋兩個分支。 –

+0

btw:在Java(和其他語言)中比較double和==是不安全的。 http://stackoverflow.com/questions/25160375/comparing-double-values-for-equality-in-java – Rainer

回答

3

簡單:

有一個不同的測試案例通過路徑在您的被測方法內;像:

  • testSetHeightWithNegativeValue()
  • testSetHeightWithZeroValue()
  • testSetHeightWithPositiveValue

它們中的每給出被測並檢查期望輸出特定輸入到你的方法。

凡真正帶走這裏是:考慮思考你的代碼。你不應該需要一個覆蓋工具來確定你的方法需要更多的測試。相反:你看你的方法,認爲它在做什麼;然後你寫測試用例。

覆蓋面精告訴你,你做了正確的事情;但「做正確的事情」是你應該努力去做的事情;而不是滿足一些數字。

而且,正如評論指出:考慮使用TDD方法:當你寫你的測試之前創建的「匹配」一片的生產代碼,那麼你作出這樣的「思想」部分的一個基本要素的工作程序。

+0

那麼,考慮到TDD,你甚至應該在編寫你的方法之前編寫測試用例(http://stackoverflow.com/questions/804569 /爲什麼我應該使用測試驅動開發) – Rainer

+0

再次測試並獲得100%的覆蓋率。謝謝你的幫助! – user1975

+0

@Rainer我想到了TDD,但忘了提及它;只是更新了我的答案。 – GhostCat

1

您的代碼

public void setHeight(double height){ 
    if(height <=0){ 
     this.height = 0; 
    } 
    else{ 
     this.height = height; 
    } 
} 

有兩個可能的分支:

height <= 0

public void setHeight(double height){ 
    this.height = 0; 
} 

height > 0

public void setHeight(double height){ 
    this.height = height; 
} 

所以if語句,你可以請參閱else中的一條或另一條語句。你必須創建兩個單元測試,以覆蓋所有可能的方式 - 一個用於傳遞height > 0和第二的height <= 0