2012-05-28 85 views
0

有沒有一種方法或方法等的方法裝飾或屬性的測試方法,可以說,例如:任何方式來構建MsTest何時運行測試方法?

「運行方法C之前運行方法B」

所以基本上你正在創建一個扶養在C和B之間。我知道測試最好是原子性的,應該是,但有時候最好保持測試的小而精確。當它正在查找的項目根本不存在時,它不會運行'RemoveItem'測試方法。

大多數人會事先添加的項目,然後進行測試,看看他們是否可以刪除 - 「都在同一個測試」。我不喜歡這種方法,並希望使我的測試變得更小,更重要,並且儘可能更原子化。

+0

這聽起來你是明確地試圖讓你的測試*少*原子,而不是更多。 –

回答

1

就像你說的,你不想在你的測試之間有相互依賴關係。如果您在刪除測試中的「刪除」之前不熟悉「添加」,因此在錯誤的地方測試了添加方法,那麼我建議使用testInitialize來設置測試可以執行的某些對象。我然而,建議在運行Remove之前實際運行Add的做法,在Remove的測試中。

[Testclass] 
public class TestStacks 
{ 
    private Stack<string> emptyStack; 
    private Stack<string> singleItemStack; 

    [TestInitialize] 
    public void Setup() 
    { 
    singleItemStack = new Stack<string>(); 
    singleItemStack.Push("Item"); 
    emptyStack = new Stack<string>(); 
    } 

    [TestMethod] 
    public void TestPush() 
    {  
    emptyStack.Push("Added"); 
    Assert.AreEqual(1, emptyStack.Count); 
    } 

    [TestMethod] 
    public void TestRemove() 
    {  
    singleItemStack.Pop(); 
    Assert.AreEqual(0, singleItemStack.Count); 
    } 

    [TestMethod] 
    [ExpectedException(typeof(InvalidOperationException))] 
    public void TestPopFromEmpty() 
    {  
    emptyStack.Pop(); 
    } 

} 
+0

TY,是的,我想。我正在使用它們,但我認爲很高興看到是否有這樣的屬性,而不必創建TestInitialise方法。儘管如此,我猜想我確實有我的答案。 – IbrarMumtaz

1

如果你需要有一些項目測試刪除之前添加,添加項目,然後最好的地方是除去測試arrange一部分。這將清除清除測試的上下文。

但DRY原理也適用於這裏 - 您可以將添加邏輯移動到單獨的幫助程序方法。然後調用它兩次 - 當測試添加,以及當安排上下文刪除:

[Testclass] 
public class Tests 
{   
    [TestMethod] 
    public void TestAddition() 
    { 
     AddItem(); 
     // Assert addition   
    } 

    [TestMethod] 
    public void TestRemoval() 
    { 
     AddItem(); 
     // Remove item 
     // Assert removal 
    } 

    private void AddItem() 
    { 
     // Add item   
    } 
} 
+0

嗯...我明白你的意思,但你必須承認,明顯標註依賴於方法的屬性是一個很好的解決方案嗎? – IbrarMumtaz

+2

也許更清晰,但你怎麼知道在哪個狀態下加入測試離開了SUT?一個項目被添加,或兩個?在執行'TearDown'後你的SUT處於哪種狀態?執行'Setup'後,你的SUT處於哪種狀態?看起來你試圖一次測試兩件事,但是用兩種緊密耦合的方法分解一個大的測試方法。這就是爲什麼測試鏈接功能沒有添加到測試框架。 –

相關問題