SlideShare a Scribd company logo
1 of 86
Download to read offline
ЧТО ТАКОЕ BDD
И ПРИ ЧЕМ ЗДЕСЬ ПЛЮМБУСЫ
КТО Я
Веб-разработчик (PHP,JS,Ruby) из Киева
Пилю open-source: Codeception, Robo, CodeceptJS
Хожу в горы со своим слоном..
ВЫСТУПАЮ НА
КОНФЕРЕНЦИЯХ
НАПИСАЛ КНИГУ О ПАТТЕРНАХ В
МЫШЛЕНИИ
thinking-patterns.space
(бесплатная, читайте!)
КТО МЫ?
ВЕБ РАЗРАБОТЧИКИ!
ЧТО МЫ ДЕЛАЕМ?
ВЕБ ПРИЛОЖЕНИЯ!
ЛЮБОГО УРОВНЯ
СЛОЖНОСТИ!
ЕСТЬ ТУТ У НАС ОДИН
ЗАКАЗЧИК
КОМПЛЕКСНЫЕ ВЕБ-
ПРИЛОЖЕНИЯ ГОВОРИТЕ?
КАК НАСЧЕТ НЕМНОГО
НЕОБЫЧНОЙ ПРЕДМЕТНОЙ
ОБЛАСТИ?
НЕ ВСЁ ЖЕ ИНТЕРНЕТ-
МАГАЗИНЫ ДЛЯ КИТАЙСКОГО
БАРАХЛА ДЕЛАТЬ
ЛЮБОГО УРОВНЯ
СЛОЖНОСТИ!
НАМ НУЖНО ПРИЛОЖЕНИЕ ПО
СОЗДАНИЮ ПЛЮМБУСОВ
БЕЗ ПРОБЛЕМ!
Но что это?
ЩА ОБЬЯСНЮ
ЧЬТО?
ЧТО ЭТО БЫЛО, ПУХ?
ЧТО НЕПОНЯТНОГО?
ЧТО ВАМ ДЛЯ ЭТОГО НАДО?
НАМ НУЖЕН WEBSERVER
А также PHP, Magento, MySQL, deployment pipeline, webpack, ...
А ЧТО ЭТО?
ЩА ОБЪЯСНИМ!
O.O
ПРОБЛЕМА
спецификация
коммуникация
кейсы
(BDD) BEHAVIOR DRIVEN DEVELOPMENT
Методология разработки
Основана на принципых Agile
Нацелена на продуктивное взаимодействие
С ЧЕМ МЫ АССОЦИИРУЕМ BDD?
Behat
Cucumber
Тестирование
Given/When/Then
ПРИНЦИПЫ BDD
Общение
Вопросы
Сценарии
Примеры
клиент / бизнес-аналитик
разработчик
тестировщик
СЦЕНАРИЙ
Given - контекст
When - событие
Then - ожидаемый результат
ВОПРОСЫ
Как поведет себя система в другом контексте?
Что будет если мы не нажмем на кнопку?
Можно на конкретном примере?
PLUMBUS_PROJECT V0.00001
СТАТУС ПРОЕКТА
комплексная доменная модель
формализация требований
сценарии взаимодействия
FEATURE FILE
Feature: Plumbus
In order to get a plumbus
As a plumbus factory manager
I need to create it via web interfce
Написано в языке Gherkin ↑
Scenario: Make Plumbus
Given first they take the dinglebop
And they smooth it out with a bunch of schleem
And the schleem is then repurposed for later batches
Then they take the dinglebop
And they push it through the grumbo where the fleeb is rubbed
against it
Given It is important that the fleeb is rubbed
because the fleeb has all of the fleeb juice
Then a schlami shows up
And he rubs it
And spits on it
Then they cut the fleeb
Given there are several hizzards in the way
Then the blamfs rub against the chumbles
And the ploobis and grumbo are shaved away
Then that leaves you with a regular old plumbus
ТЕКУЩИЙ СЦЕНАРИЙ
записан слово в слово
не хватает примеров
не хватает конкретных значений
ВОПРОСЫ
сколько нужно дингельбопа?
откуда его взять?
сколько нужно шлима?
что делать, если шлим закончился?
что происходит, если флиб не разрублен?
что делать, если шлами заболел?
ЗАЧЕМ НУЖЕН ПЛЮМБУС???
СЦЕНАРИЙ
Scenario: make plumbus
Given we have a shalmi
And "30" pounds of dinglebop
And "2" pounds of shleem
...
When we smooth out dinglebop with a schleem
And we push it through the grumbo
And shlamy rubs and spits on it
...
Then we have regular old plumbus
СЦЕНАРИЙ
Scenario: make plumbus
Scenario: make plumbus without shlami and fail
Scenario: make plumbus reusing old shleem
РЕАЛИЗАЦИЯ
Неужели мы сможем сделать это в РНР?
Мы же профессионалы!
class PlumbusFactory {
public function make()
{
$dinglebop = new DingleBop();
// re-purpose schleem
try {
$this->_schleem = $this->_blamf
->smoothDinglebopWithSchleem($dinglebop, $this->_schleem
} catch (OutOfSchleemException $e) {
$this->_schleem = $this->_blamf
->smoothDinglebopWithSchleem($dinglebop, new Schleem());
}
$grumbo = new Grumbo();
$grumbo->push($dinglebop);
$this->_blamf->rubDinglebopWithFleeb($grumbo->dinglebop, $this->_
$this->_schlami->rubDingleBop($grumbo->dinglebop);
$this->_schlami->spitOnDingleBop($grumbo->dinglebop);
$this->_blamf->cutFleeb($this->_fleeb);
$this->_blamf->rubAgainstTheChumbles($grumbo);
$this->_blamf->shavePloobis($grumbo);
return new Plumbus($this->_blamf->shaveGrumboAway($grumbo));
}
}
ТЕСТ
public function testPlumbus() {
$this->_dinglebop
->method( 'isPlumbusable' )
->willReturn( true );
$plumbus = new Plumbus( $this->_dinglebop );
$this->assertInstanceOf( Plumbus::class, $plumbus );
} // plumbus
ВОПРОСЫ
что проверяет этот тест?
как он связан со сценарием взаимодействия?
важен ли он?
нужен ли он?
BEHAVIOR TESTING
Scenario == Test
Шаг из User Story = шаг из теста
Example == Specific Test
/**
* @Given we have a shalmi
*/
public function haveShlami()
{
$this->shlami = new Shlami;
}
/**
* @When shlamy rubs and spits on it
*/
public function shlamyActions()
{
$this->shlami->spitOnDingleBop($this->product);
$this->shlami->rubDingleBop($this->product);
}
BDD И ТЕСТИРОВАНИЕ
Позволяет делать значимые тесты
Вся команда знает что делает тест
Заказчик видит текущую работоспособность
системы
ПАТТЕРНЫ И АНТИПАТТЕРНЫ
Плохо: Тест ⇒ Спецификация
Хорошо: Спецификация ⇒ Тест
ПЛОХО
Scenario: go through the service to button "Купить"
Given open mysite.com
When press button with text "Вход в кабинет"
And type to input with name "userName" and text "vasya"
And type to input with name "password" and text "1111"
And press element with value "Войти
BDD - ALL IN ONE
спецификация
разработка
тестирование
ИСТОРИЯ BDD
тесты привязываем к спецификации
названия тестов описывают поведение
str_replace('test', 'should', $testName);
Introducing BDD
А ВЕЗДЕ ЛИ НУЖЕН
BDD?
РАССМОТРИМ 2 СЛУЧАЯ
1. Мы автоматизируем бизнес
2. Наш софт и есть бизнес
МЫ АВТОМАТИЗИРУЕМ БИЗНЕС
Нам надо разобраться в предметной области
Точная реализация доменной модели
Важно, чтобы баги системы не ломали сам
бизнес
Риски: мы работаем с материальными вещами
Воспроизведение типичных бизнес-сценариев
МЫ СОЗДАЕМ БИЗНЕС
Предметная область изучается по ходу развития
Баги системы напрямую ломают бизнес
Риски: мы работаем с виртуальными вещами
Сценарии определяются возможностями системы
ЦЕНА ВНЕДРЕНИЯ
Запись всех спецификаций формальным языком
Разработка примеров работы системы
Участие заказчика в разработке системы
Автоматизация примеров (тестирование)
ЧТО НУЖНО ДЛЯ
BDD?
BDD TOOLS
JUnit+agiledox (Spec) - 2006
JBehave (Story)
RSpec (Spec)
Cucumber (Story)
Behat (Story) - 2010
phpspec (Spec)
Codeception (Story) - 2016
ТЕСТИРОВАНИЕ
User Level: Browser, Selenium Server, WebServer
Domain Level: Business Logic, Models, PHP
CODECEPTION
Full stack testing framework
Поддерживает популярные PHP фреймворки
Тестирование UI через WebDriver
Поддержка Gherkin (с версии 2.2)
ОБЫЧНЫЙ ТЕСТ
$I->amGoingTo('Navigate to Users page in /administrator/');
$I->amOnPage('administrator/users');
$I->expectTo('see Users page');
$I->clickToolbarButton('New');
$I->waitForText('Users: New', '30', ['css' => 'h1']);
$I->fillField('#name', $this->name);
$I->fillField('#username', $this->username);
$I->fillField('#email', $this->email);
$I->fillField('#password', $this->password);
$I->fillField('#password2', $this->password);
$I->clickToolbarButton('Save & Close');
$I->waitForText('Users', '30', ['css' => 'h1']);
$I->see('User successfully saved', '#message-container');
ПОЧЕМУ BDD С CODECEPTION
встроенные инструменты:
Selenium тестирование
тестирование БД
тестирование фреймворков
тестирование очередей
множество форматов (Unit, Gherkin, Cest)
А МОЖНО ПРИМЕР?
ТОЛЬКО МОЖЕТ В ЭТОТ РАЗ КАК-ТО
БЕЗ ПЛЮМБУСОВ?
ЛАДНО, УГОВОРИЛИ... А САЙТЕЦ НА
ДЖУМЛЕ ПОДНЯТЬ СМОЖЕТЕ?
ЛЕГКО, КАК ДВА ПАЛЬЦА В РОЗЕТКУ!
НО ТОЛЬКО ПО BDD ;)
Feature: content
In order to manage content article in the web
As an owner
I need to create modify trash publish and Unpublish content article
Background:
When I Login into Joomla administrator with username "admin" and
And I see the administrator dashboard
Scenario: Create an Article
Given There is a add content link
When I create new content with field title as "Article One" and c
And I save an article
Then I should see the article "Article One" is created
Больше сценариев >
/**
* @When I Login into Joomla administrator with username :arg1 and pa
*/
public function loginIntoJoomlaAdministrator($username, $password)
{
$I = $this;
$I->amOnPage(ControlPanelPage::$url);
$I->fillField(LoginPage::$usernameField, $username);
$I->fillField(LoginPage::$passwordField, $password);
$I->click(LoginPage::$loginButton);
}
/**
* @Then I should see the administrator dashboard
* @When I see the administrator dashboard
*/
public function iShouldSeeTheAdministratorDashboard()
{
$I = $this;
$I->adminPage->waitForPageTitle(ControlPanelPage::$pageTitle);
$I->see(ControlPanelPage::$pageTitle, AdminPage::$pageTitle);
}
/**
* @Given There is a add content link
*/
public function thereIsAAddContentLink()
{
$I = $this;
$I->amOnPage(ArticleManagerPage::$url);
$I->adminPage->clickToolbarButton('New');
}
А КАК ЭТО МОЖЕТ РАБОТАТЬ
В ECOMMERCE?
Feature: Adding a simple product to the cart
In order to select products for purchase
As a Visitor
I want to be able to add simple products to cart
Scenario: Adding a simple product to the cart
Given the store has a product "T-shirt banana" priced at "$12
When I add this product to the cart
Then I should be on my cart summary page
And I should be notified that the product has been successful
And there should be one item in my cart
And this item should have name "T-shirt banana"
пример взят из Sylius
КАК РАБОТАТЬ?
размещаем спецификации в features
делаем symlink с features ⇒ tests/{тип теста}
пишем сценарные шаги для каждого вида тестов
ТИПЫ ТЕСТОВ
Functional - без UI, но с фреймворком
Unit - компоненты системы
Acceptance - UI + WebServer
ln -s $PWD/features ⇒ tests/functional
ln -s $PWD/features ⇒ tests/unit
ln -s $PWD/features ⇒ tests/acceptance
ТЕСТ != FEATURE
Не все тесты - часть спецификации
Баги не являются спецификацией
Описание всех возможных сценариев в Gherkin
добавляет информационный шум
FEATURES ∈ TESTS
Feature описывают предполагаемые сценарии
Regression test описывает проблемные сценарии
Regression test @depends on Feature
РАБОТАЕМ!
Пишем спецификации!
Пишем тесты!
Делаем плюмбусы!
СПАСИБО!
Михаил Боднарчук @davert
Thinking-patterns.space
Codeception BDD Guide
Plumbus-PHP
Joomla BDD Examples
Liz Keogh: BDD
Dan North: What's in a Story
codeception.com/docs/07-BDD
github/remotelyliving/plumbus-php
github/joomla-projects/gsoc16_browser-
automated-tests
lizkeogh.com/behaviour-driven-development/
dannorth.net/whats-in-a-story/

More Related Content

What's hot

М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014Dmytro Zharii
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyDmytro Zharii
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьCodeFest
 
Yeoman generator своими руками
Yeoman generator своими рукамиYeoman generator своими руками
Yeoman generator своими рукамиchaykaborya
 
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...HappyDev
 
Авто-тесты в кармане // SECR-2015
Авто-тесты в кармане // SECR-2015Авто-тесты в кармане // SECR-2015
Авто-тесты в кармане // SECR-2015Dmitry Cheremushkin
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Mikhail Davydov
 
Дмитрий Щадей "Зачем и как мы используем jsLint"
Дмитрий Щадей "Зачем и как мы используем jsLint"Дмитрий Щадей "Зачем и как мы используем jsLint"
Дмитрий Щадей "Зачем и как мы используем jsLint"Yandex
 
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2GoQA
 
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)Dmytro Zharii
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Fwdays
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupTimophy Chaptykov
 
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Fedor Malyshkin
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 

What's hot (20)

М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
 
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 
Генерация программы поведения игрового персонажа по естественно-языковой спец...
Генерация программы поведения игрового персонажа по естественно-языковой спец...Генерация программы поведения игрового персонажа по естественно-языковой спец...
Генерация программы поведения игрового персонажа по естественно-языковой спец...
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
Yeoman generator своими руками
Yeoman generator своими рукамиYeoman generator своими руками
Yeoman generator своими руками
 
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
 
Авто-тесты в кармане // SECR-2015
Авто-тесты в кармане // SECR-2015Авто-тесты в кармане // SECR-2015
Авто-тесты в кармане // SECR-2015
 
Kranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burmaKranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burma
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
 
Дмитрий Щадей "Зачем и как мы используем jsLint"
Дмитрий Щадей "Зачем и как мы используем jsLint"Дмитрий Щадей "Зачем и как мы используем jsLint"
Дмитрий Щадей "Зачем и как мы используем jsLint"
 
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
 
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
Тесты в стиле BDD на C# (Подходы и инструменты; SpecFlow, BDDfy)
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
 
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 

Similar to BDD in Codeception

Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...SQALab
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Agile with cucumber or BDD with fun
Agile with cucumber or BDD with funAgile with cucumber or BDD with fun
Agile with cucumber or BDD with funLeonid Dinershtein
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикIT61
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Anthony Marchenko
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint Kyiv
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Fwdays
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Pavel Tsukanov
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Anton Arhipov
 
Расширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleРасширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleAleksandr Tarasov
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеit-people
 

Similar to BDD in Codeception (20)

Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Agile with cucumber or BDD with fun
Agile with cucumber or BDD with funAgile with cucumber or BDD with fun
Agile with cucumber or BDD with fun
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
JPHP
JPHPJPHP
JPHP
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)
 
Расширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleРасширь границы возможного вместе с Gradle
Расширь границы возможного вместе с Gradle
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
 

More from Avivi Academy

Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиAvivi Academy
 
Як 100-продажів компанії проводити на Upwork?
Як 100-продажів компанії проводити на Upwork?Як 100-продажів компанії проводити на Upwork?
Як 100-продажів компанії проводити на Upwork?Avivi Academy
 
Успіхи та провали в ІТ продажах
Успіхи та провали в ІТ продажахУспіхи та провали в ІТ продажах
Успіхи та провали в ІТ продажахAvivi Academy
 
PHP Ecosystem and Best Practices
PHP Ecosystem and Best PracticesPHP Ecosystem and Best Practices
PHP Ecosystem and Best PracticesAvivi Academy
 
Збираємо HTML на стероїдах
Збираємо HTML на стероїдахЗбираємо HTML на стероїдах
Збираємо HTML на стероїдахAvivi Academy
 
Mobile development with React Native — one year in production
Mobile development with React Native — one year in productionMobile development with React Native — one year in production
Mobile development with React Native — one year in productionAvivi Academy
 

More from Avivi Academy (8)

Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схеми
 
Secure Your Asses
Secure Your AssesSecure Your Asses
Secure Your Asses
 
Як 100-продажів компанії проводити на Upwork?
Як 100-продажів компанії проводити на Upwork?Як 100-продажів компанії проводити на Upwork?
Як 100-продажів компанії проводити на Upwork?
 
Успіхи та провали в ІТ продажах
Успіхи та провали в ІТ продажахУспіхи та провали в ІТ продажах
Успіхи та провали в ІТ продажах
 
PHP Ecosystem and Best Practices
PHP Ecosystem and Best PracticesPHP Ecosystem and Best Practices
PHP Ecosystem and Best Practices
 
BE SOLID
BE SOLIDBE SOLID
BE SOLID
 
Збираємо HTML на стероїдах
Збираємо HTML на стероїдахЗбираємо HTML на стероїдах
Збираємо HTML на стероїдах
 
Mobile development with React Native — one year in production
Mobile development with React Native — one year in productionMobile development with React Native — one year in production
Mobile development with React Native — one year in production
 

BDD in Codeception