Михаил Боднарчук: Особенности тестирования php...
TRANSCRIPT
ОСОБЕННОСТИТЕСТИРОВАНИЯPHP ПРОЕКТОВ
ОБО МНЕ
Живу в КиевеВеб-разработчик: PHP, Rails, EmberJSРазрабатываю Codeception и другие прикольныепроекты
ТЕСТИРОВАНИЕРучное vs Автоматизированое
АВТОМАТИЗИРОВАНОЕ
Проверяет типичные сценарии взаимодействияОценивает работоспособность системы в текущиймомент времениСистема проверяется изнутри и снаружи
Criteria Black Box Testing White Box Testing
Definition Black Box Testing is a software testingmethod in which the internal structure/design/ implementation of the itembeing tested is NOT known to the tester
White Box Testing is a software testingmethod in which the internalstructure/ design/ implementation ofthe item being tested is known to thetester.
LevelsApplicable To
Mainly applicable to higher levels oftesting:
Mainly applicable to lower levels oftesting:
Responsibility Generally, independent SoftwareTesters
Generally, Software Developers
ProgrammingKnowledge
Not Required Required
ImplementationKnowledge
Not Required Required
Basis for TestCases
Requirement Specifications Detail Design
Acceptance Testing
System Testing
Unit Testing
Integration Testing
КРИТЕРИИ ТЕСТОВ
ПокрытиеСкорость выполненияПоддержкаЧитабельность
КТО ДОЛЖЕН ТЕСТИРОВАТЬ
ТестировщикиАвтоматизаторыРазработчикиВся командаВсевышний
ПРИ ЧЕМ ТУТ РАЗРАБОТЧИКИ?
они знают что внутри коробкибез них юнит/интеграционные тесты не напишутсяони могут оптимизировать взаимодействие с системойописать свое виденье спецификации через тестразработчики умеют управлять реальностью!
ПОДМЕНА РЕАЛЬНОСТИ: UNIT
Fake, Dummy, Stub - формируют контекстMock, Spy - проверяют поведение
ПОДМЕНА РЕАЛЬНОСТИ: INTEGRATION
Fixtures, Factories - вгрузка тестовых данных
ПОДМЕНА РЕАЛЬНОСТИ: ACCEPTANCE
Использование API для создание/очистки данныхПерехват и тестирование отправки почты (Mailcatcher)
СТРУКТУРА ТЕСТА
условиедействиепроверка (assertion)
BEST PRACTICES
Отделить дополнительный код от тестаОтделить конфигурацию от тестаДелать тесты читабельными (и компактными)Выносить повторяющиеся данные/код в общие файлыПомнить о классах эквивалентности
ЧТО ПЛОХО ТЕСТИРУЕТСЯ
Асинхронные запросыЗапросы к стронним сервисамРабота с реальными данными
ЦЕНА ОШИБКИ И РЕГРЕССИОННЫЕ ТЕСТЫ
BEHAVIOR DRIVEN DEVELOPMENT
Тесно связана с тестированиемОписывает менеджмент команды и комуникации сзаказчикомВсе должны говорить на одном языке
Story: Account Holder withdraws cash
As an Account HolderI want to withdraw cash from an ATMSo that I can get money when the bank is closed
Scenario 1: Account has sufficient fundsGiven the account balance is $100 And the card is valid And the machine contains enough moneyWhen the Account Holder requests $20Then the ATM should dispense $20 And the account balance should be $80 And the card should be returned
BEHAVIOUR DRIVEN DEVELOPMENT IS ABOUTCONVERSATION NOT TOOLING
https://skillsmatter.com/skillscasts/5008-10-years-of-doing-bdd-all-wrong
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 languageMink (Selenium, Goutte, etc)
CODECEPTION
КОМПОНЕНТЫ
PHPUnitSymfony Components (BrowserKit, DomCrawler)GuzzleWebDriverMink
МОДУЛИ
PhpBrowserWebDriverФреймворки (Symfony2, Laravel, Yii)API: REST, SOAP, XML-RPCDb, Mongo, RedisОчереди: AMQP, Beanstalk, ...
ПРИМЕР РЕАЛЬНОГО ТЕСТА<?phppublic 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 11 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