假設我們正在設計一個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