Юнит тестирование в Web. Как получать пользу и удовольствие.
1. Юнит тестирование в веб. Как
получать пользу и удовольствие.
Рябенко Сергей. 09.06.2012.
2. Определения
• Unit testing — процесс в программировании, позволяющий
проверить на корректность отдельные модули исходного кода
программы.
• Удовольствие — положительно окрашенная эмоция,
сопровождающая удовлетворение одной или нескольких
потребностей.
• Польза — …
(c) wikipedia.org
8. Исходные данные Через пол года
• Покрываем код на 100% • Править тесты гораздо
• Фича не сдана, если на нее сложнее чем код
не написаны тесты • Тесты до 1500 строк!
• Используем PHPUnit • Тесты выполняются больше
• Непрерывная интеграция часа
• При выполнении тестов PHP
падает по памяти
• Баги все равно находятся
9. Когда не стоит писать тесты
• При создании прототипа
• При работе «в потоке»
• На «примитивный код»
• На пользовательский интерфейс
• You are doing it wrong
• Ваши варианты?..
10. Когда СТОИТ писать тесты
• Во всех остальных случаях...
• … Когда вы делаете это правильно!!!
11. Как писать тесты правильно
• Писать хороший код
• Тестировать поведение и помнить о FIRST принципах
• Использовать правильные инструменты
– PHPUnit
– Непрерывная интеграция
• Использовать IoC
– Dependency Injection
– Service Locator
• Использовать Mock/Stub объекты
• Применять шаблоны SOLID, GRASP (Low coupling, High Cohesion,
Factory)
16. Тестировать поведение
• 10 Сформулировать требования к коду
• 20 Изложить их в тесте в виде:
// GIVEN
// WHEN
// THEN
Так же называется AAA (Arrange-Act-Assert)
• 30 Запустить, убедится что тест не проходит
• 40 Написать код
• 50 Запустить, убедится что тест проходит
• 60 При необходимости или желании провести рефакторинг кода
• GOTO 10
20. Использовать правильные инструменты
• PHPUnit. Не Lime и не любой другой lim’о подобный
фреймворк!
• IDE debug в тестах
• Непрерывная интеграция
– CruiseControl (PHPUnderControl)
– Hudson
– TeamCity
• Запускать тесты каждый вечер автоматически
• Запускать группы тестов перед каждым коммитом
• Не меряйтесь процентом покрытия кода тестами
21. Inversion of Controll
• Правильно расписать «швы» системы. Не создавать сервисы в
классах-клиентах. Не использовать низкоуровневые функции
напрямую
• Использовать Dependency Injection или Service Locator
29. Мы решаем 100% кода покрывать юнит
тестами!
• mail слишком сложно тестировать
• При тестировании каждого аспекта будет выполняться много
ненужного кода
• Тест метода будет объемным
30. Какие есть проблемы в коде?
Явные проблемы:
•$user->setUsername($usermame);
•if (!$form->isValid()) ; <--
•$form – неинициализированная переменная. Нужно $this->form
Неявные проблемы:
•Большая связность кода
•Быстро растущий метод
== Сложная поддержка
32. Спасибо за внимание
• Задавайте вопросы
• Пишите мне
– Email: ryabenko.sergey@gmail.com
– Skype: s.ryabenko
Notes de l'éditeur
История про биллинг
Со временем класс начал расширяться за счет роста функционала
Добавить следующий слайд с демонстрацией тестов по каждой финансовой операции отдельно.
INS: сейчас биллинг используется в нескольких проектах в виде плагина, который поставляется с набором базовых функций (ввода/вывода денег через различные платежные системы) и легко расширяется под конкретные нужды каждого проекта. Когда
Описание каждого паттерна, как они помогают в тестировании
Изменить код, сделать невыполняющуюся проверку неважной (к примеру начисление бонуса, если регистрируется с купоном)