Давайте предположим, что мы разрабатываем класс Stack тест-первый (TDD):Пара вопросов о модульном тестирования
public class Stack<T> {
private T[] elements = new T[16];
private int size = 0;
...
}
Это Stack делает использование внутреннего массива размера 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 с внешним видом, а не о том, как он реализован внутри страны. Я прав?
Мне кажется, что 3-й вариант является лучшим, так как он четко указывает, что он делает (расти в размерах - фактически, удваивает его размер), когда он делает (когда он заполнен) и не связывает меня к какой-либо конкретной реализации (возможно, позже я захочу изменить его на внутренний ArrayList!).
Который приводит меня к моему второй вопрос: Предположим, что я сделал все юнит-тестов для моего класса Stack, который использует внутри массива, и он прекрасно работает как и ожидалось, должны мои тесты остаются нетронутыми, если позже я хочу, чтобы реорганизовать и изменить Array на ArrayList или любую другую структуру данных? Или тесты должны каким-либо образом отражать это? Думаю, нет, но я не уверен.
Кажется, что ваш тест не должен делать предположений о внутренней работе. Если позже вы решили изменить некоторые внутренние детали реализации, вам не нужно будет переписывать все ваши тесты. – Mark