во спроизвод ила их, имитируя работу пользователя с программой). Для
выполнения всей серии тестов требовало сь д лительное время,
поэтому
обычно тесты запускались вечером, перед уход ом с работы, и
выполнялись в течение почти всей ночи. Кажд ое утро, когд а я приход ил
на работу, я вид ел на своем стуле аккуратно сложенную пачку листов, на
которых были распечатаны результаты ночного тестирования. (Привет,
Эл!) В уд ачные д ни это мог быть всего од ин лист, на котором было
написано, что ничего не поломало сь. В плохие д ни на стуле могла
лежать огромная кипа бумаги – по од ному листу на кажд ый
«сломанный» тест. По степенно я стал пугаться
вид а листов бумаги на
моем стуле, – если я приход ил на работу и вид ел на своем стуле кипу
бумажных листов, меня немед ленно бро сало в д рожь.
Работая в таком стиле, я пришел к д вум важным вывод ам. Во-
первых, тесты д олжны выполняться д о статочно быстро, чтобы я мог
запускать их само стоятельно и д елать это д о статочно часто. В этом
случае я мог бы обнаруживать ошибки раньше, чем кто-либо д ругой.
Во-вторых, спустя некоторое время я заметил, что огромная кипа бумаги
д алеко не всегд а означает огромную кучу проблем.
Чаще оказывало сь,
что в самом начале выполнения тестов од ин из них завершался неуд ачей,
о ставляя систему в непред сказуемом со стоянии, из-за чего след ующий
тест тоже завершался неуд ачей, а за ним и многие д ругие – по цепочке.
В то время мы пытались решить эту проблему, автоматически
перезапуская систему перед выполнением кажд ого теста, од нако д ля
этого требовало сь слишком большое время.
Именно тогд а у меня
возникла еще од на хорошая мысль: тестирование можно выполнять на
более низком уровне: вовсе не обязательно, чтобы кажд ый из тестов
выполнялся в отношении всего приложения в целом. Чтобы убед иться в
работо спо собно сти всего приложения, д о статочно протестировать
кажд ую из его со ставных частей. Тестирование части приложения
можно выполнить быстрее, чем тестирование всего приложения. Од нако
самый
важный вывод со стоял в том, что выполнение од ного теста
никоим образом не д олжно влиять на выполнение д ругого теста. Тесты
д олжны полно стью игнорировать д руг д руга. Если од ин из тестов не
срабатывает, это значит, что в программе присутствует од на проблема.
Если не срабатывают д ва теста, значит, в программе присутствуют д ве
проблемы.
Если тесты изолированы д руг от д руга, значит, поряд ок их
выполнения не имеет значения.
Если я хочу выполнить не все, а
некоторое под множество тестов, я не д олжен беспокоиться о том, что
некоторый тест не сработает только потому, что некоторый д ругой тест
не был пред варительно запущен.
Производ ительно сть является о сновной причиной, по которой
пред лагается д елать д анные общими д ля нескольких тестов. Требование
изоляции тестов принужд ает вас разд елить проблему на несколько
ортогональных измерений, благод аря чему
формирование сред ы д ля
кажд ого из тестов выполняется д о статочно про сто и быстро. Иногд а,
чтобы выполнить под обное разд еление, приход ится приклад ывать
значительные усилия. Если вы хотите, чтобы разрабатываемое вами
приложение можно было протестировать при помощи набора
изолированных д руг от д руга тестов, вы д олжны «собрать» это
приложение
из
множества
отно сительно
небольших
взаимод ействующих межд у собой объектов. Я
всегд а знал, что это
неплохая ид ея, и всегд а рад овался, когд а мне уд авало сь реализовать ее
на д еле, од нако я не был знаком ни с од ной метод икой, которая
позволяла бы мне регулярно воплощать эту ид ею в жизнь. Ситуация
изменилась в
лучшую сторону по сле того, как я стал писать
изолированные тесты.
Do'stlaringiz bilan baham: