2011-11-08 119 views
1

以下代碼是我的方法邏輯。什麼是適合這種方法編寫JunitTestCases的方法

pulic String getData() 
{ 
if (leg.length == 4) 
     return "ATE"; 
    else if (leg.length == 2) { 
     return "FTE"; 
     } 
    if (leg.length == 3) { 
     if (xr1.KotilaType.equals("CST")) { 
     return "HTE"; 
     } 
     return "DTE"; 
    } 
    return "BTE"; 
    } 

按照我的命令,我需要開始爲此方法編寫Junit測試用例。

正如你所看到的,這個方法中只有一個方法和一些條件。

現在我的問題是, 我們是否需要爲每個條件寫一個單獨的Junit TestCase(一個分開的方法)?

或者只寫一個Junit TestCase並覆蓋所有上述條件就足夠了嗎?

我是junit的新手而不是專家,請指導我爲上述方法編寫JunitTestCases的方法是什麼?

回答

2

這是風格的問題。這是兩個備選方案:對於所有在一個方法:

public void testAll() { 
    assertEquals("ATE", getData(leg4)); 
    assertEquals("FTE", getData(leg2)); 
    // etc. 
} 

有了一個測試方法/組合:

public void testLength4() { 
    assertEquals("ATE", getData(leg4)); 
} 

public void testLength2() { 
    assertEquals("FTE", getData(leg2)); 
} 

前者的優點,這是很容易看到所有組合,因爲他們都在一個地方。這是非常有用的,如果有很多組合或組合很複雜。

後者的優點是每個組合都有一個測試,所以很容易定位問題,因爲(理論上)只有一個測試會失敗。缺點:您很快就會用盡測試方法的名稱。 testLength4,testLength2,testLength3WithCST,testLength3WithoutCST。當你有很多組合時(比如像一年中每個月的一次測試),這個缺點就變得特別糟糕。大多數情況下,我使用一種測試方法/測試用例,但是如果組合的數量開始變高,我將只有一種方法。這包含了所有的組合,因爲我喜歡能夠一次看到我所有的組合,看看我是否錯過了。

+1

實際上,我會說單個測試用例是* bad *風格。沒有進攻=)原因是,如果你的第一個斷言失敗,那麼你不知道其他斷言是否會通過或失敗。所以,你可能會看到失敗,去修正一些代碼,重新運行測試,然後找到......測試仍然失敗!只是在不同的斷言。這也使得使用度量標準來決定構建的不穩定性等變得更加困難。基本上,我們獲得的信息使得您可以輕鬆地編寫測試(通常只寫一次,這樣我們就可以花時間做正確的事)從那些測試。 – Kane

+0

@Kane我同意,但如果我有20個左右的組合,並且我正在更改代碼,並且所有組合都在單獨的測試中,那麼如果我已經涵蓋了所有的情況。所以在正常情況下,我有一個測試/案例,但我不介意使用相同方法的多個組合。 –

+0

夠公平的,我可以理解爲什麼會發揮作用。但是如果你擔心你沒有覆蓋所有的情況,你的代碼覆蓋工具不應該告訴你嗎?我會失去我的。 – Kane

0

對於每個可能的返回值,我將開始五個單元測試,將測試對象的狀態(腿長& xr1.KotilaType)設置爲每個測試中的適當值。

然後,我會轉向包含邊界值的測試,例如leg.length == 5,1等

+0

非常感謝Matthew Farwell和Bedwyr Humphreys – Pawan