2012-12-23 42 views
6

目前,我在閱讀「JUnit in action」一書。在本書中,我找到如下文字:JUnit:調用每個@Test方法之前的新實例。有什麼好處?

JUnit在調用每個 @Test方法之前創建一個新的測試類實例。這有助於提供測試方法之間的獨立性,並避免測試代碼中的無意的副作用。因爲每個測試 方法都在新的測試類實例上運行,所以我們不能在測試方法中重複使用實例 變量值。

現在,我看不出有一點這樣的做法:

例如:

public class CalculatorTest { 
@Test 
public void testAdd_1() { 
Calculator calculator = new Calculator(); 
double result = calculator.add(1, 1); 
assertEquals(2, result, 0); 
} 
@Test 
public void testAdd_2() { 
Calculator calculator = new Calculator(); 
double result = calculator.add(2, 2); 
assertEquals(4, result, 0); 
} 

} 

對於測試類CalculatorTest沒有任何好處。

好吧,讓我們去另一個例子注意:

public class OneTest { 

    static byte count; 

    public OneTest() { 
     count++; 
    } 

    @Test 
    public void test1() { 
     System.out.println(count); 
    } 

    @Test 
    public void test2() { 
     System.out.println(count); 
    } 
} 

對於測試類OneTest我找到了一種方法來使用的許多測試方法相同的變量個性化......

那麼,如何看看書中描述的方法的真正好處?

+1

如果你正在談論'數'字段,那麼它是一個靜態字段。它是該類的一個屬性,而不是一個特定的實例。這就是爲什麼你看到它的價值的變化。 –

+0

@babasmith:你應該取消刪除你的答案(也許通過顯示一個非靜態字段的例子來闡述更多)。 –

+0

第一個例子:我們在測試方法之間沒有任何聯繫。 在這種情況下,爲執行每個測試方法創建新的測試類實例 - 沒有任何意義。 第二個例子: 我們可以通過靜態變量得到「無意的副作用」。 :)) 好處在哪裏? – user471011

回答

14

如何看本書中描述的方法的真正好處?

單獨實例的目的不是爲了任何好處,而是爲了維護合同,即每個測試應獨立執行而不會影響先前測試的執行。除了爲每個測試使用不同的實例外,沒有其他方法可以確保此合同。

例如,Spring事務管理確保回滾測試對數據庫所做的所有更改(默認情況下)以維護同一合同。

因此,在測試中使用靜態變量通常是不鼓勵的,因爲它會挫敗每個測試一個實例的全部目的,以便爲每個測試設置一個乾淨的平臺。

2

如果您正在測試可變類,那麼在每個測試方法開始時將測試對象置於已知狀態是很有價值的,因此測試執行的順序並不重要。最簡單的方法是爲每個測試創建該類的新實例,並避免靜態字段。

在您的計算器示例中,看起來您的Calculator類是不可變的,方法調用的結果僅取決於參數。所以一個測試影響另一個測試的風險就不存在了。

我不太明白你的第二個例子。你已經編寫了使用共享靜態字段的註釋爲@Test的方法,但是你的方法沒有斷言,並且沒有真正測試任何東西。

如果你想使用靜態字段,或者確實要堅持並重用被測試類的單個實例,那麼肯定可以這樣做,但爲了使測試正常工作並保持彼此獨立,將傾向於需要更多的照顧。

13

保持測試方法之間的狀態清潔對於單元測試非常有用,但是對功能測試來說很困難,因爲通常需要測試之間的依賴關係(例如,當您使用Selenium測試網頁時,如果登錄頁面的測試失敗,則麻煩運行某個頁面的測試)。

這是主要的原因之一,爲什麼我創建TestNG,它不會實例每個方法之間的一類新的,所以給你的選擇,而不是你強加這個決定。 TestNG還支持測試,多線程測試的依賴關係,具有組的概念(「僅運行servlet測試」)以及更多功能。

相關問題