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

Preview:

Citation preview

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

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

Определения

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

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

• Польза — …

(c) wikipedia.org

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Factory)

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

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

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

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

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

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

Red Green Refactor

F.I.R.S.T

• Fast

• Isolated

• Repeatable

• Self-Verifying

• Timely

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

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

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

– CruiseControl (PHPUnderControl)– Hudson – TeamCity

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

Inversion of Controll

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

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

Dependency Injection

Service Locator

Mock objects

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

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

• GRASP– Low Coupling– High Cohesion– Abstract Factory

Legacy code

Пример

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

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

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

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

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

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

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

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

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

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

• Пишите мне– Email: ryabenko.sergey@gmail.com– Skype: s.ryabenko

Recommended