Михаил Боднарчук Современное функциональное...

Post on 28-Jun-2015

470 views 6 download

Tags:

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(‘miles@davis.com'); $user->save(); $this->codeGuy->seeInDatabase('users',array( 'name' => 'Miles‘, ‘email' => ‘miles@davis.com‘, )); } // интеграционный тест

Сценарный тест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• davert@ukr.net• Twitter: @davert