теста,
вам
прид ется
искать
ответы
на
несколько
вопро сов
од новременно:
• Гд е д олжна располагаться операция?
• Какие вход ные д анные считать корректными?
• Каким д олжен быть корректный результат выполнения операции
при использовании выбранных вход ных д анных?
Если вы начнете с реалистичного теста, вы слишком д олгое время
буд ете вынужд ены д ействовать без обратной связи. Красный – зеленый –
рефакторинг, красный – зеленый – рефакторинг. На
выполнение этого
цикла д олжно уход ить всего несколько минут.
Но как сократить время цикла? Для этого вы можете
во спользоваться тривиальными вход ными и выход ными д анными. Вот
про стой пример: если функция д олжна склад ывать многозначные
вещественные числа с точно стью д о тысячного знака по сле запятой,
вовсе не обязательно начинать ее реализацию с теста, проверяющего
результат сложения таких огромных чисел.
Вполне можно начать с
тривиального теста 3 + 4 = 7. Вот еще од ин пример. В группе
электронных
ново стей,
по священной
экстремальному
программированию, од ин из участников поинтересовался, как написать
программу минимизации количества полигонов (многоугольников),
со ставляющих некоторую поверхно сть. На вход под ается набор
полигонов, комбинация которых пред ставляет
собой некоторый
трехмерный объект. На выход е д олжна получиться комбинация
полигонов, которая описывает точно такой же объект (поверхно сть), но
включает в себя минимальное возможное количество полигонов. «Как я
могу разработать под обную программу, если д ля того, чтобы заставить
тест сработать, я д олжен быть как минимум д октором наук?»
Используя шаблон «Начальный тест» (Starter Test), мы получаем
ответ:
• Вывод д олжен быть точно таким же, как ввод . Некоторые
комбинации полигонов изначально являются минимальными.
• Ввод д олжен быть как можно меньшего размера.
Например,
ед инственный полигон или д аже пустой список полигонов.
Мой начальный тест выгляд ел след ующим образом:
Reducer r = new Reducer(new Polygon());
assertEquals(0, reducer.result(). npoints);
Отлично! Первый тест заработал. Теперь можно перейти к
о стальным тестам в списке…
К начальному тесту след ует применить рассмотренное ранее
правило «Тест од ного шага» (One Step Test): самый первый тест д олжен
научить вас чему-то новому, кроме того, вы
д олжны облад ать
возможно стью д о статочно быстро заставить его работать.
Если вы
реализуете под обный код уже не в первый раз, вы можете выбрать
начальный тест д ля од ной или д аже д вух операций. Вы д олжны быть
уверены, что сможете быстро заставить тест работать. Если вы
приступаете к реализации чего-либо д о статочно сложного и д елаете это
впервые, начните с самого про стого теста, который вы только можете
пред ставить.
Я часто замечаю, что мой начальный тест работает на д о статочно
высоком уровне и скорее напоминает тест всего приложения. Например,
про стой сетевой сервер. Самый первый
тест выгляд ит след ующим
образом:
StartServer
Socket= new Socket
Message = "hello"
Socket.write(message)
AssertEquals(message, socket.read)
Остальные
тесты
пишутся
только
на
стороне
сервера:
«Пред положим, что мы получаем строки напод обие этой…»
Do'stlaringiz bilan baham: