有沒有一種方法或方法等的方法裝飾或屬性的測試方法,可以說,例如:任何方式來構建MsTest何時運行測試方法?
「運行方法C之前運行方法B」
所以基本上你正在創建一個扶養在C和B之間。我知道測試最好是原子性的,應該是,但有時候最好保持測試的小而精確。當它正在查找的項目根本不存在時,它不會運行'RemoveItem'測試方法。
大多數人會事先添加的項目,然後進行測試,看看他們是否可以刪除 - 「都在同一個測試」。我不喜歡這種方法,並希望使我的測試變得更小,更重要,並且儘可能更原子化。
有沒有一種方法或方法等的方法裝飾或屬性的測試方法,可以說,例如:任何方式來構建MsTest何時運行測試方法?
「運行方法C之前運行方法B」
所以基本上你正在創建一個扶養在C和B之間。我知道測試最好是原子性的,應該是,但有時候最好保持測試的小而精確。當它正在查找的項目根本不存在時,它不會運行'RemoveItem'測試方法。
大多數人會事先添加的項目,然後進行測試,看看他們是否可以刪除 - 「都在同一個測試」。我不喜歡這種方法,並希望使我的測試變得更小,更重要,並且儘可能更原子化。
就像你說的,你不想在你的測試之間有相互依賴關係。如果您在刪除測試中的「刪除」之前不熟悉「添加」,因此在錯誤的地方測試了添加方法,那麼我建議使用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();
}
}
TY,是的,我想。我正在使用它們,但我認爲很高興看到是否有這樣的屬性,而不必創建TestInitialise方法。儘管如此,我猜想我確實有我的答案。 – IbrarMumtaz
如果你需要有一些項目測試刪除之前添加,添加項目,然後最好的地方是除去測試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
}
}
嗯...我明白你的意思,但你必須承認,明顯標註依賴於方法的屬性是一個很好的解決方案嗎? – IbrarMumtaz
也許更清晰,但你怎麼知道在哪個狀態下加入測試離開了SUT?一個項目被添加,或兩個?在執行'TearDown'後你的SUT處於哪種狀態?執行'Setup'後,你的SUT處於哪種狀態?看起來你試圖一次測試兩件事,但是用兩種緊密耦合的方法分解一個大的測試方法。這就是爲什麼測試鏈接功能沒有添加到測試框架。 –
這聽起來你是明確地試圖讓你的測試*少*原子,而不是更多。 –