slides_uzh



slides_uzh

0 0


slides_uzh

Slides for Uzhrogod Meetup

On Github DavertMik / slides_uzh

Тестирование в PHP

Обо мне

  • Живу в Киеве, выступаю на конференциях (Framework Days, DevConf, IstanbulPHP)
  • Веб-разработчик: PHP, Rails, EmberJS, NodeJS
  • Разрабатываю Codeception, CodeceptJS и другие прикольные проекты

Тестирование

Ручное vs Автоматизированое

Автоматизированое

  • Проверяет типичные сценарии взаимодействия
  • Оценивает работоспособность системы в текущий момент времени
  • Система проверяется изнутри и снаружи

При чем тут разработчики?

  • они знают что внутри коробки
  • без них юнит/интеграционные тесты не напишутся
  • они могут оптимизировать взаимодействие с системой
  • описать свое виденье спецификации через тест
  • разработчики умеют управлять реальностью!

Подмена Реальности: Unit

  • Fake, Dummy, Stub - формируют контекст
  • Mock, Spy - проверяют поведение

Подмена Реальности: Integration

  • Fixtures, Factories - вгрузка тестовых данных

Подмена Реальности: Acceptance

  • Использование API для создание/очистки данных
  • Перехват и тестирование отправки почты (Mailcatcher)

Что плохо тестируется

  • Асинхронные запросы
  • Запросы к стронним сервисам
  • Работа с реальными данными

Цена ошибки и регрессионные тесты

Структура Теста

  • условие
  • действие
  • проверка (assertion)

Паттерны тестирования

PageObject

  • используется в приемочных/функциональных тестах
  • отвечает за взаимодействие с типом веб-страниц
  • сожержит локаторы
  • сценарии взаимодействия со страницей

StepObject

  • используется в приемочных/функциональных тестах
  • типичные сценарии взаимодействия с ресурсом
  • группирует последовательность шагов

Покрытие кода

  • Метрика указывающая наличие белых пятен
  • Сама по себе цифра отчета покрытия не представляет ценности
  • Нет смысла стремиться к 100% покрытию

Continuous Integration

  • Автоматизирует запуск тестов
  • Максимально близкий к production среде
  • Предоставляет отчет и динамику развития проекта

Тестовые Фреймворки

PHPUnit

  • Старичок-толстячок, он же стандарт де-факто
  • Монолитность
  • Два движка для мокинга (почему не 3?)
  • Отчеты в формате JUnit, HTML, ... и покрытие кода
  • И ещё 100500 (малоиспользуемых) фич

PHPSpec

  • TDD фреймворк
  • Генерация классов через тест
  • Описание связей через моки
  • Не заменяет PHPUnit
  • Для разработки, а не для тестирования

Behat

  • BDD-фреймворк
  • Ubiquitous language
  • Mink (Selenium, Goutte, etc)

Codeception

Простой тест

<?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'); 
}

Тестирование REST

  • отправка запроса
  • проверка ответа на равенство строке
  • проверка структуры данных
  • проверка на вхождение определенных значений
<?php
$I->sendPOST('/users', ['name' => 'davert', 'email' => 'davert@codeception.com']);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
$I->seeResponseMatchesJsonType([
  'user' => [
    'name' => 'string',
    'email' => 'string:email',
    'created_at' => 'datetime'
]]);3
$I->seeResponseContainsJson([
    'user' => [
      'name' => 'davert',
      'email' => 'davert@codeception.com',
]]);

Так почему же Codeception?

  • One tool to rule them all
  • Модули, решающие 90% повседневных задач
  • Единое API $I->
  • Поощрает внедрение best practices
  • Постоянно развивается
  • Более 1.5M загрузок на Packagist

Что ожидается в 2.2

  • Поддержка новых форматов: Gherkin, Yaml
  • Модуль для AngularJS
  • Включение в состав FactoryMuffin
  • PHP 5.4 compatible

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

  • Меня зовут Михаил Боднарчук
  • Twitter: @davert
  • Skype: davert.ua
  • Больше про Codeception на сайте http://codeception.com.