2011-10-13 116 views
1

我應該爲所有嵌套方法編寫單元測試,還是爲調用者編寫一個測試就足夠了?TDD函數測試

例如:

void Main() 
{ 
    var x = new A().AFoo(); 
} 

public class A 
{ 
    public int AFoo() 
    {   
     // some logic 
     var x = new B().BFoo(); 

     // might have some logic 

     return x; 
    } 
} 

public class B 
{ 
    public int BFoo() 
    { 
     // some logic 
     return ???; 
    } 
} 

應足以寫Main()方法的單元測試或者我需要寫爲主體,A.AFoo(),B.BFoo()方法的測試?我應該去多深?

在此先感謝。

回答

2

單元測試應該在單元上工作,在OOP的情況下單元是類和類的方法。這意味着您應該爲每個考試類別編寫一個單獨的測試類別,並且爲該類別中提供的每種方法提供至少一個測試方法。更重要的是,儘可能地隔離類是很重要的,這樣B類中的錯誤不會導致類A失敗。這就是爲什麼控制反轉(依賴注入)非常有用,因爲如果你可以注入將類B的實例放入類A的實例中,可以將B更改爲僅爲Mock對象。

我們編寫單元測試的原因之一是在代碼中準確地解釋每個類的方法在所有條件下的行爲,包括特別是邊緣情況。通過在主要方法上編寫測試,很難詳細說明B類的預期行爲。

我會推薦閱讀一些在線的解釋測試驅動開發的材料,以及如何模擬對象,或許可以使用一些優秀的嘲諷庫,如JMock。有關更多鏈接,請參見question

5

測試純粹主義者會說您需要爲類AB創建單元測試。

每個類都應該有所有測試方法。如果一個方法可以做多件事情(例如,如果你有一個if語句),那麼你應該對每個路徑進行測試。如果測試過於複雜,重構代碼以使測試變得更簡單可能是一個好主意。

現在請注意,由於它取決於B,因此難以單獨測試A。如果B很簡單,就像現在一樣,它可能沒問題。您可能想要將您的測試命名爲A集成測試,因爲從技術上講,它們將AB一起測試。另一個選擇是使方法AFoo作爲參數接受它在其上運行的B的實例。這樣你就可以嘲笑一個B的實例並且有一個真正的單元測試。

+0

感謝您的回覆。我同意所有如果需要測試並且所有方法都需要測試,但是我發現了一些方法(Main)調用另一個方法並且測試了Main與所有場景的情況,然後我重複了A.AFoo中的所有場景以及那麼類B.BFoo中的場景也是相同的。 –

+1

@vlad,每個班級都應該有自己的考試。 – hvgotcodes

+1

@hvgotcodes - 我會糾正一下。每個'''公共'''類型都應該有自己的測試。 – Gishu

1

單元測試應該可以幫助您減少調試工作量。所以,當你只爲AFoo編寫單元測試,而沒有編寫BFoo的單元測試,並且你的一個測試失敗時,你可能不會知道這個問題是否屬於A類或B類的一部分。編寫BFoo的測試也會幫助你隔離錯誤時間較短。