Hack'n'TellPHP
Тестирование в PHP
грабли, велосипеды, костыли, или как не превратить ваши тесты в сарай
Hack'n'Tell 2015
Обо мне
- Живу в Киеве
- Веб-разработчик: PHP, Rails, EmberJS
- Разрабатываю Codeception и другие прикольные проекты
Тестирование
Ручное vs Автоматизированое
Автоматизированое
- Проверяет типичные сценарии взаимодействия
- Оценивает работоспособность системы в текущий момент времени
- Система проверяется изнутри и снаружи
При чем тут разработчики?
- они знают что внутри коробки
- без них юнит/интеграционные тесты не напишутся
- они могут оптимизировать взаимодействие с системой
- описать свое виденье спецификации через тест
- разработчики умеют управлять реальностью!
Подмена Реальности: Unit
- Fake, Dummy, Stub - формируют контекст
-
Mock, Spy - проверяют поведение
Подмена Реальности: Integration
- Fixtures, Factories - вгрузка тестовых данных
Подмена Реальности: Acceptance
- Использование API для создание/очистки данных
- Перехват и тестирование отправки почты (Mailcatcher)
Что плохо тестируется
- Асинхронные запросы
- Запросы к стронним сервисам
- Работа с реальными данными
Цена ошибки и регрессионные тесты
Структура Теста
- условие
- действие
- проверка (assertion)
Best Practices
- Отделить дополнительный код от теста
- Отделить конфигурацию от теста
- Делать тесты читабельными (и компактными)
- Не использовать наследование тесткейсов (использовать трейты)
PageObject
- используется в приемочных/функциональных тестах
- отвечает за взаимодействие с типом веб-страниц
- сожержит локаторы
- сценарии взаимодействия со страницей
StepObject
- используется в приемочных/функциональных тестах
- типичные сценарии взаимодействия с ресурсом
- группирует последовательность шагов
Behavior Driven Development
- Тесно связана с тестированием
- Описывает менеджмент команды и комуникации с заказчиком
- Все должны говорить на одном языке
Story: Account Holder withdraws cash
As an Account Holder
I want to withdraw cash from an ATM
So that I can get money when the bank is closed
Scenario 1: Account has sufficient funds
Given the account balance is $100
And the card is valid
And the machine contains enough money
When the Account Holder requests $20
Then the ATM should dispense $20
And the account balance should be $80
And the card should be returned
TDD || BDD || null
- Тестирование != TDD || BDD
- Внедрение BDD зависит от менеджера и заказчика
- Внедрение TDD зависит от команды разработчиков
Покрытие кода
- Метрика указывающая наличие белых пятен
- Сама по себе цифра отчета покрытия не представляет ценности
- Нет смысла стремиться к 100% покрытию
Continuous Integration
- Автоматизирует запуск тестов
- Максимально близкий к production среде
- Предоставляет отчет и динамику развития проекта
PHPUnit
- Старичок-толстячок, он же стандарт де-факто
- Монолитность
- Два движка для мокинга (почему не 3?)
- Отчеты в формате JUnit, HTML, ... и покрытие кода
- И ещё 100500 (малоиспользуемых) фич
PHPSpec
- TDD фреймворк
- Генерация классов через тест
- Описание связей через моки
- Не заменяет PHPUnit
- Для разработки, а не для тестирования
Behat
- BDD-фреймворк
- Ubiquitous language
- Mink (Selenium, Goutte, etc)
Простой тест
<?php
$I = new AcceptanceTester($scenario);
$I->amOnPage('/');
$I->click('About');
$I->see('About Team');
$I->seeInTitle('About');
$I->seeCurrentEquals('/about');
Модули
- PhpBrowser
- WebDriver
- Фреймворки (Symfony2, Laravel, Yii)
- API: REST, SOAP, XML-RPC
- Db, Mongo, Redis
- Очереди: AMQP, Beanstalk, ...
Пример реального теста
<?php
public function viewPlan(AcceptanceTester $I, \Page\Plan $planPage)
{
// создать начальные данные
$this->planId = $planPage->createPlan(['name' => 'plan'.sq(1)]);
$I->amOnPage('/plans'); // перейти на страницу
$I->expect('only one result i s matched'); // комментарий
$I->see('Displaying 1-1 of 1 result.','.summary'); // проверить наличие
$I->click($planPage->viewButton); // использовать PageObject
$I->see('plan'.sq(1).' Details', 'h1');
}
Так почему же Codeception?
- One tool to rule them all
- Модули, решающие 90% повседневных задач
- Единое API $I->
- Поощрает внедрение best practices
- Постоянно развивается
- более 1M загрузок на Packagist
Спасибо за внимание
- Меня зовут Михаил Боднарчук
- Twitter: @davert
- Skype: davert.ua
- Больше про Codeception на сайте http://codeception.com.