28. Шаблоны зеленой полосы
Когд а у вас есть сломанный тест, вы д олжны заставить его
работать. Если вы рассматриваете красную поло су как со стояние, из
которого след ует выйти как можно быстрее, вы д олжны овлад еть
приемами быстрого получения зеленой поло сы. Используйте след ующие
шаблоны, чтобы заставить ваш тест выполниться (д аже если
полученный в результате этого код не про существует и часа).
Подделка (Fake It)
Если у вас есть тест, завершающийся неуд ачей, какой д олжна быть
самая первая реализация? Сд елайте так, чтобы тестируемый метод
возвращал константу. По сле того как тест начал работать, по степенно
трансформируйте константу в выражение с использованием переменных.
Пример использования этого под ход а прод емонстрирован в ход е
разработки нашей реализации xUnit. Вначале мы использовали строковую
константу:
return «1 run, 0 failed»
Затем эта строка была преобразована в выражение:
return «%d run, 0 failed» % self.runCount
Од нако этим д ело не кончило сь. В конце мы получили выражение:
return «%d run, %d failed» % (self.runCount, self failureCount)
Шаблон «Под д елка» (Fake It) напоминает страховочную веревку,
которая соед иняет вас с верхней точкой маршрута, когд а вы
карабкаетесь по скале. Пока что вы еще не забрались на самый верх (тест
на месте и работает, но тестируемый код некорректен). Од нако в любой
точке маршрута вы д ержитесь за веревку и знаете, что когд а д о стигнете
самого верха, то буд ете в безопасно сти (тест работает в ход е
рефакторинга, а также по сле получения окончательного код а).
Шаблон «Под д елка» (Fake It) многим может показаться совершенно
бесполезным. Зачем писать код , который абсолютно точно прид ется
заменить д ругим? Дело в том, что иметь хоть какой-то работающий код
– это лучше, чем вообще не иметь работающего код а, в о собенно сти
если у вас есть тесты, которые могут д оказать работо спо собно сть код а.
Петер Хансен (Peter Hansen) рассказал мне след ующую историю:
Буквально вчера два новичка в области TDD – мой партнер и я –
решили в точности следовать букве закона. То есть мы написали тест, а
затем написали самый простой, но совершенно бесполезный код, который
обеспечивал срабатывание теста. Пока мы писали этот код, мы
обнаружили, что тест написан неправильно
.
Каким образом под д ельная реализация под сказала им, что
написанный ими тест некорректен? Я понятия не имею, од нако я
счастлив, что они вовремя обнаружили это. Быть может, если они не
во спользовались бы под д ельной реализацией, они пошли бы по
ложному пути. Возможно, исправление связанных с этим ошибок
обошло сь бы им д ороже.
При использовании шаблона «Под д елка» (Fake It) возникает как
минимум д ва положительных эффекта:
Психологический
. Если перед вами зеленая поло са, вы чувствуете
себя совершенно иначе, чем когд а перед вами красная поло са. Когд а
поло са зеленая, вы знаете, на чем стоите. Вы можете смело и уверенно
приступать к рефакторингу.
Контроль над объемом работы
. Программисты привыкли пытаться
пред вид еть появление в буд ущем самых разнообразных проблем. Если
вы начинаете с конкретного примера и затем о существляете обобщение
код а, это помогает вам избавиться от лишних опасений. Вы можете
сконцентрироваться на решении конкретной проблемы и поэтому
выполнить работу лучше. При переход е к след ующему тесту вы опять
же концентрируетесь на нем, так как знаете, что пред ыд ущий тест
гарантированно работает.
Нарушает ли шаблон «Под д елка» (Fake It) правило о том, что не
след ует писать код , который вам не потребуется? Я так не д умаю, вед ь
на этапе рефакторинга вы уд аляете д ублирование д анных межд у тестом
и тестируемым код ом. Допустим, я написал
[17]
:
assertEquals(new
MyDate(«28.2.02»),
new
MyDate(«1.3.02»).
yesterday());
MyDate
public MyDate yesterday() {
return new MyDate("28.2.02");
}
Межд у тестом и код ом существует д ублирование. Попробуем
исправить ситуацию:
MyDate
public MyDate yesterday() {
return new MyDate(new MyDate("1.3.02"). days()-1);
}
Од нако д ублирование по-прежнему присутствует. Чтобы избавиться
от него, заменяем MyDate(«1.3.02») на this (в моем тесте эти значения
равны). Получается:
MyDate
public MyDate yesterday() {
return new MyDate(this.days()-1);
}
Од нако увид еть возможно сть под обных под становок с первого
взгляд а уд ается д алеко не всегд а и д алеко не всем, поэтому д ля пущей
ясно сти вы можете использовать триангуляцию, по крайней мере д о тех
пор, пока вам не над оест. Когд а вам над оест, вы чаще буд ете
пользоваться шаблоном «Под д елка» (Fake It) или «Очевид ная
реализация» (Obvious Implementation).
Do'stlaringiz bilan baham: |