Услуги Сертификаты Новости Статьи База знаний Алгоритмы Портфолио Скачать Ссылки Поиск
Услуги arrow Статьи arrow Test driven development: разработка через тестирование
Test driven development: разработка через тестирование Версия для печати Отправить на e-mail
23.03.2010

Извечный вопрос - писать тесты или нет, зачем этот test-driven, что хорошего и что плохого.
Хочу поделиться своими наблюдениями.

Вопрос №1. Что такое тесты?

Test-driven - некая идеология написания кода, которая заключается в том, что сначала, еще до того как напишете свои первые строки кода, вы пишете для него проверочный код. Затем, вы пишете уже сам код так, чтобы описанные ранее проверки (тесты) корректно срабатывали. Механизмы проверки срабатывания тестов в разных пакетах TestDriven работают очень похоже - потому что суть их работы сводится к последовательности операций:

1. Запустить код теста.
2. Тестовый код отработал как ожидалось? Если да - тест сработал. Если нет - тест провалился.
3. Перейти к следующему тесту.

Когда-то появился первый пакет тестирования и он понравился разработчикам. Не помню на каком языке это было. Может Java, а кажется вообще SmallTalk. Уже не важно. Идея вышла в массы и массы ей обрадовались.
Вообще, принято считать, что разработка с помощью тестов является одним из "столпов", на которых зиждется методика экстремального программирования. Лично мне это не совсем кажется правильным, так как разработка тестов может применяться не только при работе в паре, что пропагандирует стиль "экстремального программирования", но и при работе в одиночку.

Вопрос №2. А нужны они вообще?

Вопрос спорный. Если вы пишете небольшой проект - без тестов вы не пропадете. Небольшой проект - это проект, в котором меньше 100 тыс. строк кода.
Хотя, даже в таких проектах тесты будут полезны.
Спросите, зачем они ? Лишний код и всё такое... Ну да, "лишний", на первый взгляд. Но есть нюанс :) Он заключается в том, что вы в какой-то момент разработки (если только вы не обладаете супер-мозгом, способным хранить в оперативной памяти всю объектную модель вашего проекта) вы начинаете забывать. Что угодно - начиная от иерархии ваших классов, заканчивая особенностями бизнес логики. И вот тут два пути: героически стараться не потеряться в дебрях своего же кода, либо писать тесты. Представьте еще момент. По каким-то причинам вам пришлось приостановить работу над проектом. Пусть на полгода. И вот через полгода как вы думаете, как быстро вы вспомните всё, что связано с этим проектом? Уверен, в какой-то момент, если сделано уже довольно много, вам захочется начать всё заново. Ну, это если, конечно, вы не пишете комментарий на каждую строку кода.
Тесты отображают правила, которые заставят вас вспомнить основное: суть того, что делает ваш код. Вернее, то, как он должен работать. Как того хотел заказчик.
Еще одно преимущество - тесты запускаются независимо от приложения. И тесты никак не влияют на работу основного кода.
Отсюда, следует вывод - тесты скорее нужны, чем нет.

Вопрос №3. Какие плюсы?

К продолжению вопроса №2: помимо того, что тесты хранят суть логики вашего приложения (при условии, конечно, что вы четко отражаете это в ваших тестах), тесты помогают вам спать спокойно. Ну, по крайней мере мне. Я знаю в каком состоянии мой проект, когда я пишу новый тест. По тестам я вижу какую часть работы я уже сделал. Я могу проверить что сработало после очередного изменения объектной модели в угоду внезапному озарению у заказчика. Я знаю что возвращают методы классов, результаты работы которых мне очень нужно увидеть, а собирать весь проект и "дебажить" какую-то его часть у меня нет времени. Мне проще написать маленький тест. И он это сделает быстро и четко.
Есть такие объекты, поведение которых трудно предсказать и адекватность этого поведения трудно отследить. И тут могут выручить тесты. Можно написать серию тестов и они проверят всё нужное вам поведение кода.
Может быть я тут не всё упомянул. Вы можете дополнить :) Но мысль ясна.

Вопрос №4. Какие минусы?

Лень всех без исключения программистов это двигатель их жизни и работы. Всегда проще написать маленький кусок кода чтобы сэкономить свое время и заставить комп что-то делать за тебя :) Но, даже "раздувая" код проекта, тесты экономят время. Их очень лениво писать, но они себя окупают.
Вижу только два минуса, следуя из всего вышесказанного: лень писать тесты и тесты увеличивают трудозатраты на этапе написания кода.

Вопрос №5. Как писать тесты?

Это отдельная тема, возможно будет статья по этому поводу. Здесь я рассказал о своем взгляде на этот вопрос.

Если вы заметили, все последние версии Visual Studio уже содержат мощные пакеты тестирования. Хотя, я по прежнему уважаю пакет .NET TestDriven 1.1. Удобный, маленький, быстрый. Более поздние версии уже платные, но он того стоит я считаю.

 
< Пред.   След. >