slides_thinkphp



slides_thinkphp

0 0


slides_thinkphp


On Github DavertMik / slides_thinkphp

О тестировании вцелом и о Codeception в частности

Обо мне

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

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

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

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

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

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

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

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

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

Best Practices

  • Отделить дополнительный код от теста
  • Отделить конфигурацию от теста
  • Делать тесты читабельными (и компактными)
  • Выносить повторяющиеся данные/код в общие файлы
  • Помнить о классах эквивалентности

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

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

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

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

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

...Опыт Google

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

https://skillsmatter.com/skillscasts/5008-10-years-of-doing-bdd-all-wrong

Test Driven Development

TDD || BDD || null

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

Тестирование Веб-Сайтов

  • GET/POST запросы
  • Веб-интерфейс
  • API

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

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

Continuous Integration

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

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

PHPUnit

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

PHPSpec

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

Behat

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

Codeception

Компоненты

  • PHPUnit
  • Symfony Components (BrowserKit, DomCrawler)
  • Guzzle
  • WebDriver
  • Mink

Модули

  • PhpBrowser
  • WebDriver
  • Фреймворки (Symfony2, Laravel, Yii)
  • API: REST, SOAP, XML-RPC
  • Db, Mongo, Redis
  • Очереди: AMQP, Beanstalk, ...

Пример реального теста

public function viewPlan(WebGuy $I)
{    
  // создать начальные данные
  $this->planId = $I->createPlan(['name' => 'plan'.sq(1)]); 
  $I->amOnPage('/plans'); // перейти на страницу
  $I->expect('only one result is 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
  • Единое API для модулей
  • Модули, решающие 90% повседневных задач

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

  • Меня зовут Михаил Боднарчук или @davert (в Твиттере) или @DavertMik (это на Гитхабе).

  • Если захотите узнать больше про Codeception, то это очень даже несложно, просто посетите http://codeception.com.

  • А также я с радостью отвечу на ваши вопросы!