Test-Driven Development

Антон Бевзюк
Июль 2014

О чем будем говорить?

На примере C# / MS Visual Studio

Что такое TDD?

Мифы о TDD

Test-Driven Development

Что это даёт?

  • Актуальное описание намерений, дизайна и использования системы
  • Легкое обнаружение слабых мест в дизайне
  • Автоматическое регрессионное тестирование
  • Безопасный рефакторинг
  • Быстрое обнаружение дефектов

Отладка

Отладка - это трата времени

Роберт Мартин

RED / GREEN / REFACTOR

=> Подумай, напиши тест

Скомпилируй

Исправь ошибки

Запусти все тесты и убедись, что они прошли

Запусти все тесты и убедись, что они упали

Рефакторинг

Запусти все тесты и убедись, что они прошли

Напиши код

Демонстрация

Как начать писать тест?

  • Сможешь написать реализацию
  • Знаешь, каким будет следующий шаг

Что нужно тестировать?

Нужно

  • Все, что может поломаться

Не нужно

  • set; get
  • GUI
  • private

Вещи, которые нужно делать всегда

  • Сначала тест, потом код
  • Список todo
  • Новый код только, если есть красный тест
  • Запускать все тесты
  • Поддерживать качество кода тестов
  • Рефакторинг

Вещи, которые делать нельзя никогда

  • Несколько красных тестов
  • Новый тест до рефакторинга
  • Check-in кода с падающими тестами

Хороший unit test

  • Сфокусированый (1 assert)
  • Быстрый
  • Автоматический (легкий запуск)
  • Независимый от
  • Других тестов
  • Окружения
  • Порядка запуска
  • Такого же качества как и код приложения

Плохие тесты

  • Длинная инициализация
  • Порочный дизайн
  • Слишком большие классы
  • Медленные тесты
  • > 10 минут для запуска тестов
  • Хрупкие тесты
  • Высокая вязкость

TDD patterns

Green Test Patterns

Red Test Patters

7 стадий юнит-тестера

  1. "У меня нет на это времени".
  2. Начинает писать юнит тесты и писать в блоге,
    как это здорово, и что каждый должен следовать TDD.
  3. Тестирует всё подряд - private, get, set. Доводит покрытие до 100%.
    Злоупотребляет атрибутом InternalsVisibleTo.
  4. Пишет хрупкие тесты, по сути являющиеся интеграционными.
  5. Открывает для себя средства, облегчающие тестирование.
  6. Подменяет абсолютно всё, что можно подменить.
  7. Начинает писать эффективные юнит тесты.

Контрольные вопросы

  1. Что такое TDD, его назначение
  2. Мифы о TDD
  3. Цикл разработки по TDD (в виде рисунка и с максимумом деталей)
  4. Атрибуты хорошего unit-теста (включая AAA)

Спасибо!

Вопросы?