Модульное тестирование и
TDD
Александр Бындю
ByndyuSoft
http://www.byndyu.ru
6-я конференция .NET разработчиков
28 апреля 2013
www.dotnetconf.ru
2Модульное тестирование и TDD
Обо мне
1. Владелец компании ByndyuSoft
2. Консультант по вопросам разработки приложений и
организации работы IT компаний
3. Внештатный сотрудник Академии АйТи
4. Технический блог http://blog.byndyu.ru
5. Преподаю в ЮУрГУ
6. Организую конференции .NET-разработчиков
http://www.dotnetconf.ru
7. Веду группу в Google Group по проблемам
разработки приложений
http://groups.google.com/dotnetconf
3Модульное тестирование и TDD
План
1. Модульное тестирование
2. Test-Driven Development
3. Работа с унаследованным кодом
4Модульное тестирование и TDD
Модульное тестирование (Unit Testing)
1. Использование xUnit-фреймворков
2. Mock-и и Stub-ы
3. Проверка состояния vs Проверка поведения
4. Именование тестов
5. Шаблон AAA
6. Организация тестов
7. Модульное тестирование и сильное связывание
8. СУБД и другое внешние окружение
9. Тестирование UI (шаблоны MVС и MVP)
10. Покрытие кода тестами
11. Время выполнения тестов, Continuous Integration
12. Полезные фреймворки и инструменты
5Модульное тестирование и TDD
1. Использование xUnit-фреймворков
• xUnit
• MbUnit
• NUnit
• …
Solution: UnitTestExamples.sln
Проект: FirstUnitTests
6Модульное тестирование и TDD
Зачем нужны
модульные
тесты?
7Модульное тестирование и TDD
Характеристики Unit Test’ов
1. Независимость
2. Повторяемость
3. Скорость
4. Автоматический запуск
5. Падение по одной причине
Пишем пример нарушения
каждого пункта 
8Модульное тестирование и TDD
СУБД и другое внешние окружение
Модульные тесты полностью изолируют
окружение.
Влияет на:
1. скорость выполнения тестов
2. зависимость окружения
3. связанность в тестах
9Модульное тестирование и TDD
Mock-и и Stub-ы
• Mock-объект (от англ. mock object, буквально:
объект-пародия, объект-имитация) —
тип объектов, реализующих заданные аспекты
моделируемого программного окружения.
• Stub (от англ. stub, буквально: заглушка)—объект
или функцию, не выполняющая никакого
осмысленного действия, возвращающая пустой
результат или входные данные в неизменном виде.
10Модульное тестирование и TDD
Moчим объект
Проверка состояния vs Проверка поведения
Живой пример
Solution: UnitTestExamples.sln
Проект: MockExamples
11Модульное тестирование и TDD
Именование тестов
1. Что делает тест?
2. Что в результате ожидаем?
Название содержит описание тестового
сценария
12Модульное тестирование и TDD
Шаблон ААА
// arrange
Готовим данные для теста
// act
Выполняем действие, которое тестируем
// assert
Проверяем результат
13Модульное тестирование и TDD
Тестирование UI
1. Шаблон Model-View-Controller (MVC)
2. Шаблон Model-View-Presenter (MVP)
3. Шаблон Model-View-Presenter (MVVM)
Живой пример
Solution: MVPTests.sln
14Модульное тестирование и TDD
Модульное тестирование и
сильное связывание
15Модульное тестирование и TDD
Покрытие кода тестами
1. dotCover
2. NCover
3. OpenCover
http://www.bullseye.com/paper.html
16Модульное тестирование и TDD
Время выполнения тестов, CI
Разработчик
пишет код
Заливает изменений
в систему контроля
версий
Интеграционная
система (CI) находит
изменения
CI берет последнюю
версию кода, компилирует
и запускает модульные
тесты
CI оповещает всех об
успехе или неудаче
17Модульное тестирование и TDD
Организация тестов
1. По сборкам
2. По классам
3. По функциям
18Модульное тестирование и TDD
Разработка через тестирование
(Test-Driven Development)
• Мантра TDD: «red-green-refactor»
• Пример использования
• Границы применимости
19Модульное тестирование и TDD
Мантра TDD: «red-green-refactor»
20Модульное тестирование и TDD
Живые примеры
21Модульное тестирование и TDD
Цикл разработки
1. Сначала придумываем тест
2. Создаем недостающие объекты, чтобы проект
компилировался
3. Запускаем тест и видим, что он не работает (красная
полоса). Здесь появляется маячок, который
подталкивает нас решать эту проблему. Хочу зелёную
полоску!
4. Пишем код до тех пор, пока тест не сработает
5. Видим зелёную полоску и внутренне радуемся своей
маленькой победе!
6. Рефакторим код, если это необходимо
22Модульное тестирование и TDD
Преимущества от TDD
TDD
Количество
тестов
Продуктивность
Качество
системы
+ ++
++
23Модульное тестирование и TDD
FAQ по TDD
1. Как протестировать приватные методы?
2. Надо ли стремиться покрыть код тестами на 100%?
3. Сначала нам надо написать много тестов, а потом
исправлять их один за другим?
4. Как же мне протестировать взаимодействие с базой
данных, работу с SMTP-сервером или файловой
системой?
5. Как часто надо запускать все тесты?
24Модульное тестирование и TDD
Границы применимости
1. Изучение предметной области
2. Изучение технологии
3. Реализация алгоритмов
4. Добавление функциональности
Сложности:
1. Рутинные задачи
2. Невозможность тестирования
3. Параллельные вычисления
25Модульное тестирование и TDD
Модификация существующей
функциональности (исправление ошибок)
Изменение функциональности:
1. Написать проходящие тесты
2. Сделать рефакторинг
3. Убедится, что не сломали
26Модульное тестирование и TDD
Ссылки
• Книга Экстремальное программирование: разработка
через тестирование
• Видео Пример разработки приложения с помощью TDD
• Статья TDD для начинающих. Ответы на популярные
вопросы
27Модульное тестирование и TDD
Спасибо за внимание!
Буду рад ответить на ваши
вопросы лично или через:
blog.byndyu.ru
alexanderbyndyu
alexander.byndyu@gmail.com

Модульное тестирование и TDD в .NET

  • 1.
    Модульное тестирование и TDD АлександрБындю ByndyuSoft http://www.byndyu.ru 6-я конференция .NET разработчиков 28 апреля 2013 www.dotnetconf.ru
  • 2.
    2Модульное тестирование иTDD Обо мне 1. Владелец компании ByndyuSoft 2. Консультант по вопросам разработки приложений и организации работы IT компаний 3. Внештатный сотрудник Академии АйТи 4. Технический блог http://blog.byndyu.ru 5. Преподаю в ЮУрГУ 6. Организую конференции .NET-разработчиков http://www.dotnetconf.ru 7. Веду группу в Google Group по проблемам разработки приложений http://groups.google.com/dotnetconf
  • 3.
    3Модульное тестирование иTDD План 1. Модульное тестирование 2. Test-Driven Development 3. Работа с унаследованным кодом
  • 4.
    4Модульное тестирование иTDD Модульное тестирование (Unit Testing) 1. Использование xUnit-фреймворков 2. Mock-и и Stub-ы 3. Проверка состояния vs Проверка поведения 4. Именование тестов 5. Шаблон AAA 6. Организация тестов 7. Модульное тестирование и сильное связывание 8. СУБД и другое внешние окружение 9. Тестирование UI (шаблоны MVС и MVP) 10. Покрытие кода тестами 11. Время выполнения тестов, Continuous Integration 12. Полезные фреймворки и инструменты
  • 5.
    5Модульное тестирование иTDD 1. Использование xUnit-фреймворков • xUnit • MbUnit • NUnit • … Solution: UnitTestExamples.sln Проект: FirstUnitTests
  • 6.
    6Модульное тестирование иTDD Зачем нужны модульные тесты?
  • 7.
    7Модульное тестирование иTDD Характеристики Unit Test’ов 1. Независимость 2. Повторяемость 3. Скорость 4. Автоматический запуск 5. Падение по одной причине Пишем пример нарушения каждого пункта 
  • 8.
    8Модульное тестирование иTDD СУБД и другое внешние окружение Модульные тесты полностью изолируют окружение. Влияет на: 1. скорость выполнения тестов 2. зависимость окружения 3. связанность в тестах
  • 9.
    9Модульное тестирование иTDD Mock-и и Stub-ы • Mock-объект (от англ. mock object, буквально: объект-пародия, объект-имитация) — тип объектов, реализующих заданные аспекты моделируемого программного окружения. • Stub (от англ. stub, буквально: заглушка)—объект или функцию, не выполняющая никакого осмысленного действия, возвращающая пустой результат или входные данные в неизменном виде.
  • 10.
    10Модульное тестирование иTDD Moчим объект Проверка состояния vs Проверка поведения Живой пример Solution: UnitTestExamples.sln Проект: MockExamples
  • 11.
    11Модульное тестирование иTDD Именование тестов 1. Что делает тест? 2. Что в результате ожидаем? Название содержит описание тестового сценария
  • 12.
    12Модульное тестирование иTDD Шаблон ААА // arrange Готовим данные для теста // act Выполняем действие, которое тестируем // assert Проверяем результат
  • 13.
    13Модульное тестирование иTDD Тестирование UI 1. Шаблон Model-View-Controller (MVC) 2. Шаблон Model-View-Presenter (MVP) 3. Шаблон Model-View-Presenter (MVVM) Живой пример Solution: MVPTests.sln
  • 14.
    14Модульное тестирование иTDD Модульное тестирование и сильное связывание
  • 15.
    15Модульное тестирование иTDD Покрытие кода тестами 1. dotCover 2. NCover 3. OpenCover http://www.bullseye.com/paper.html
  • 16.
    16Модульное тестирование иTDD Время выполнения тестов, CI Разработчик пишет код Заливает изменений в систему контроля версий Интеграционная система (CI) находит изменения CI берет последнюю версию кода, компилирует и запускает модульные тесты CI оповещает всех об успехе или неудаче
  • 17.
    17Модульное тестирование иTDD Организация тестов 1. По сборкам 2. По классам 3. По функциям
  • 18.
    18Модульное тестирование иTDD Разработка через тестирование (Test-Driven Development) • Мантра TDD: «red-green-refactor» • Пример использования • Границы применимости
  • 19.
    19Модульное тестирование иTDD Мантра TDD: «red-green-refactor»
  • 20.
  • 21.
    21Модульное тестирование иTDD Цикл разработки 1. Сначала придумываем тест 2. Создаем недостающие объекты, чтобы проект компилировался 3. Запускаем тест и видим, что он не работает (красная полоса). Здесь появляется маячок, который подталкивает нас решать эту проблему. Хочу зелёную полоску! 4. Пишем код до тех пор, пока тест не сработает 5. Видим зелёную полоску и внутренне радуемся своей маленькой победе! 6. Рефакторим код, если это необходимо
  • 22.
    22Модульное тестирование иTDD Преимущества от TDD TDD Количество тестов Продуктивность Качество системы + ++ ++
  • 23.
    23Модульное тестирование иTDD FAQ по TDD 1. Как протестировать приватные методы? 2. Надо ли стремиться покрыть код тестами на 100%? 3. Сначала нам надо написать много тестов, а потом исправлять их один за другим? 4. Как же мне протестировать взаимодействие с базой данных, работу с SMTP-сервером или файловой системой? 5. Как часто надо запускать все тесты?
  • 24.
    24Модульное тестирование иTDD Границы применимости 1. Изучение предметной области 2. Изучение технологии 3. Реализация алгоритмов 4. Добавление функциональности Сложности: 1. Рутинные задачи 2. Невозможность тестирования 3. Параллельные вычисления
  • 25.
    25Модульное тестирование иTDD Модификация существующей функциональности (исправление ошибок) Изменение функциональности: 1. Написать проходящие тесты 2. Сделать рефакторинг 3. Убедится, что не сломали
  • 26.
    26Модульное тестирование иTDD Ссылки • Книга Экстремальное программирование: разработка через тестирование • Видео Пример разработки приложения с помощью TDD • Статья TDD для начинающих. Ответы на популярные вопросы
  • 27.
    27Модульное тестирование иTDD Спасибо за внимание! Буду рад ответить на ваши вопросы лично или через: blog.byndyu.ru alexanderbyndyu alexander.byndyu@gmail.com