2014-07-10 85 views
3

這不僅僅是一個實際案例,在試圖獲得單元測試和集成測試之間的細節差異時,這是一個問題。這是集成測試還是單元測試?

可以說我有一流的總和,它增加了兩個整數:

class Sum{ 
    int x; 
    int y; 
    public int add(){ 
    return x + y; 
    } 
    ...getters and setters... 
} 

而且我還有一個類,負責驗證結果,以確認值的預期。只是爲了舉例來說,假設我們要添加唯一的正數:

class ValidateSum{ 
    Sum sum; 
    public boolean validate(){ 
     if(sum.getX()>=0 and sum.getY()>=0){ 
      return true; 
     } 
     else{ 
      return false; 
     } 
    } 
    ... getters and setters... 
} 

也許它沒有很多的意義有ValidateSum,還是讓我們只是假設它爲例子的緣故。

現在我想爲ValidateSum編寫測試。如果我這樣做:

@Test 
public void testValidateSum(){ 
    ValidateSum vs = new ValidateSum(); 
    Sum sum = new Sum(); 
    vs.setSum(sum); 
    boolean result = vs.validate(); 

    assertTrue(result); 
} 

是單元測試還是集成測試?

我知道單元測試只需要驗證ValidateSum中的功能,並且以測試的方式進行:它只從Sum獲取屬性,而不是它的任何功能。

但是另一方面,即使ValidateSum只調用getter,也可以說您正在從Sum訪問功能。 Sum的getter中的任何更改都會影響ValidateSum的測試,從而打破了單元測試的概念。

但是如果是這種情況,並且確實是一個集成測試,那麼我該如何爲ValudateMethod的validate()寫一個單元測試?

我無法想到的唯一事情就是嘲笑Sum,所以它會返回相同的值。即使Sum的getter中的邏輯發生了變化,ValidateSum的測試也會保持不變。問題在於嘲笑getter的響應可能會增加不必要的複雜性,因爲getter中的邏輯更改的可能性非常低,而我們所做的只是獲得一個屬性。

我希望我的問題有意義,這更多的是理論上的疑問。

編輯

謝謝您的解答。他們有重要的事情要記住。我選爲最佳答案之一,就是因爲它使我這個:

http://www.mockobjects.com/2007/04/test-smell-everything-is-mocked.html

而其真正的:理論上我會嘲笑總和,使其成爲一個純粹的單元測試。但是對於大多數情況,添加複雜性的成本以及花費在模擬屬性getter上的努力並不值得僅僅是爲了獲得「最純粹的」單元測試,實踐中,對於這種情況,Unit和Integration測試之間的差異是主觀的。

+0

這是一個單元測試,但ValidateSum與Sum緊密結合。如果一個變化(如Sum),那麼你也必須改變'ValidateSum'。事實上,'ValidateSum'應該可能是你的jUnit類中的一個函數。 –

回答

5

請勿模擬Sum。吸氣劑和吸入器一般沒有邏輯。嘲笑是去除一個類的邏輯的過程,所以它不會干擾另一個類的測試。嘲笑一個沒有任何邏輯的類,或者一個邏輯與當前測試無關的類是毫無意義的。事實上,「不要模擬價值對象」是一個衆所周知的單元測試原理。

您的測試未使用Sum類的任何邏輯。所以這是一個單元測試。

2

但是,如果是這種情況,它確實是一個集成測試,那麼我怎麼能爲ValudateMethod的validate()寫一個單元測試?

只需通過

(...)嘲諷總和,所以它總是返回相同的值。

積分與單位之間的界線通常很難畫出。但是,讓我們嘗試做到這一點,首先:

集成測試將測試組件多之間的相互作用。

什麼是組件?在大多數情況下 - 商業實體,這是一個具有使您的軟件運行所需的邏輯的類。

Sum類如何適合這裏?它是否包含使您的軟件運行必不可少的業務邏輯?如果是這樣,讓它不被嘲弄會讓你的測試集成一個(如果我們堅持上面的簡單定義)。

但是,Sum類可能也是一個存儲值的類,幾乎沒有業務邏輯 - 如果您願意,可以使用數據結構。商業實體始終對數據結構進行操作:integers,strings,Points,Addresses - 所有數據結構,不需要進行任何集成。

分類取決於您和您分配給班級的責任。與數據結構交互不需要集成。與其他業務實體交互可能。

相關問題