Обо мне
- Живу в Киеве, выступаю на конференциях
- Веб-разработчик: 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)
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
Поддержка 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.