假设我们正在设计一个Stack类测试第一(TDD):关于几个问题的单元测试
public class Stack<T> {
private T[] elements = new T[16];
private int size = 0;
...
}
这个堆栈利用了大小16个内部数组来存储它的元素。它会正常工作,直到你需要添加第17个元素。因为我可能需要第17个元素,所以我决定将该功能添加到我的堆栈中,所以我开始考虑可以给测试添加哪些名称,以便添加该功能。这将是我的第一个问题的主题。
我首先选择的形式的东西:
Should_Be_Able_To_Correctly_Increase_Its_Inner_Array_Size()
然后
Should_Handle_More_Items_Than_The_Default_Internal_Array_Size()
但想了一会儿后,我得出的结论,也许像下面这样会比较apropriate :
Should_Double_Its_Size_Every_Time_Its_Full()
我的推理必须在第一种情况下这样做,我说只有它做什么,但不是什么时候。 第二,我说什么时候添加更多的项目,但我也说明我是如何在内部实现它的,这可能是不正确的。在我看来(我不确定我是否正确),我的测试应该是我的SUT与外部可能的相互作用,而不是内部如何实现。我对吗?
它在我看来,第三个选项是最好的,因为它清楚地说明了它的作用(增长的规模 - 事实上,它的大小的两倍),当它(当它已满),并没有联系我到任何特定的实现(我可能以后可能想要将其更改为内部ArrayList!)。
这使我对我的第二个问题:假设我做了所有的单元测试我的Stack类在内部使用数组和它工作正常,符合预期,应我的测试中保持不变,如果我以后要重构并将数组更改为ArrayList或任何其他类型的数据结构?还是应该以任何方式反映这些测试?我猜不,但我不确定。
对我来说似乎你的测试不应该对内部工作做出假设。如果稍后您选择更改某些内部实现细节,则不需要重写所有测试。 – Mark 2010-08-30 19:12:01