Слайд 2Разработка через тестирование
Техника разработки ПО, основывающаяся на повторении очень коротких циклов разработки:
![Разработка через тестирование Техника разработки ПО, основывающаяся на повторении очень коротких циклов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-1.jpg)
Написать тест, покрывающий желаемое изменение.
Написать код, который позволяет пройти тест.
Выполнить рефакторинг.
Слайд 3Тест
Тест – это процедура, которая позволяет либо подтвердить, либо опровергнуть работоспособность кода.
Тесты
![Тест Тест – это процедура, которая позволяет либо подтвердить, либо опровергнуть работоспособность](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-2.jpg)
бывают ручные и автоматические.
Слайд 4Ручное тестирование
Ручное тестирование состоит из двух этапов:
Стимулирование кода.
Проверка результата.
![Ручное тестирование Ручное тестирование состоит из двух этапов: Стимулирование кода. Проверка результата.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-3.jpg)
Слайд 5Автоматическое тестирование
Вместо программиста стимулирование кода и проверкой результатов занимается компьютер, который отображает
![Автоматическое тестирование Вместо программиста стимулирование кода и проверкой результатов занимается компьютер, который](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-4.jpg)
на экране результат выполнения теста:
Код работоспособен
Или
Код неработоспособен.
Слайд 6Инверсия ответственности
От логики тестов и от их качества зависит, будет ли код
![Инверсия ответственности От логики тестов и от их качества зависит, будет ли код соответствовать техническому заданию.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-5.jpg)
соответствовать техническому заданию.
Слайд 7Модульное тестирование
Юнит-тестирование (unit testing) – процесс, позволяющий в автоматическом режиме проверить на
![Модульное тестирование Юнит-тестирование (unit testing) – процесс, позволяющий в автоматическом режиме проверить](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-6.jpg)
корректность отдельные модули программы.
Слайд 8Методика TDD
Методика TDD заключается, в основном, в организации автоматических тестов (unit testing)
![Методика TDD Методика TDD заключается, в основном, в организации автоматических тестов (unit](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-7.jpg)
и выработке определенных навыков тестирования.
Одной из особенностей является написание тестов ДО написания кода.
Слайд 10Мантра TDD
Написать тест;
Добиться, чтобы тест сработал;
Устранить дублирование (выполнить рефакторинг).
![Мантра TDD Написать тест; Добиться, чтобы тест сработал; Устранить дублирование (выполнить рефакторинг).](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-9.jpg)
Слайд 12Связанные принципы
KISS – keep it simple, stupid (делай проще, тупица). Keep it
![Связанные принципы KISS – keep it simple, stupid (делай проще, тупица). Keep](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-11.jpg)
short and simple (делай короче и проще).
YAGNI – you ain’t gonna need it (вам это не понадобится).
Слайд 13РЕФАКТОРИНГ
Изменение кода без изменения функциональности
![РЕФАКТОРИНГ Изменение кода без изменения функциональности](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-12.jpg)
Слайд 14Рефакторинг
Процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий
![Рефакторинг Процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-13.jpg)
целью облегчить понимание её работы.
Слайд 15Не путать РЕФАКТОРИНГ с оптимизацией производительности и реинженирингом!
![Не путать РЕФАКТОРИНГ с оптимизацией производительности и реинженирингом!](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-14.jpg)
Слайд 16Причины применения рефакторинга
Рефакторинг применяется постоянно при разработке кода. Основными стимулами являются:
Необходимо добавить
![Причины применения рефакторинга Рефакторинг применяется постоянно при разработке кода. Основными стимулами являются:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-15.jpg)
новую функцию, которая недостаточно укладывается в принятое архитектурное решение.
Необходимо исправить ошибку, причины возникновения которой сразу не ясны. (Плохой код).
Преодоление трудностей в разработке, которые обусловлены сложной логикой программы. (Плохой код).
Слайд 17Признаки плохого кода
Дублирование кода;
Длинный метод;
Большой класс;
Длинный список параметров;
«Завистливые» функции и «завистливые» классы;
Избыточные
![Признаки плохого кода Дублирование кода; Длинный метод; Большой класс; Длинный список параметров;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-16.jpg)
временные переменные;
Классы данных;
Несгруппированные данные.
И т.д…
Слайд 18TDD НА ПРИМЕРЕ
Мультивалютные деньги
![TDD НА ПРИМЕРЕ Мультивалютные деньги](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-17.jpg)
Слайд 19Кент Бек. Экстремальное программирование: разработка через тестирование
Test-driven Development by Example
ISBN 5-8046-0051-6, 0-321-14653-0;
![Кент Бек. Экстремальное программирование: разработка через тестирование Test-driven Development by Example ISBN 5-8046-0051-6, 0-321-14653-0; 2003 г.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-18.jpg)
2003 г.
Слайд 21Отчет о портфеле акций
*1 USD = 30 руб
![Отчет о портфеле акций *1 USD = 30 руб](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-20.jpg)
Слайд 22Требуемая функциональность
Сложение величин в одной валюте;
Умножение величины в одной валюте (стоимость акции)
![Требуемая функциональность Сложение величин в одной валюте; Умножение величины в одной валюте](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-21.jpg)
на число (количество акций). Результатом должна быть величина в валюте;
Сложение двух величин в разных валютах и конвертировать результат с учетом курса обмена.
Слайд 23ToDo List
$5 + 150 RUR = $10, если курс 1:30
$5 * 2
![ToDo List $5 + 150 RUR = $10, если курс 1:30 $5 * 2 = $10](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-22.jpg)
= $10
Слайд 28TDD ШАГ ЗА ШАГОМ
ТЕСТ -> КОД -> РЕФАКТОРИНГ
![TDD ШАГ ЗА ШАГОМ ТЕСТ -> КОД -> РЕФАКТОРИНГ](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-27.jpg)
Слайд 30Нет класса Dollar;
Нет конструктора;
Нет метода times()
Нет переменной класса Amount.
Не компилируется – 4
![Нет класса Dollar; Нет конструктора; Нет метода times() Нет переменной класса Amount.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-29.jpg)
ошибки!
Слайд 35Зеленая полоса как можно быстрее!
![Зеленая полоса как можно быстрее!](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-34.jpg)
Слайд 37Полный цикл TDD
Добавить небольшой тест.
Запустить все тесты, при этом обнаружить, что что-то
![Полный цикл TDD Добавить небольшой тест. Запустить все тесты, при этом обнаружить,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-36.jpg)
не срабатывает.
Внести небольшое изменение.
Снова запустить тесты и убедиться, что все они успешно выполняются.
Устранить дублирование с помощью рефакторинга.
Слайд 40Перенос умножения в функцию times()
![Перенос умножения в функцию times()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-39.jpg)
Слайд 42Перепишем times, используя значение из Amount
![Перепишем times, используя значение из Amount](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-41.jpg)
Слайд 45ToDo List
$5 + 150 RUR = $10, если курс 1:30
$5 * 2
![ToDo List $5 + 150 RUR = $10, если курс 1:30 $5](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-44.jpg)
= $10 <- ГОТОВО
Сделать переменную Amount закрытым членом класса
Побочные эффекты в классе Dollar?
Округление денежных величин?
Слайд 46ЧИСТЫЙ КОД, КОТОРЫЙ РАБОТАЕТ
Clean code that works © Ron Jeffries
![ЧИСТЫЙ КОД, КОТОРЫЙ РАБОТАЕТ Clean code that works © Ron Jeffries](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-45.jpg)
Слайд 481. Напишите тест.
Представьте, как будет реализована в коде воображаемая операция.
Придумывая её интерфейс,
![1. Напишите тест. Представьте, как будет реализована в коде воображаемая операция. Придумывая](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-47.jpg)
опишите все элементы, которые, как вам кажется, понадобятся.
Пример: в первом тесте мы добавили класс Dollar, функцию times и переменную-член Amount.
Слайд 492. Заставьте тест работать
Первоочередная задача – получить зеленую полосу.
Если ОЧЕВИДНО простое и
![2. Заставьте тест работать Первоочередная задача – получить зеленую полосу. Если ОЧЕВИДНО](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-48.jpg)
элегантное решение – создайте его.
Если на реализацию такого решения потребуется время – ОТЛОЖИТЕ его. Просто отметьте, что к нему придется вернуться, когда будет решена основная задача – быстро получить зеленый индикатор.
Противоречит правилам хорошей разработки?
Слайд 503. Улучшите решение
После того, как система работает, избавьтесь от прошлых прегрешений и
![3. Улучшите решение После того, как система работает, избавьтесь от прошлых прегрешений](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-49.jpg)
вернитесь к хорошей разработке.
Удалите дублирование (и другие огрехи) и быстро сделайте так, чтобы полоска снова стала зеленой.
Слайд 51Чистый код, который работает
Сначала мы получаем код, который работает.
Затем делаем из него
![Чистый код, который работает Сначала мы получаем код, который работает. Затем делаем из него чистый код.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-50.jpg)
чистый код.
Слайд 52ToDo List
$5 + 150 RUR = $10, если курс 1:30
$5 * 2
![ToDo List $5 + 150 RUR = $10, если курс 1:30 $5](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-51.jpg)
= $10
Сделать переменную Amount закрытым членом класса
Побочные эффекты в классе Dollar?
Округление денежных величин?
Слайд 56Потом код
Сначала сделайте, чтобы просто компилировалось.
![Потом код Сначала сделайте, чтобы просто компилировалось.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-55.jpg)
Слайд 58Компилируется, но полоса снова красная. А это тоже прогресс!
![Компилируется, но полоса снова красная. А это тоже прогресс!](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-57.jpg)
Слайд 61Триангуляция
Одного теста недостаточно! Необходимо минимум два.
![Триангуляция Одного теста недостаточно! Необходимо минимум два.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-60.jpg)
Слайд 62Слабые места TDD
Сложно привыкнуть.
Сложно применять TDD в ряде случаев, например, при разработке
![Слабые места TDD Сложно привыкнуть. Сложно применять TDD в ряде случаев, например,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-61.jpg)
GUI.
Требуется больше времени на разработку, т.к. необходимо писать тесты.
Т.к. модульные тесты обычно пишутся теми же, кто написал код, то в случае неверной трактовки требований к приложению, и тест и тестируемый код могут содержать ошибки.
И др.
Слайд 63Задание на дом
Скачать и установить на свой компьютер NUnit testing framework для
![Задание на дом Скачать и установить на свой компьютер NUnit testing framework](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-62.jpg)
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 разработать класс или набор классов, обеспечив полное
![Задание на дом Используя методологию TDD разработать класс или набор классов, обеспечив](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373354/slide-63.jpg)
покрытие тестами.
Продемонстрировать владение умение владеть инструментом NUnit, знание основ TDD.
Величины в разных шкалах.
Обеспечить (в одной шкале): умножение и деление на число, (в одной и разных шкалах): сложение, вычитание, операции отношения (больше, меньше, эквивалентность) величин, принадлежащих разным шкалам: градусы и фаренгейты, метры и футы, мили и километры, Ватты и лошадиные силы, акры и гектары, паскали (бары) и атмосферы, узлы и км/ч, литры и галлоны, унции и караты.
Пример на следующем слайде.