slides-minsk



slides-minsk

0 0


slides-minsk


On Github DavertMik / slides-minsk

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

Обо мне

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

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

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

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

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

Кто должен тестировать

  • Тестировщики
  • Автоматизаторы
  • Разработчики
  • Вся команда
  • Всевышний

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

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

Требования к тестам

  • соответствовать спецификации
  • лаконичные
  • легко писать
  • легко читать и обновлять
  • быстро работать

Критерии тестов

  • Покрытие
  • Скорость выполнения
  • Поддержка
  • Читабельность

Что тестировать

  • Всё что важно для бизнеса
  • Domain level
  • User interface
  • API

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

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

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

А можно без тестов?

  • тяжеловатенько... WTF, ASAP, FUKUP
  • используйте Google Analytic
  • мгновенная служба поддержки

You’re probably doing it wrong if testing is taking more than 1/3 of your time. You’re definitely doing it wrong if it’s taking up more than half.

David Heinemeier Hansson

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

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

Continuous Integration

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

Подходы к тестированию

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

Behaviour Driven Development Is About Conversation Not Tooling

Liz Keogh

Подготовка спецификаций

  • Exploration by Example (what it could do)
  • Specification by Example (what it should do)
  • Test by Example (what it does)

Test Driven Development

TDD || BDD || null

  • Тестирование != TDD || BDD
  • Внедрение BDD зависит от менеджера и заказчика
  • Внедрение TDD зависит от команды разработчиков

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

PHPUnit

  • Старичок-толстячок, он же стандарт де-факто
  • Монолитность
  • Поддержка PHP7 (v5.0)
  • Два движка для мокинга
  • Отчеты в формате JUnit, HTML, TeamCity, и покрытие кода

PHPSpec

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

Behat

  • BDD-фреймворк
  • Ubiquitous language
  • Mink (Selenium, Goutte, etc)
  • Поддержка PHP7 + Symfony3 (v3.1)

Codeception

Мультиформатный фреймворк

для приемочных / функциональных / unit и API тестов

История проекта

  • Возник в 2011 году как плагин для symfony 1.4
  • Упрощал тестирования для разработчиков
  • Изначально назывался TestGuy
  • Использовался для тестирования SMS API

Простой тест

<?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.7M загрузок на Packagist

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

Поддержка Gherkin

  • запускайте feature-файлы с остальными тестами
  • feature != test
  • тесты могут зависеть от feature

Модуль для AngularJS

  • Сделан на основе Protractor
  • Легковесная надстройка над WebDriver

Модуль DataFactory

<?php
$I->have('User', ['active' => true]);
  • генерирует данные для теста
  • сохраняет и очищает БД
  • использует ORM (Doctrine, Eloquent, Yii AR, ...)

Dependencies

@depends UserCest:login
@depends Registreation:user should be created
  • Любой тест может зависеть от другого теста
  • Тесты сотируются в нужном порядке

Examples

@example statusCode [200, 400, 404]
@example request ['/valid', 'invalid', 'redirect']
  • Альтернатива к DataProvider
  • Поддерживается во всех форматах тестов

Статус проекта

  • Codeception 2.2 выходит в марте
  • Каждый месяц минорная версия с исправлениями и улучшениями
  • Команда из восьми разработчиков

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

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