使用测试驱动开发实现堆栈
我正在完成TDD的第一步。问题是(可能每个人都从TDD开始),当我开始在我的项目中工作时,我永远不知道该做什么样的单元测试。
让我们假设我想使用以下方法编写一个Stack类(我选择它,因为它是一个简单的例子):
Stack<T>
- Push(element : T)
- Pop() : T
- Peek() : T
- Count : int
- IsEmpty : boolean
你会如何理解这一点?我一直不明白这个想法是要为Stack类的每个方法测试一些角落案例,还是从对类做一些“用例”开始,比如添加10个元素并删除它们。这是什么概念?要使使用堆栈的代码尽可能接近我将在实际代码中使用的代码?或者只是进行简单的“添加一个元素”单元测试,其中我测试是否通过添加该元素来更改IsEmpty和Count?
我应该如何开始呢?
编辑
这是我的粗略测试的实现:
[TestMethod]
public void PushTests() {
StackZ<string> stackz = new StackZ<string>();
for (int i = 0; i < 5; ++i) {
int oldSize = stackz.Size;
stackz.Push(i.ToString());
int newSize = stackz.Size;
Assert.AreEqual(oldSize + 1, newSize);
Assert.IsFalse(stackz.IsEmpty);
}
}
[TestMethod, ExpectedException(typeof(InvalidOperationException))]
public void PeekTestsWhenEmpty() {
StackZ<double> stackz = new StackZ<double>();
stackz.Peek();
}
[TestMethod]
public void PeekTestsWhenNotEmpty() {
StackZ<int> stackz = new StackZ<int>();
stackz.Push(5);
int firstPeekValue = stackz.Peek();
for (int i = 0; i < 5; ++i) {
Assert.AreEqual(stackz.Peek(), firstPeekValue);
}
}
[TestMethod, ExpectedException(typeof(InvalidOperationException))]
public void PopTestsWhenEmpty() {
StackZ<float> stackz = new StackZ<float>();
stackz.Pop();
}
[TestMethod]
public void PopTestsWhenNotEmpty() {
StackZ<int> stackz = new StackZ<int>();
for (int i = 0; i < 5; ++i) {
stackz.Push(i);
}
for (int i = 4; i >= 0; ++i) {
int oldSize = stackz.Size;
int popValue = stackz.Pop();
Assert.AreEqual(popValue, i);
int newSize = stackz.Size;
Assert.AreEqual(oldSize, newSize + 1);
}
Assert.IsTrue(stackz.IsEmpty);
}
对此有任何更正/想法吗?谢谢