2012-05-28 51 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处于哪种状态?看起来你试图一次测试两件事,但是用两种紧密耦合的方法分解一个大的测试方法。这就是为什么测试链接功能没有添加到测试框架。 –

相关问题