О тестировании вцелом и о 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
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)
Компоненты
- 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.
-
А также я с радостью отвечу на ваши вопросы!