Слайд 2Разработка через тестирование
Техника разработки ПО, основывающаяся на повторении очень коротких циклов разработки:
Написать тест, покрывающий желаемое изменение.
Написать код, который позволяет пройти тест.
Выполнить рефакторинг.
Слайд 3Тест
Тест – это процедура, которая позволяет либо подтвердить, либо опровергнуть работоспособность кода.
Тесты
бывают ручные и автоматические.
Слайд 4Ручное тестирование
Ручное тестирование состоит из двух этапов:
Стимулирование кода.
Проверка результата.
Слайд 5Автоматическое тестирование
Вместо программиста стимулирование кода и проверкой результатов занимается компьютер, который отображает
на экране результат выполнения теста:
Код работоспособен
Или
Код неработоспособен.
Слайд 6Инверсия ответственности
От логики тестов и от их качества зависит, будет ли код
соответствовать техническому заданию.
Слайд 7Модульное тестирование
Юнит-тестирование (unit testing) – процесс, позволяющий в автоматическом режиме проверить на
корректность отдельные модули программы.
Слайд 8Методика TDD
Методика TDD заключается, в основном, в организации автоматических тестов (unit testing)
и выработке определенных навыков тестирования.
Одной из особенностей является написание тестов ДО написания кода.
Слайд 10Мантра TDD
Написать тест;
Добиться, чтобы тест сработал;
Устранить дублирование (выполнить рефакторинг).
Слайд 12Связанные принципы
KISS – keep it simple, stupid (делай проще, тупица). Keep it
short and simple (делай короче и проще).
YAGNI – you ain’t gonna need it (вам это не понадобится).
Слайд 13РЕФАКТОРИНГ
Изменение кода без изменения функциональности
Слайд 14Рефакторинг
Процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий
целью облегчить понимание её работы.
Слайд 15Не путать РЕФАКТОРИНГ с оптимизацией производительности и реинженирингом!
Слайд 16Причины применения рефакторинга
Рефакторинг применяется постоянно при разработке кода. Основными стимулами являются:
Необходимо добавить
новую функцию, которая недостаточно укладывается в принятое архитектурное решение.
Необходимо исправить ошибку, причины возникновения которой сразу не ясны. (Плохой код).
Преодоление трудностей в разработке, которые обусловлены сложной логикой программы. (Плохой код).
Слайд 17Признаки плохого кода
Дублирование кода;
Длинный метод;
Большой класс;
Длинный список параметров;
«Завистливые» функции и «завистливые» классы;
Избыточные
временные переменные;
Классы данных;
Несгруппированные данные.
И т.д…
Слайд 18TDD НА ПРИМЕРЕ
Мультивалютные деньги
Слайд 19Кент Бек. Экстремальное программирование: разработка через тестирование
Test-driven Development by Example
ISBN 5-8046-0051-6, 0-321-14653-0;
2003 г.
Слайд 21Отчет о портфеле акций
*1 USD = 30 руб
Слайд 22Требуемая функциональность
Сложение величин в одной валюте;
Умножение величины в одной валюте (стоимость акции)
на число (количество акций). Результатом должна быть величина в валюте;
Сложение двух величин в разных валютах и конвертировать результат с учетом курса обмена.
Слайд 23ToDo List
$5 + 150 RUR = $10, если курс 1:30
$5 * 2
= $10
Слайд 28TDD ШАГ ЗА ШАГОМ
ТЕСТ -> КОД -> РЕФАКТОРИНГ
Слайд 30Нет класса Dollar;
Нет конструктора;
Нет метода times()
Нет переменной класса Amount.
Не компилируется – 4
ошибки!
Слайд 35Зеленая полоса как можно быстрее!
Слайд 37Полный цикл TDD
Добавить небольшой тест.
Запустить все тесты, при этом обнаружить, что что-то
не срабатывает.
Внести небольшое изменение.
Снова запустить тесты и убедиться, что все они успешно выполняются.
Устранить дублирование с помощью рефакторинга.
Слайд 40Перенос умножения в функцию times()
Слайд 42Перепишем times, используя значение из Amount
Слайд 45ToDo List
$5 + 150 RUR = $10, если курс 1:30
$5 * 2
= $10 <- ГОТОВО
Сделать переменную Amount закрытым членом класса
Побочные эффекты в классе Dollar?
Округление денежных величин?
Слайд 46ЧИСТЫЙ КОД, КОТОРЫЙ РАБОТАЕТ
Clean code that works © Ron Jeffries
Слайд 481. Напишите тест.
Представьте, как будет реализована в коде воображаемая операция.
Придумывая её интерфейс,
опишите все элементы, которые, как вам кажется, понадобятся.
Пример: в первом тесте мы добавили класс Dollar, функцию times и переменную-член Amount.
Слайд 492. Заставьте тест работать
Первоочередная задача – получить зеленую полосу.
Если ОЧЕВИДНО простое и
элегантное решение – создайте его.
Если на реализацию такого решения потребуется время – ОТЛОЖИТЕ его. Просто отметьте, что к нему придется вернуться, когда будет решена основная задача – быстро получить зеленый индикатор.
Противоречит правилам хорошей разработки?
Слайд 503. Улучшите решение
После того, как система работает, избавьтесь от прошлых прегрешений и
вернитесь к хорошей разработке.
Удалите дублирование (и другие огрехи) и быстро сделайте так, чтобы полоска снова стала зеленой.
Слайд 51Чистый код, который работает
Сначала мы получаем код, который работает.
Затем делаем из него
чистый код.
Слайд 52ToDo List
$5 + 150 RUR = $10, если курс 1:30
$5 * 2
= $10
Сделать переменную Amount закрытым членом класса
Побочные эффекты в классе Dollar?
Округление денежных величин?
Слайд 56Потом код
Сначала сделайте, чтобы просто компилировалось.
Слайд 58Компилируется, но полоса снова красная. А это тоже прогресс!
Слайд 61Триангуляция
Одного теста недостаточно! Необходимо минимум два.
Слайд 62Слабые места TDD
Сложно привыкнуть.
Сложно применять TDD в ряде случаев, например, при разработке
GUI.
Требуется больше времени на разработку, т.к. необходимо писать тесты.
Т.к. модульные тесты обычно пишутся теми же, кто написал код, то в случае неверной трактовки требований к приложению, и тест и тестируемый код могут содержать ошибки.
И др.
Слайд 63Задание на дом
Скачать и установить на свой компьютер NUnit testing framework для
C#
NUnit для .NET (С#) – http://www.nunit.org/
Быстрый старт на русском: http://goo.gl/wIQBr
По желанию:
JUnit для Java – http://www.junit.org/
CPPUnit для С++ - http://cppunit.sourceforge.net
Любой другой framework.
Слайд 64Задание на дом
Используя методологию TDD разработать класс или набор классов, обеспечив полное
покрытие тестами.
Продемонстрировать владение умение владеть инструментом NUnit, знание основ TDD.
Величины в разных шкалах.
Обеспечить (в одной шкале): умножение и деление на число, (в одной и разных шкалах): сложение, вычитание, операции отношения (больше, меньше, эквивалентность) величин, принадлежащих разным шкалам: градусы и фаренгейты, метры и футы, мили и километры, Ватты и лошадиные силы, акры и гектары, паскали (бары) и атмосферы, узлы и км/ч, литры и галлоны, унции и караты.
Пример на следующем слайде.