BDD   в php      и ZF
Якто      такой  @everzet         senior from-birth web                   developer в
Якто         такой      International speaker      Разработчик Behat, Mink                       http://github.com/everzet...
BDD, Symfony2 эксперты Активные контрибуторы open-source проектов Консультанты, аудиторы, тренерыhttp://knplabs.com
История тестирования
История          UnitTest                     Автоматизация тестов
TDD                     Тесты впередИстория          UnitTest                     Автоматизация тестов
BDD                     Dan North          TDD                     Тесты впередИстория          UnitTest                  ...
BDD ⎯ эволюция TDD
- Эволюция-хренолюция...  Что не так с TDD?
Test-Driven Development
Мы на самом деле говорим о тестах???    Но каким образом тестировать то, чего еще нет?Test-Driven Development
На самом деле, мы говорим о дизайне  Test-Driven Development
BehaviorTest-Driven Development            © 2003, Dan North
BDD   был создан как набор         конвенций поверх    TDD
BDD         был создан как набор                         конвенций поверх    TDDТест-кейсы должы составлять предложенияtes...
BDD          был создан как набор                          конвенций поверх       TDDТест-кейсы должы составлять предложен...
BDD          был создан как набор                          конвенций поверх       TDDТест-кейсы должы составлять предложен...
АССЕРШЕНЫ     тоже TEST-ориентированы               ТЕСТируем     assertEquals($expected, $actual)assertGreaterThan($expec...
АССЕРШЕНЫ     тоже TEST-ориентированы               ТЕСТируем                Описываем     assertEquals($expected, $actual...
История                                         Сначала дизайн Spec BDD UnitTest                 TDD             BDD      ...
Specификационные  BDD Фрэймворки
*Spec  RSpec   by Dave Astels
*Spec  RSpec   by Dave Astels  JSpec   by TJ Holowaychuk
*Spec  RSpec   by Dave Astels  JSpec   by TJ Holowaychuk  Fabulous      by Alex Rudakov
RSpec    # bowling_spec.rb    require bowling    describe Bowling, "#score" do      it "returns 0 for all gutter game" do ...
RSpec       # bowling_spec.rb       require bowling       describe Bowling, "#score" do         it "returns 0 for all gutt...
СЦЕНАРНЫЙBDD            photo by dsearls
СЛ ОВАРЬ           photophoto by dsearls                 by Horia Varlan
о в                         р                    с те             я те           длСЛ ОВАРЬ                             ph...
о в                            р                       с те                я те           длСЛ ОВАРЬ   дл             яа  ...
о в                                                           р                                                      с те ...
для                                                             в       зак                                               ...
для                                                             в       зак                                               ...
ИСКОРЕНИТ множество проблем    ДИЗАЙНА и КОММУНИКАЦИЙ              1                                те ры                 ...
НИК АЦИИК ОММУ                 photo by joshfassbind.com
Story:  In order to [A]  As a [B]  I need [C]
Story:  Чтобы [A]  В качестве [B]  Мне нужно [C]
Story:  Чтобы [A]  В качестве [B]  Мне нужно [C]  A ⎯ добавочное знач. (профит) функционала  B ⎯ профитирующая персона (...
Story:  Чтобы [A]  В качестве [B]                         ⎯ Сила данной конструкции в том, что                          о...
Story:     Поведение story ⎯     это ее приемочный     критерий!     ⎯ если система удовлетворяет все     приемочные кри...
Story:In order to ...As a ...I need ...
Story:In order to ...As a ...I need ...      Given some initial context (the givens),      When an event occurs,      Then...
Story:In order to ...As a ...I need ...      Given some initial context (the givens),      When an event occurs,      Then...
Story:In order to ...As a ...I need ...      Scenario 1:      Given some initial context (the givens),      When an event ...
История                                         Сначала дизайн Spec BDD UnitTest                 TDD             BDD      ...
История                                         Сначала дизайн Spec BDD                                                   ...
GHERKINDSL             photo by isobel.gordon
Story:In order to ...As a ...I need ...      Scenario 1:      Given some initial context (the givens),      When an event ...
Feature: Feature descriptionIn order to ...As a ...I need ...      Scenario: 1st scenario title      Given some initial co...
feature treeFeature: Feature description                             1. featureIn order to ...As a ...I need ...          ...
Feature: Feature descriptionIn order to ...As a ...I need ...      Scenario: 1st scenario title      Given some initial co...
# language: frFonctionnalité: Feature descriptionIn order to ...As a ...I need ...      Scénario: 1st scenario title      ...
# language: ja                  : Feature descriptionIn order to ...As a ...I need ...                    : 1st scenario t...
# language: ruФункционал: Feature descriptionIn order to ...As a ...I need ...      Сценарий: 1st scenario title      Допу...
# language: en-pirateAhoy matey!: Feature descriptionIn order to ...As a ...I need ...      Heave to: 1st scenario title  ...
# language: en-pirateAhoy matey!:     Heave to:     Let go and haul some initial context (the givens)     Blimey! an event...
Приемочные критериидолжны быть исполняемы!
Установка 1. Добавляем pear-channel:  $ pear channel-discover pear.behat.org 2. Ставим:  $ pear install behat/behat 3. Ини...
Установка 1. Добавляем pear-channel:  $ pear channel-discover pear.behat.org 2. Ставим:  $ pear install behat/behat 3. Ини...
# language: ruФункционал: Операции над счетом
# language: ruФункционал: Операции над счетомЧтобы иметь возможность управлять счетомВ качестве клиентаЯ должен иметь возм...
# language: ruФункционал: Операции над счетомЧтобы иметь возможность управлять счетомВ качестве клиентаЯ должен иметь возм...
# language: ruФункционал: Операции над счетомЧтобы иметь возможность управлять счетомВ качестве клиентаЯ должен иметь возм...
1. feature  # language: ru  Функционал: Операции над счетом    Чтобы иметь возможность управлять счетом    В качестве клие...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php Допустим(/^у меня есть банковский счет$/);
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php Допустим(/^у меня есть банковский счет$/,    function() {      ...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function()...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function()...
ТИПЫРЕЗУЛЬТАТОВШАГОВ
ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();
ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не...
ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не...
ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не...
ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не...
ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function()...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function()...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function()...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function()...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function($...
ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/,    function($...
ПРОВЕРЯЕМРЕЗУЛЬТАТЫТо на моем счету должно быть 35$
ПРОВЕРЯЕМРЕЗУЛЬТАТЫТо на моем счету должно быть 35$ <?php $steps->То(/^на моем счету должно быть (d+)$$/,    function($wor...
ПРОВЕРЯЕМРЕЗУЛЬТАТЫТо на моем счету должно быть 35$ <?php $steps->То(/^на моем счету должно быть (d+)$$/,    function($wor...
ОПРЕДЕЛЕНИЯШАГОВ <?php $steps->Допустим(/^у меня есть банковский счет$/,    function($world) {      $world->account = new ...
ОПРЕДЕЛЕНИЯШАГОВ <?php $steps->     Допустим(/^у меня есть банковский счет$/,       function($world) {         $world->acc...
ЧТО ДАЛЬШЕ? 1. Раскрашиваем:  $ behat features/
ЧТО ДАЛЬШЕ? 1. Раскрашиваем:  $ behat features/ 2. Имплементируем
ЧТО ДАЛЬШЕ? 1. Раскрашиваем:  $ behat features/ 2. Имплементируем 3. Раскрашиваем
ЧТО ДАЛЬШЕ? 1. Раскрашиваем:  $ behat features/ 2. Имплементируем 3. Раскрашиваем 4. Описываем новый функционал
ЧТО ДАЛЬШЕ? 1. Раскрашиваем:  $ behat features/ 2. Имплементируем 3. Раскрашиваем 4. Описываем новый функционал
Описание web-      приложений
M!"#
Установка 1. Добавляем pear-channel:  $ pear channel-discover pear.behat.org 2. Ставим:  $ pear install behat/mink-beta
<?phpuse BehatMinkMink,    BehatMinkDriverGoutteDriver,    BehatMinkDriverSahiDriver;// инициализируем Mink и регистрируем...
zF
Новый проект 1. Создаем каркас проекта:  $ cd path/to/project && zf ...
Новый проект 1. Создаем каркас проекта:  $ cd path/to/project && zf ...              Getting Started with               Ze...
Новый проект 1. Создаем каркас проекта:  $ cd path/to/project && zf ... 2. Инициализируем B$%&:  $ behat --init
Новый проект 3. Знакомим B$%& с M!"#:  $ vim behat.yml    # behat.yml    default:      environment:        parameters:    ...
# language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять кол...
# language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять кол...
# language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять кол...
<?php# features/steps/steps.php$steps->Допустим(/^в базе нет альбомов$/,   function($world) {     $albums = new Applicatio...
# language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять кол...
# language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять кол...
http://B$%&.org
http://github.com/behathttp://groups.google.com/behat  http://knplabs.com/trainings
Вопросы?http://github.com/behathttp://groups.google.com/behat  http://knplabs.com/trainings
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)
Upcoming SlideShare
Loading in …5
×

ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)

1,523 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,523
On SlideShare
0
From Embeds
0
Number of Embeds
448
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин Кудряшов)

  1. 1. BDD в php и ZF
  2. 2. Якто такой @everzet senior from-birth web developer в
  3. 3. Якто такой International speaker Разработчик Behat, Mink http://github.com/everzet Разработчик capifony http://card.everzet.com Разработчик jade.php everzet@knplabs.com Контрибьютор Symfony2 framework Разработчик плагинов для symfony и Symfony2 @everzet senior from-birth web developer в
  4. 4. BDD, Symfony2 эксперты Активные контрибуторы open-source проектов Консультанты, аудиторы, тренерыhttp://knplabs.com
  5. 5. История тестирования
  6. 6. История UnitTest Автоматизация тестов
  7. 7. TDD Тесты впередИстория UnitTest Автоматизация тестов
  8. 8. BDD Dan North TDD Тесты впередИстория UnitTest Автоматизация тестов
  9. 9. BDD ⎯ эволюция TDD
  10. 10. - Эволюция-хренолюция... Что не так с TDD?
  11. 11. Test-Driven Development
  12. 12. Мы на самом деле говорим о тестах??? Но каким образом тестировать то, чего еще нет?Test-Driven Development
  13. 13. На самом деле, мы говорим о дизайне Test-Driven Development
  14. 14. BehaviorTest-Driven Development © 2003, Dan North
  15. 15. BDD был создан как набор конвенций поверх TDD
  16. 16. BDD был создан как набор конвенций поверх TDDТест-кейсы должы составлять предложенияtestFindsCustomerById()testFailsForDuplicateCustomers()
  17. 17. BDD был создан как набор конвенций поверх TDDТест-кейсы должы составлять предложенияtestFindsCustomerById()testFailsForDuplicateCustomers()Тест-кейсы должны начинаться со слова “should”shouldFindCustomerById()shouldFailForDuplicateCustomers()
  18. 18. BDD был создан как набор конвенций поверх TDDТест-кейсы должы составлять предложенияtestFindsCustomerById()testFailsForDuplicateCustomers()Тест-кейсы должны начинаться со слова “should”shouldFindCustomerById()shouldFailForDuplicateCustomers()Класс тест-кейсов должен представлять из себя существительное для кейсовclass CustomerTableTest extends PHPUnitTestCase{ /** * @Test */ shouldFindCustomerById() ...}
  19. 19. АССЕРШЕНЫ тоже TEST-ориентированы ТЕСТируем assertEquals($expected, $actual)assertGreaterThan($expected, $actual) assertInstanceOf($class, $actual)
  20. 20. АССЕРШЕНЫ тоже TEST-ориентированы ТЕСТируем Описываем assertEquals($expected, $actual) $actual should be Equals to $expectedassertGreaterThan($expected, $actual) $actual should be GreaterThan $expected assertInstanceOf($class, $actual) $actual should be InstanceOf $class
  21. 21. История Сначала дизайн Spec BDD UnitTest TDD BDD Тесты вперед Автоматизация тестов Dan North
  22. 22. Specификационные BDD Фрэймворки
  23. 23. *Spec RSpec by Dave Astels
  24. 24. *Spec RSpec by Dave Astels JSpec by TJ Holowaychuk
  25. 25. *Spec RSpec by Dave Astels JSpec by TJ Holowaychuk Fabulous by Alex Rudakov
  26. 26. RSpec # bowling_spec.rb require bowling describe Bowling, "#score" do it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should == 0 end end
  27. 27. RSpec # bowling_spec.rb require bowling describe Bowling, "#score" do it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should == 0 end end Пишем СПЕЦИФИКАЦИЮ, а не UnitTEST
  28. 28. СЦЕНАРНЫЙBDD photo by dsearls
  29. 29. СЛ ОВАРЬ photophoto by dsearls by Horia Varlan
  30. 30. о в р с те я те длСЛ ОВАРЬ photophoto by dsearls by Horia Varlan
  31. 31. о в р с те я те длСЛ ОВАРЬ дл яа на ли ти ко в photophoto by dsearls by Horia Varlan
  32. 32. о в р с те я те дл в СЛ ОВАРЬ дл о яа п ер на ло в е ли де тидля ко в photophoto by dsearls by Horia Varlan
  33. 33. для в зак р о азч с те и ко я те в дл в СЛ ОВАРЬ дл о яа п ер на ло в е ли де тидля ко в photophoto by dsearls by Horia Varlan
  34. 34. для в зак р о азч с те 1 и ко я те в дл в СЛ ОВАРЬ дл о яа п ер на ло в е ли де тидля ко в photophoto by dsearls by Horia Varlan
  35. 35. ИСКОРЕНИТ множество проблем ДИЗАЙНА и КОММУНИКАЦИЙ 1 те ры т есзаказчики девелоперы СЛ ОВАРЬ ана лит ики photophoto by dsearls by Horia Varlan
  36. 36. НИК АЦИИК ОММУ photo by joshfassbind.com
  37. 37. Story: In order to [A] As a [B] I need [C]
  38. 38. Story: Чтобы [A] В качестве [B] Мне нужно [C]
  39. 39. Story: Чтобы [A] В качестве [B] Мне нужно [C] A ⎯ добавочное знач. (профит) функционала B ⎯ профитирующая персона (роль) C ⎯ функционал
  40. 40. Story: Чтобы [A] В качестве [B] ⎯ Сила данной конструкции в том, что она требует определения профита от функционала еще до его реализации Мне нужно [C] © Dan North A ⎯ добавочное знач. (профит) функционала B ⎯ профитирующая персона (роль) C ⎯ функционал
  41. 41. Story: Поведение story ⎯ это ее приемочный критерий! ⎯ если система удовлетворяет все приемочные критерии, то она работает верно; если не выполняет - неверно.
  42. 42. Story:In order to ...As a ...I need ...
  43. 43. Story:In order to ...As a ...I need ... Given some initial context (the givens), When an event occurs, Then ensure some outcomes.
  44. 44. Story:In order to ...As a ...I need ... Given some initial context (the givens), When an event occurs, Then ensure some outcomes. Given some initial context (the givens), When an event occurs, Then ensure some outcomes.
  45. 45. Story:In order to ...As a ...I need ... Scenario 1: Given some initial context (the givens), When an event occurs, Then ensure some outcomes. Scenario 2: Given some initial context (the givens), When an event occurs, Then ensure some outcomes.
  46. 46. История Сначала дизайн Spec BDD UnitTest TDD BDD Scenario BDD Сначала анализ Тесты вперед Автоматизация тестов Dan North
  47. 47. История Сначала дизайн Spec BDD + UnitTest TDD BDD Scenario BDD Сначала анализ Тесты вперед Автоматизация тестов Dan North
  48. 48. GHERKINDSL photo by isobel.gordon
  49. 49. Story:In order to ...As a ...I need ... Scenario 1: Given some initial context (the givens), When an event occurs, Then ensure some outcomes. Scenario 2: Given some initial context (the givens), When an event occurs, Then ensure some outcomes.
  50. 50. Feature: Feature descriptionIn order to ...As a ...I need ... Scenario: 1st scenario title Given some initial context (the givens), When an event occurs, Then ensure some outcomes. Scenario: 2nd scenario title Given some initial context (the givens), When an event occurs, Then ensure some outcomes.
  51. 51. feature treeFeature: Feature description 1. featureIn order to ...As a ...I need ... Scenario: 1st scenario title2. scenario Given some initial context (the givens) 3. step When an event occurs ... Then ensure some outcomes ... Scenario: 2nd scenario title2. scenario Given some initial context (the givens) 3. step When an event occurs ... Then ensure some outcomes ...
  52. 52. Feature: Feature descriptionIn order to ...As a ...I need ... Scenario: 1st scenario title Given some initial context (the givens) When an event occurs Then ensure some outcomes Scenario: 2nd scenario title Given some initial context (the givens) When an event occurs Then ensure some outcomes
  53. 53. # language: frFonctionnalité: Feature descriptionIn order to ...As a ...I need ... Scénario: 1st scenario title Etant donné some initial context (the givens) Lorsque an event occurs Alors ensure some outcomes Scénario: 2nd scenario title Etant donné some initial context (the givens) Lorsque an event occurs Alors ensure some outcomes
  54. 54. # language: ja : Feature descriptionIn order to ...As a ...I need ... : 1st scenario title some initial context (the givens) an event occurs ensure some outcomes : 2nd scenario title some initial context (the givens) an event occurs ensure some outcomes
  55. 55. # language: ruФункционал: Feature descriptionIn order to ...As a ...I need ... Сценарий: 1st scenario title Допустим some initial context (the givens) Когда an event occurs То ensure some outcomes Сценарий: 2nd scenario title Допустим some initial context (the givens) Когда an event occurs То ensure some outcomes
  56. 56. # language: en-pirateAhoy matey!: Feature descriptionIn order to ...As a ...I need ... Heave to: 1st scenario title Let go and haul some initial context (the givens) Blimey! an event occurs Aye ensure some outcomes Heave to: 2nd scenario title Let go and haul some initial context (the givens) Blimey! an event occurs Aye ensure some outcomes
  57. 57. # language: en-pirateAhoy matey!: Heave to: Let go and haul some initial context (the givens) Blimey! an event occurs Aye ensure some outcomes Heave to: Let go and haul some initial context (the givens) Blimey! an event occurs Aye ensure some outcomes
  58. 58. Приемочные критериидолжны быть исполняемы!
  59. 59. Установка 1. Добавляем pear-channel: $ pear channel-discover pear.behat.org 2. Ставим: $ pear install behat/behat 3. Инициализируем: $ cd path/to/project && behat --init
  60. 60. Установка 1. Добавляем pear-channel: $ pear channel-discover pear.behat.org 2. Ставим: $ pear install behat/behat 3. Инициализируем: $ cd path/to/project && behat --init +d features - place your *.feature files here +d features/steps - place step definition files here +f features/steps/steps.php - place some step definitions in this file +d features/support - place support scripts and static files here +f features/support/bootstrap.php - place bootstrap scripts in this file +f features/support/env.php - place environment initialization scripts in this file
  61. 61. # language: ruФункционал: Операции над счетом
  62. 62. # language: ruФункционал: Операции над счетомЧтобы иметь возможность управлять счетомВ качестве клиентаЯ должен иметь возможность выполнять операции
  63. 63. # language: ruФункционал: Операции над счетомЧтобы иметь возможность управлять счетомВ качестве клиентаЯ должен иметь возможность выполнять операции Сценарий: Депозирование средств
  64. 64. # language: ruФункционал: Операции над счетомЧтобы иметь возможность управлять счетомВ качестве клиентаЯ должен иметь возможность выполнять операции Сценарий: Депозирование средств Допустим у меня есть банковский счет Если я положу на счет 35$ То на моем счету должно быть 35$
  65. 65. 1. feature # language: ru Функционал: Операции над счетом Чтобы иметь возможность управлять счетом В качестве клиента Я должен иметь возможность выполнять операции Сценарий: Депозирование средств2. scenario Допустим у меня есть банковский счет 3. step Если я положу на счет 35$ ... То на моем счету должно быть 35$ ...
  66. 66. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет
  67. 67. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php Допустим(/^у меня есть банковский счет$/);
  68. 68. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); } );
  69. 69. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); } );
  70. 70. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); ??? } );
  71. 71. ТИПЫРЕЗУЛЬТАТОВШАГОВ
  72. 72. ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();
  73. 73. ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не найдено) определений
  74. 74. ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не найдено) определений3. Ambiguous шаг ⎯ который подпадает под несколько определений
  75. 75. ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не найдено) определений3. Ambiguous шаг ⎯ который подпадает под несколько определений4. Failed шаг ⎯ который throw Exception();
  76. 76. ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не найдено) определений3. Ambiguous шаг ⎯ который подпадает под несколько определений4. Failed шаг ⎯ который throw Exception();5. Skipped шаг ⎯ который идет следом за pending/undefined/failed в сценарии
  77. 77. ТИПЫРЕЗУЛЬТАТОВШАГОВ1. Pending шаг ⎯ который throw new BehatBehatExceptionPending();2. Undefined шаг ⎯ у которого нет (не найдено) определений3. Ambiguous шаг ⎯ который подпадает под несколько определений4. Failed шаг ⎯ который throw Exception();5. Skipped шаг ⎯ который идет следом за pending/undefined/failed в сценарии6. Passed шаг ⎯ который не кидает эксепшенов
  78. 78. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); } );
  79. 79. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); } );Если я положу на счет 35$
  80. 80. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); } );Если я положу на счет 35$ <?php $steps->Если(/^я положу на счет (d+)$$/, function($dollars) { // $dollars === 35 } );
  81. 81. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function() { throw new BehatBehatExceptionPending(); } );Если я положу на счет 35$ <?php $steps->Если(/^я положу на счет (d+)$$/, function($dollars) { // $dollars === 35 } );
  82. 82. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function($world) { throw new BehatBehatExceptionPending(); } );Если я положу на счет 35$ <?php $steps->Если(/^я положу на счет (d+)$$/, function($world, $dollars) { // $dollars === 35 } );
  83. 83. ОПРЕДЕЛЕНИЯШАГОВДопустим у меня есть банковский счет <?php $steps->Допустим(/^у меня есть банковский счет$/, function($world) { $world->account = new BankAccount(); } );Если я положу на счет 35$ <?php $steps->Если(/^я положу на счет (d+)$$/, function($world, $dollars) { $world->account->deposit($dollars); } );
  84. 84. ПРОВЕРЯЕМРЕЗУЛЬТАТЫТо на моем счету должно быть 35$
  85. 85. ПРОВЕРЯЕМРЕЗУЛЬТАТЫТо на моем счету должно быть 35$ <?php $steps->То(/^на моем счету должно быть (d+)$$/, function($world, $balance) { if ($balance !== $world->account->getBalance()) { throw new Exception(Неверный баланс!); } } );
  86. 86. ПРОВЕРЯЕМРЕЗУЛЬТАТЫТо на моем счету должно быть 35$ <?php $steps->То(/^на моем счету должно быть (d+)$$/, function($world, $balance) { if ($balance !== $world->account->getBalance()) { throw new Exception(Неверный баланс!); } } );То на моем счету должно быть 35$ ( using PHPUnit ) <?php $steps->То(/^на моем счету должно быть (d+)$$/, function($world, $balance) { assertEquals($balance, $world->account->getBalance()); } );
  87. 87. ОПРЕДЕЛЕНИЯШАГОВ <?php $steps->Допустим(/^у меня есть банковский счет$/, function($world) { $world->account = new BankAccount(); } ); $steps->Если(/^я положу на счет (d+)$$/, function($world, $dollars) { $world->account->deposit($dollars); } ); $steps->То(/^на моем счету должно быть (d+)$$/, function($world, $balance) { assertEquals($balance, $world->account->getBalance()); } );
  88. 88. ОПРЕДЕЛЕНИЯШАГОВ <?php $steps-> Допустим(/^у меня есть банковский счет$/, function($world) { $world->account = new BankAccount(); } )-> Если(/^я положу на счет (d+)$$/, function($world, $dollars) { $world->account->deposit($dollars); } )-> То(/^на моем счету должно быть (d+)$$/, function($world, $balance) { assertEquals($balance, $world->account->getBalance()); } ) ;
  89. 89. ЧТО ДАЛЬШЕ? 1. Раскрашиваем: $ behat features/
  90. 90. ЧТО ДАЛЬШЕ? 1. Раскрашиваем: $ behat features/ 2. Имплементируем
  91. 91. ЧТО ДАЛЬШЕ? 1. Раскрашиваем: $ behat features/ 2. Имплементируем 3. Раскрашиваем
  92. 92. ЧТО ДАЛЬШЕ? 1. Раскрашиваем: $ behat features/ 2. Имплементируем 3. Раскрашиваем 4. Описываем новый функционал
  93. 93. ЧТО ДАЛЬШЕ? 1. Раскрашиваем: $ behat features/ 2. Имплементируем 3. Раскрашиваем 4. Описываем новый функционал
  94. 94. Описание web- приложений
  95. 95. M!"#
  96. 96. Установка 1. Добавляем pear-channel: $ pear channel-discover pear.behat.org 2. Ставим: $ pear install behat/mink-beta
  97. 97. <?phpuse BehatMinkMink, BehatMinkDriverGoutteDriver, BehatMinkDriverSahiDriver;// инициализируем Mink и регистрируем драйверы$mink = new Mink();$mink->registerDriver(goutte, new GoutteDriver($startUrl), true);$mink->registerDriver(javascript, new SahiDriver($startUrl, firefox));$mink->registerDriver(custom, new MyCustomDriver($startUrl));// выполняем действия в стандартном драйвере$mink->switchToDefaultDriver();$mink->getSession()->getPage()->findLink(Downloads)->click();echo $mink->getSession()->getPage()->getContent();// выполняем действия в javascript (Sahi) драйвере$mink->switchToDriver(javascript);$mink->getSession()->getPage()->findLink(Downloads)->click();echo $mink->getSession()->getPage()->getContent();// выполняем действия в кастомном (MyCustomDriver) драйвере$mink->switchToDriver(custom);$mink->getSession()->getPage()->findLink(Downloads)->click();echo $mink->getSession()->getPage()->getContent();
  98. 98. zF
  99. 99. Новый проект 1. Создаем каркас проекта: $ cd path/to/project && zf ...
  100. 100. Новый проект 1. Создаем каркас проекта: $ cd path/to/project && zf ... Getting Started with Zend Framework By Rob Allen, www.akrabat.com Document Revision 1.7.6 Copyright © 2006, 2010
  101. 101. Новый проект 1. Создаем каркас проекта: $ cd path/to/project && zf ... 2. Инициализируем B$%&: $ behat --init
  102. 102. Новый проект 3. Знакомим B$%& с M!"#: $ vim behat.yml # behat.yml default: environment: parameters: start_url: http://tutorial.zf.dev/ imports: - mink/behat.yml $ vim features/support/bootstrap.php <?php // features/support/bootstrap.php require_once PHPUnit/Autoload.php; require_once PHPUnit/Framework/Assert/Functions.php; require_once mink/autoload.php; $ behat --steps --lang ru
  103. 103. # language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять коллекцией альбомов Сценарий: Добавление альбома Допустим я на странице /index/add Если я ввожу "Pendulum" в поле "Artist" И я ввожу "In Silico" в поле "Title" И нажимаю "Add" То я должен видеть "In Cilico" И я должен видеть "Edit"
  104. 104. # language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять коллекцией альбомов Сценарий: Добавление альбома Допустим я на странице /index/add Если я ввожу "Pendulum" в поле "Artist" И я ввожу "In Silico" в поле "Title" И нажимаю "Add" То я должен видеть "In Cilico" И я должен видеть "Edit"
  105. 105. # language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять коллекцией альбомов Сценарий: Добавление альбома Допустим в базе нет альбомов И я на странице /index/add Если я ввожу "Pendulum" в поле "Artist" И я ввожу "In Silico" в поле "Title" И нажимаю "Add" То я должен видеть "In Silico" И я должен видеть "Edit"
  106. 106. <?php# features/steps/steps.php$steps->Допустим(/^в базе нет альбомов$/, function($world) { $albums = new Application_Model_DbTable_Albums(); $albums->delete(1); });<?php# features/support/bootstrap.php// Конфигурация и инициализация тестовой среды ZF
  107. 107. # language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять коллекцией альбомов Сценарий: Добавление альбома Допустим в базе нет альбомов И я на странице /index/add Если я ввожу "Pendulum" в поле "Artist" И я ввожу "In Silico" в поле "Title" И нажимаю "Add" То я должен видеть "In Silico" И я должен видеть "Edit"
  108. 108. # language: ruФункционал: Альбомы Чтобы иметь представление об исполнителях Как каталогизатор Я должен уметь управлять коллекцией альбомов @javascript Сценарий: Добавление альбома Допустим в базе нет альбомов И я на странице /index/add Если я ввожу "Pendulum" в поле "Artist" И я ввожу "In Silico" в поле "Title" И нажимаю "Add" То я должен видеть "In Silico" И я должен видеть "Edit"
  109. 109. http://B$%&.org
  110. 110. http://github.com/behathttp://groups.google.com/behat http://knplabs.com/trainings
  111. 111. Вопросы?http://github.com/behathttp://groups.google.com/behat http://knplabs.com/trainings

×