【发布时间】:2010-05-23 21:16:08
【问题描述】:
我正在使用 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);
}
关于它的任何更正/想法?谢谢
【问题讨论】:
-
除了你的具体问题,我想推荐马丁福勒关于重构的书籍和文章,他建议在重构之前实施测试,同样的想法在实施之前有效,例如refactoring.com
-
我一直在阅读他的重构书的部分内容。无论如何你:)
标签: c# java unit-testing tdd