32
Юнит тестирование в веб. Как получать пользу и удовольствие. Рябенко Сергей. 09.06.2012.

Юнит тестирование в Web. Как получать пользу и удовольствие

Embed Size (px)

Citation preview

Page 1: Юнит тестирование в Web. Как получать пользу и удовольствие

Юнит тестирование в веб. Как получать пользу и удовольствие.

Рябенко Сергей. 09.06.2012.

Page 2: Юнит тестирование в Web. Как получать пользу и удовольствие

Определения

• Unit testing — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.

• Удовольствие — положительно окрашенная эмоция, сопровождающая удовлетворение одной или нескольких потребностей.

• Польза — …

(c) wikipedia.org

Page 3: Юнит тестирование в Web. Как получать пользу и удовольствие

Простой тест из документации PHPUnit

Page 4: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 5: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 6: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 7: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 8: Юнит тестирование в Web. Как получать пользу и удовольствие

Исходные данные• Покрываем код на 100%• Фича не сдана, если на нее

не написаны тесты• Используем PHPUnit• Непрерывная интеграция

Через пол года• Править тесты гораздо

сложнее чем код• Тесты до 1500 строк!• Тесты выполняются больше

часа• При выполнении тестов PHP

падает по памяти• Баги все равно находятся

Page 9: Юнит тестирование в Web. Как получать пользу и удовольствие

Когда не стоит писать тесты

• При создании прототипа• При работе «в потоке»• На «примитивный код»• На пользовательский интерфейс• You are doing it wrong• Ваши варианты?..

Page 10: Юнит тестирование в Web. Как получать пользу и удовольствие

Когда СТОИТ писать тесты

• Во всех остальных случаях...

• … Когда вы делаете это правильно!!!

Page 11: Юнит тестирование в Web. Как получать пользу и удовольствие

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

• Писать хороший код• Тестировать поведение и помнить о FIRST принципах• Использовать правильные инструменты

– PHPUnit– Непрерывная интеграция

• Использовать IoC– Dependency Injection– Service Locator

• Использовать Mock/Stub объекты• Применять шаблоны SOLID, GRASP (Low coupling, High Cohesion,

Factory)

Page 12: Юнит тестирование в Web. Как получать пользу и удовольствие

Писать хороший код

Page 13: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 14: Юнит тестирование в Web. Как получать пользу и удовольствие

И это только треть!

Page 15: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 16: Юнит тестирование в Web. Как получать пользу и удовольствие

Тестировать поведение

• 10 Сформулировать требования к коду• 20 Изложить их в тесте в виде:

// GIVEN// WHEN// THENТак же называется AAA (Arrange-Act-Assert)

• 30 Запустить, убедится что тест не проходит• 40 Написать код• 50 Запустить, убедится что тест проходит• 60 При необходимости или желании провести рефакторинг кода• GOTO 10

Page 17: Юнит тестирование в Web. Как получать пользу и удовольствие

Red Green Refactor

Page 18: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 19: Юнит тестирование в Web. Как получать пользу и удовольствие

F.I.R.S.T

• Fast

• Isolated

• Repeatable

• Self-Verifying

• Timely

Page 20: Юнит тестирование в Web. Как получать пользу и удовольствие

Использовать правильные инструменты

• PHPUnit. Не Lime и не любой другой lim’о подобный фреймворк!

• IDE debug в тестах• Непрерывная интеграция

– CruiseControl (PHPUnderControl)– Hudson – TeamCity

• Запускать тесты каждый вечер автоматически• Запускать группы тестов перед каждым коммитом• Не меряйтесь процентом покрытия кода тестами

Page 21: Юнит тестирование в Web. Как получать пользу и удовольствие

Inversion of Controll

• Правильно расписать «швы» системы. Не создавать сервисы в классах-клиентах. Не использовать низкоуровневые функции напрямую

• Использовать Dependency Injection или Service Locator

Page 22: Юнит тестирование в Web. Как получать пользу и удовольствие
Page 23: Юнит тестирование в Web. Как получать пользу и удовольствие

Dependency Injection

Page 24: Юнит тестирование в Web. Как получать пользу и удовольствие

Service Locator

Page 25: Юнит тестирование в Web. Как получать пользу и удовольствие

Mock objects

Page 26: Юнит тестирование в Web. Как получать пользу и удовольствие

Шаблоны проектирования

• SOLID– Single responsibility principle– Open/closed principle– Liskov substitution principle– Interface segregation principle– Dependency inversion principle

• GRASP– Low Coupling– High Cohesion– Abstract Factory

Page 27: Юнит тестирование в Web. Как получать пользу и удовольствие

Legacy code

Page 28: Юнит тестирование в Web. Как получать пользу и удовольствие

Пример

Page 29: Юнит тестирование в Web. Как получать пользу и удовольствие

Мы решаем 100% кода покрывать юнит тестами!

• mail слишком сложно тестировать• При тестировании каждого аспекта будет выполняться много

ненужного кода• Тест метода будет объемным

Page 30: Юнит тестирование в Web. Как получать пользу и удовольствие

Какие есть проблемы в коде?

Явные проблемы:

•$user->setUsername($usermame);•if (!$form->isValid()) ; <--•$form – неинициализированная переменная. Нужно $this->formНеявные проблемы:•Большая связность кода•Быстро растущий метод

== Сложная поддержка

Page 31: Юнит тестирование в Web. Как получать пользу и удовольствие

Исправленный пример

Page 32: Юнит тестирование в Web. Как получать пользу и удовольствие

Спасибо за внимание

• Задавайте вопросы

• Пишите мне– Email: [email protected]– Skype: s.ryabenko