有没有一种方法或方法等的方法装饰或属性的测试方法,可以说,例如:任何方式来构建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处于哪种状态?看起来你试图一次测试两件事,但是用两种紧密耦合的方法分解一个大的测试方法。这就是为什么测试链接功能没有添加到测试框架。 –
这听起来你是明确地试图让你的测试*少*原子,而不是更多。 –