Михаил Боднарчук Современное функциональное...
Transcript of Михаил Боднарчук Современное функциональное...
Современное функциональное тестированиес
Codeception
Я
• Боднарчук Михаил• Веб разработчик (PHP с 2004, Ruby с 2008)
• Автор Codeception• @davert
Тестирование
Ручное Автоматизированное
Когда автоматизировать?
• Частые изменения в проекте• Много изменений в проекте• Много разработчиков, мало
тестировщиков.
Пишем тесты?
• Что-что?• А… Это… Лениво.• А… Не… Сложно.• Да, как-то пытался писать юнит-тесты.• Не, у нас для этого есть QA отдел.• Да!
С чего начать?
• Тестирования функционала.• Типичные пользовательские сценарии.• API
Противопоказано
• А давайте напишем юнит тест!• Как же? Юнит тесты это круто!• Нам надо 100% покрытия кода!
Казалось бы…
при чем тут Codeception…
Существующие решения
• PHPUnit• ?• ?• ?• ?• ?• Selenium
Чего не хватает?
• Простоты написания тестов• Простоты чтения тестов• Простоты отладки тестов
Codeception
• Простой но мощный фреймворк• Основан на PHPUnit• Open Source• Хорошо документирован• Версия 1.1.3• PHP >= 5.3
Чуваки
• Тестирование с «человеческим лицом»• Действия от лица людей.• Минимум технических терминов.
Чуваки
• WebGuy – тестирует работу сайта вцелом• Приемочное тестирование.• Олицетворяет менеджера
Чуваки
• TestGuy - проверяет работу зная внутренности системы.
• Обеспечивает функциональное тестирование.
• Проф. тестировщик.
Чуваки
• CodeGuy – тестирует код.• Юнит-тестирование.• Разработчик.
WebGuy
• Selenium RC• WebDriver• ZombieJS• PhpBrowser
Типичный тест
• $I = new WebGuy($scenario);• $I->click('Login');• $I->fillField('username','davert');• $I->fillField('password','gfhjkm');• $I->click('Submit');• $I->see('Hello, Davert!');
Запускаем…Codeception PHP Testing Framework v1.1.3Powered by PHPUnit 3.6.10 by Sebastian Bergmann.
Suite acceptance startedTrying to sign in as a customer (LoginCept.php)Scenario:
* I click “Login"=> Moved to page http://login* I fill field “name",“davert"* I fill field “password",“gfhjkm"* I click “Submit"=> Moved to page http://localhost/user/davert* I see “Hello, Davert" OK
Time: 2 seconds, Memory: 10.25Mb
OK (1 test, 1 assertion)
Написание теста
Как находятся элементы?
• $I->click('Login'); - ?• $I->fillField('username','davert'); - ?
Я же умный, красивый, в меру упитанный фреймворк ну в полном
расцвете сил!
Поиск элемента на странице
• По имени (name, value, alt, …)• По лейблу• По CSS селектору• По Xpath (с версии 1.1)
Результаты теста
Команды: see..
$I->see (‘text on a page’)$I->see(‘heading on page’,’h1’);$I->dontSee(‘Error’);$I->seeInCurrentUrl(‘/user/davert’);$I->seeCheckboxIsChecked(‘#terms’);$I->see(‘XPath’, ‘//h:a/h:span’);
TestGuy
• Symfony2• Zend Framework• Kohana• Social Engine• MySQL, PostgreSQL• ORM• Ожидается Drupal 8
Интеграция с фреймворками
• Не обращаемся к веб-серверу.• Работает гораздо быстрее.• Stack trace и отладочная информация.
CodeGuy
• Простые тесты с PHPUnit• Комплексные тесты в виде сценариев• Доступны все модули
Типичный тест
function testSavingUser(){ $user = new User(); $user->setName('Miles'); $user->setEmail(‘[email protected]'); $user->save(); $this->codeGuy->seeInDatabase('users',array( 'name' => 'Miles‘, ‘email' => ‘[email protected]‘, )); } // интеграционный тест
Сценарный тестfunction create(CodeGuy $I){ $I->wantTo('create new user by name'); $I->haveStub($user = Stub::makeEmptyExcept('User', 'create') ); $user->setName('davert'); $I->executeMethod($user, ‘create’);
$I->expect('user is validated and saved') $I->seeMethodInvoked($user, 'validate') $I->seeMethodInvoked($user, 'save');} // юнит тест
Отладка
• Все промежуточные данные выводятся на экран
• При сбое делается скриншот последней страницы
• Модуль WebDebug
Очистка
• Тесты должны работать в изоляции• Тесты не должны гадить друг другу• Очистка кеша, данных, сессий…
Очистка БД
• перезаливать sql-дамп БД.• использовать SQLite.• через rollback в транзакции.
Модули
• Веб (Selenium, ZombieJS, PhpBrowser)• API (REST, SOAP)• MVC Frameworks (Symfony, Zend, …)• Database (MySQL, PostgreSQL, …)• …. всего 19
Когда модулей мало
• Пишем свои! • Helper-код• public function seeReceivedSms() {• $messages = $this->_getOutgoingMessages();• $this->assertGreaterThen(0, $messages->count());• }
• Тест• $I->click("Confirm by Sms");• $I->seeReceivedSms();
Continuous Integration
• Автоматический запуск тестов• «Письма счастья» при поломках• Раннее выявление ошибок
Интеграция с CI
• Экспорт HTML, XML, JSON, TAP• Jenkins, Bamboo, etc…• Красивые HTML репорты
Репорт
Подходит для BDD
// As a new customer$I->am(‘new customer’);// I want to buy a notebook$I->wantTo(‘buy a notebook’);// In order to spend money faster$I->lookForwardTo(‘spend money faster’);
Hardcore BDD
Документация
• http://codeception.com
• Guides – всё о фреймворке (9 глав)• Модули – все функции• Reference – команды, опции.
Вопросы?
• http://Codeception.com• https://github.com/codeception/codeception• Skype: Davert.ua• [email protected]• Twitter: @davert