Slide 1

Slide 1 text

Автоматизация тестирования с Codeception

Slide 2

Slide 2 text

Я • Боднарчук Михаил • Веб разработчик (PHP с 2004, Ruby с 2008) • Автор Codeception • @davert

Slide 3

Slide 3 text

Тестирование Ручное Автоматизированное

Slide 4

Slide 4 text

Когда автоматизировать? • Частые изменения в проекте • Много изменений в проекте • Много разработчиков, мало тестировщиков.

Slide 5

Slide 5 text

Пишем тесты? • Что-что? • А… Это… Лениво. • А… Не… Сложно. • Да, как-то пытался писать юнит-тесты. • Не, у нас для этого есть QA отдел. • Да!

Slide 6

Slide 6 text

С чего начать? • Тестирования функционала. • Типичные пользовательские сценарии. • API

Slide 7

Slide 7 text

Противопоказано • А давайте напишем юнит тест! • Как же? Юнит тесты это круто! • Нам надо 100% покрытия кода!

Slide 8

Slide 8 text

Казалось бы… при чем тут Codeception…

Slide 9

Slide 9 text

Существующие решения • PHPUnit • ? • ? • ? • ? • ? • Selenium

Slide 10

Slide 10 text

Чего не хватает? • Простоты написания тестов • Простоты чтения тестов • Простоты отладки тестов

Slide 11

Slide 11 text

Codeception • Простой но мощный фреймворк • Основан на PHPUnit • Open Source • Хорошо документирован • Версия 1.1.3 • PHP >= 5.3

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Чуваки • Тестирование с «человеческим лицом» • Действия от лица людей. • Минимум технических терминов.

Slide 14

Slide 14 text

Чуваки • WebGuy – тестирует работу сайта вцелом • Приемочное тестирование. • Олицетворяет менеджера

Slide 15

Slide 15 text

Чуваки • TestGuy - проверяет работу зная внутренности системы. • Обеспечивает функциональное тестирование. • Проф. тестировщик.

Slide 16

Slide 16 text

Чуваки • CodeGuy – тестирует код. • Юнит-тестирование. • Разработчик.

Slide 17

Slide 17 text

WebGuy • Selenium RC • WebDriver • ZombieJS • PhpBrowser

Slide 18

Slide 18 text

Типичный тест • $I = new WebGuy($scenario); • $I->click('Login'); • $I->fillField('username','davert'); • $I->fillField('password','gfhjkm'); • $I->click('Submit'); • $I->see('Hello, Davert!');

Slide 19

Slide 19 text

Написание теста

Slide 20

Slide 20 text

Как находятся элементы? • $I->click('Login'); - ? • $I->fillField('username','davert'); - ?

Slide 21

Slide 21 text

Я же умный, красивый, в меру упитанный фреймворк ну в полном расцвете сил!

Slide 22

Slide 22 text

Поиск элемента на странице • По имени (name, value, alt, …) • По лейблу • По CSS селектору • По Xpath (с версии 1.1)

Slide 23

Slide 23 text

Результаты теста

Slide 24

Slide 24 text

Команды: 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’);

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

TestGuy • Symfony2 • Zend Framework • Kohana • Social Engine • MySQL, PostgreSQL • ORM • Ожидается Drupal 8

Slide 27

Slide 27 text

Интеграция с фреймворками • Не обращаемся к веб-серверу. • Работает гораздо быстрее. • Stack trace и отладочная информация.

Slide 28

Slide 28 text

CodeGuy • Простые тесты с PHPUnit • Комплексные тесты в виде сценариев • Доступны все модули

Slide 29

Slide 29 text

Типичный тест function testSavingUser() { $user = new User(); $user->setName('Miles'); $user->setEmail(‘[email protected]'); $user->save(); $this->codeGuy->seeInDatabase('users',array( 'name' => 'Miles‘, ‘email' => ‘[email protected]‘, )); } // интеграционный тест

Slide 30

Slide 30 text

Сценарный тест 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'); } // юнит тест

Slide 31

Slide 31 text

Отладка • Все промежуточные данные выводятся на экран • При сбое делается скриншот последней страницы • Модуль WebDebug

Slide 32

Slide 32 text

Очистка • Тесты должны работать в изоляции • Тесты не должны гадить друг другу • Очистка кеша, данных, сессий…

Slide 33

Slide 33 text

Очистка БД • перезаливать sql-дамп БД. • использовать SQLite. • через rollback в транзакции.

Slide 34

Slide 34 text

Модули • Веб (Selenium, ZombieJS, PhpBrowser) • API (REST, SOAP) • MVC Frameworks (Symfony, Zend, …) • Database (MySQL, PostgreSQL, …) • …. всего 19

Slide 35

Slide 35 text

Когда модулей мало • Пишем свои! • Helper-код • public function seeReceivedSms() { • $messages = $this->_getOutgoingMessages(); • $this->assertGreaterThen(0, $messages->count()); • } • Тест • $I->click("Confirm by Sms"); • $I->seeReceivedSms();

Slide 36

Slide 36 text

Continuous Integration • Автоматический запуск тестов • «Письма счастья» при поломках • Раннее выявление ошибок

Slide 37

Slide 37 text

Интеграция с CI • Экспорт HTML, XML, JSON, TAP • Jenkins, Bamboo, etc… • Красивые HTML репорты

Slide 38

Slide 38 text

Репорт

Slide 39

Slide 39 text

Подходит для 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’);

Slide 40

Slide 40 text

Hardcore BDD

Slide 41

Slide 41 text

Документация • http://codeception.com • Guides – всё о фреймворке (9 глав) • Модули – все функции • Reference –команды, опции.

Slide 42

Slide 42 text

Вопросы? • http://Codeception.com • https://github.com/codeception/codeception • Skype: Davert.ua • [email protected] • Twitter: @davert • Мой мастер-класс на http://atdays.com