Сайт Игоря Кононученко   Статьи

Прагматичное юнит-тестирование

13 ноября 2008

Для не знающих

Вы попробовали тестирование и поняли, что ваш случай в корне отличается от того, что в книге. Ваши сроки из реальной жизни, у вас нет времени еще и тесты писать. Поддержка тестов только замедляет разработку. Какой толк, все равно та либа работает только на том сервере, а локально нет.

Но

Вы, скорее всего, не умеете писать тесты и, очень вероятно, что в вашем коде присутствует большинство признаков плохого кода. Это лечится при желании. Лекарства:

  • Рефакторинг. Улучшение существующего кода
  • Экстремальное программирование: разработка через тестирование
  • Шаблоны тестирования xUnit. Рефакторинг кода тестов — эта книга мега-лекарство.

Для знающих много пользы

А знать надо вот что:

  • Юнит-тест — тестирует лишь небольшой кусочек функционала.
    В идеале протестировать метод на то, что он правильно делает вызовы других методов
  • Юнит-тест невероятно быстр.
    Поскольку тестируется лишь маленький кусочек функционала без обращений к бд или файлам — все довольно таки быстро.
  • Для большого метода юнит-тест написать очень сложно.
    Сложно, потому что много логики. Приходится слишком много заглушек делать для одного метода.
  • Тестируемый функционал не обращается к базе данных, не отправляет запросов, не считывает файлы с диска.
    Это долго и тестируемый функционал становится незащищенным от сбоев внешнего функционала.
  • Юнит-тест не зависит не от порядка выполнения теста, не от сбоев в остальном функционале.
    Тесты должны быть независимы — это упрощает локализацию ошибок.
  • Все юнит-тесты вместе взятые выполняются не более 10 секунд в любом проекте.
    Иначе слишком часто запускать их будет не удобно.
  • Юнит-тесты как и код требуют рефакторинга.
    Постоянно делая рефакторинг, получите свой тестовый язык (или апи) для тестов.
  • 100% покрытие юнит-тестами не даст 100% гарантии работоспособности проекта.
    Всего не учтешь и не протестируешь.
    Тесты дадут возможность:
  • избежать сценариев — кто похерил мой функционал? (разработчик); как же так, оно ведь уже работало? (заказчик)
  • смело делать рефакторинг кода, который используется во всем проекте
  • быстро находить ошибки
  • получать удовольствие от разработки (когда знаешь, что все работает — очень хорошее чувство)

Еще мысли

Юнит-тесты писать сложно. Лень, незнание, самообман — очень веские помехи.

Разработка через тестирование? — В идеале.

Легко тестировать функционал для рассчетов чего-либо — это сплошное удовольствие.

Являются ли тесты гарантией успеха проекта? — Нет, также как и хороший код. Но приятнее работать с хорошим кодом и с протестированным функционалом.

Если проект не большой и его не надо будет сопровождать в будущем — можно и без тестов обойтись, используя копи-паст для ускорения разработки.

Кроме юнит-тестов нужно писать интеграционные тесты — те же юнит-тесты только без заглушек функционала. Выполняются долго, зато позволяют проверить, что механизм в собранном виде функционирует нормально.

В ваших реалиях скорее всего придется пойти на компромиссы. Вероятно, что быстрый старт вашего проекта важнее, чем в будущем более дешевое сопровождение проекта, поэтому придется балансировать. Если видите, что юнит-тесты писать уже нет времени — пишите интеграционные тесты на пользовательские сценарии, и юнит-тесты на рассчетную часть функционала.

И обязательно прочтите книги из списка, если еще этого не сделали.

Азбука хорошего разработчика. Книжки для чтения
Оптимизация JavaScript — делаем билд процесс
Ctrl
Linq to SQL и DDD
Continuous Integration в django-проекте