2011-07-15 146 views
1

編寫單元測試時,我得到了一個非常有趣的問題。單元測試函數

我可以在測試代碼中使用函數時測試函數嗎?

例如,

如果我有一個List<int>類有一個名爲Add()功能。

我想測試一個目標列表對象有兩個int已經在裏面:1和2. 現在我添加第三個數字:3,並且想要斷言該數字已成功添加。所以我寫了:

public void TestMethod() 
{ 
    //initialize 
    List<int> list = new List<int>(); 
    list.Add(1); 
    list.Add(2); 

    //do operation 
    list.Add(3); 
    Assert.IsTrue(list.Contains(3)); 
} 

然而,上面的測試情況下,試圖測試目標函數:Add()方法,已經使用Add()方法來初始化。我認爲這種關係可能會導致一些問題,在一些情況下,一般來說...

有沒有任何測試thoery說,我們不能做到這一點?

謝謝!

回答

4

函數可能需要多個測試。在這種情況下,你只需要測試一個Add()的函數,然後是上面的那個函數。只要兩者都通過,你就可以(合理地)相信你的結果是可靠的。如果第一次測試失敗,那麼第二次測試的結果應該可以忽略。

儘管如此,理想情況下,您可以訪問正在測試的內部狀態,因此可以提供一種不涉及調用被測函數的初始條件的不同方式。

0

沒有什麼能阻止你這樣做,但在這個特定的例子中,我沒有看到這樣做的價值。

還有其他情況下,它可能是有效的,例如,您想要測試特定行爲的地方:

1)根據傳遞參數的值,您的第三個調用將影響對象位的狀態與先前的不同。

2)第三次使用相同的方法時,您期待着某些特殊行爲,例如3次無效的登錄嘗試。

2

在這種情況下,最好讓測試更全面。我可能會這樣做:

public void TestMethod() 
{ 
    //initialize 
    List<int> list = new List<int>(); 
    list.Add(1); 
    list.Add(2); 

    // Test setup 
    Assert.IsTrue(List.Count == 2); 
    Assert.IsTrue(List[0] == 1); 
    Assert.IsTrue(List[1] == 2); 

    //do operation 
    list.Add(3); 
    Assert.IsTrue(List.Count == 3); 
    Assert.IsTrue(List[0] == 1); 
    Assert.IsTrue(List[1] == 2); 
    Assert.IsTrue(List[2] == 3); 
} 
0

我認爲在您的示例中編寫測試方法並不少見。重要的是我們看待它的方式。

如果我們打算使用TestMethod()來測試Add(),我們不應該使用Add()在測試中建立前提條件

如果我們對TestMethod()的意圖是測試Add()和Contain()的交互/順序,那應該沒問題。