slides_hackntell



slides_hackntell

0 0


slides_hackntell


On Github DavertMik / slides_hackntell

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

Test Driven Development

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)

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

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

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

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

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