Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
BEHATKonrad Masalskikonradmas@gmail.com
Behaviour driven developmentBehaviour driven development (BDD)• opiera się na Test Driven Development (TDD)• metodyka “out...
BDD stwarza wspólne słownictwo dla analityka,testera, developera oraz biznesu, abywyeliminować niejednoznaczności iniezroz...
Podział BDDSpecBDD• narzędzie do rozwoju specyfikacji dla niskiego  poziomu implementacji części i komunikacji pomiędzy  n...
FeatureFunkcjonalność jest opisana przez plik <my-feature.feature> - zawiera dokładnie jednąfunkcjonalność.Feature jest zb...
BankomatAs a XI want Yso that ZFeature: Customer withdraws cash As a customer, I want to withdraw cash from an ATM, so tha...
Jest kilka scenariuszy do rozważenia:• konto może mieć środki• konto może być na debecie, ale w limicie debetu• konto może...
Scenario: Account is in credit Given the account is in credit   And the card is valid   And the dispenser contains cash Wh...
• Jeżeli coś nie jest opisane w pliku .feature to nie  znaczy, że ta część aplikacji jest nadmiarowa  albo powinna być usu...
Behat w praktyceNależy dodać do composer.json następujące linijki:{    ...    "require": {       ...      "behat/symfony2-...
W katalogu głównym trzeba stworzyć plikbehat.ymldefault:  extensions:    BehatSymfony2ExtensionExtension:           mink_d...
Rozpoczęcie pracyphp bin/behat init @AcmeDemoBundle(php vendorbehatbehatbinbehatinit @AcmeDemoBundle)Po wykonaniu komendy ...
Pierwszy plik .feature• Załóżmy, że w naszej aplikacji trzeba  zaimplementować funkcję logowania, aby  umożliwić dostęp za...
Feature: Login  In order to have access to the wide functionalityof application As a guest I need to login Scenario: Going...
Scenario: Passing right values willlogin    Given there is user "user" withpassword "userpass" and role"ROLE_USER"     And...
Testujemy czy napisany kod spełnia napisaneprzez nas feature:php vendorbehatbehatbinbehat@AcmeDemoBundlesecurityBehat zwra...
Rezultaty wykonywania kroków• Success• Undefinied• Pending• Failure• Skipped• Ambigous• Redundant
/**     * @Given /^there is user "([^"]*)" with password"([^"]*)" and role "([^"]* )"$/      */    public function thereIs...
MinkMink symuluje interakcje przeglądarki z aplikacją.Aby pracować z narzędziem Mink należy zmienićkod w pliku FeatureCont...
thereIsUserWithPasswordAndRole() ciąglewymaga zaimplementowaniaDodanie do konstruktora FeatureContextjednej linijkipublic ...
<?phpnamespace AcmeDemoBundleFeaturesContext;use BehatMinkExtensionContextMinkContext,    BehatBehatExceptionPendingExcept...
Schemat pracy w metodyce BDD jestnastępujący: należy napisać się test, a następnieprzetestować system oraz w razie potrzeb...
Feature: Login  In order to have access to the wide functionality ofapplication    As a guest    I need to login    Backgr...
Scenario outline: Going to welcome pagewill show personalized welcome message    Given I am logged in as <user> withpasswo...
Feature: Welcome text  In order to have personalized front page of application  As a user  I need to go to welcome page  B...
Co dalej?We wrześniu 2012 na konferencji SymfonyLive wLondynie Konstantin Kudryashov (twórca Behat)oraz Marcello Duarte (p...
Upcoming SlideShare
Loading in …5
×

Behat

1,327 views

Published on

Published in: Technology
  • Be the first to comment

Behat

  1. 1. BEHATKonrad Masalskikonradmas@gmail.com
  2. 2. Behaviour driven developmentBehaviour driven development (BDD)• opiera się na Test Driven Development (TDD)• metodyka “outside-in”• Każda funkcjonalność jest ujęta, jako historia (story), która definiuje zakres funkcjonalności razem z kryterium akceptacyjnym.
  3. 3. BDD stwarza wspólne słownictwo dla analityka,testera, developera oraz biznesu, abywyeliminować niejednoznaczności iniezrozumienie pojawiające się w rozmowachmiędzy nimi.
  4. 4. Podział BDDSpecBDD• narzędzie do rozwoju specyfikacji dla niskiego poziomu implementacji części i komunikacji pomiędzy nimi.• ewolucja zwykłych testów jednostkowych.StoryBDD• tworzenie czytelnych dla człowieka, skierowanych dla biznesu opisów zachowań.• ewolucja DDD i testów funkcjonalnych.• z StoryBDD pisze się scenariusze dla interesariuszy
  5. 5. FeatureFunkcjonalność jest opisana przez plik <my-feature.feature> - zawiera dokładnie jednąfunkcjonalność.Feature jest zbiorem przypadków zwanych“scenariuszami” (scenario). Każdy scenariuszzdefiniowany jest przez: Context (Given) Zdarzenia (When) Oczekiwany rezultat (Then)
  6. 6. BankomatAs a XI want Yso that ZFeature: Customer withdraws cash As a customer, I want to withdraw cash from an ATM, so that I dont have to wait in line at the bank.
  7. 7. Jest kilka scenariuszy do rozważenia:• konto może mieć środki• konto może być na debecie, ale w limicie debetu• konto może mieć przekroczony limit debetu• jak konto ma środki, ale wypłata sprawia, że będzie przekroczony limit debetu• bankomat nie ma wystarczająco gotówki
  8. 8. Scenario: Account is in credit Given the account is in credit And the card is valid And the dispenser contains cash When the customer requests cash Then ensure the account is debited And ensure cash is dispensed And ensure the card is returned
  9. 9. • Jeżeli coś nie jest opisane w pliku .feature to nie znaczy, że ta część aplikacji jest nadmiarowa albo powinna być usunięta – to po prostu znaczy, że ta część nie jest ważna dla biznesu, chociaż część kodu nie jest ważna dla niego to ciągle może być ona ważną częścią aplikacji.• Pliki *.feature to nie są testy. Są to opisy funkcjonalności projektu. Behat daje możliwość (dzięki definicjom kroków) automatycznego sprawdzania, kiedy te funkcjonalności są zaimplementowane.
  10. 10. Behat w praktyceNależy dodać do composer.json następujące linijki:{ ... "require": { ... "behat/symfony2-extension": "*", "behat/mink-extension": "*", "behat/mink-browserkit-driver" }, "config": { "bin-dir": "bin/" }, ...}
  11. 11. W katalogu głównym trzeba stworzyć plikbehat.ymldefault: extensions: BehatSymfony2ExtensionExtension: mink_driver: true BehatMinkExtensionExtension: default_session: symfony2
  12. 12. Rozpoczęcie pracyphp bin/behat init @AcmeDemoBundle(php vendorbehatbehatbinbehatinit @AcmeDemoBundle)Po wykonaniu komendy Behat tworzy folderFeatures a w nim folder Context z plikiemFeatureContext.php w srcAcmeDemoBundle.
  13. 13. Pierwszy plik .feature• Załóżmy, że w naszej aplikacji trzeba zaimplementować funkcję logowania, aby umożliwić dostęp zalogowanym użytkownikom do szerszej części serwisu.• Należy utworzyć pierwszy plik .feature. Dobrą praktyką jest grupowanie plików .feature dotyczących tej samej funkcjonalności w specjalnym folderze tej funkcjonalności. W folderze srcAcmeDemoBundleFeatures utworzony został folder security a w nim plik login.feature:
  14. 14. Feature: Login In order to have access to the wide functionalityof application As a guest I need to login Scenario: Going to login page will show login form Given there is user "user" with password"userpass" and role "ROLE_USER" And I am on „demo/secured/login" Then I should see "Username" in the"label[for=username]" element And I should see "Password" in the"label[for=password]" element And I should see an "input[type=submit]"element
  15. 15. Scenario: Passing right values willlogin Given there is user "user" withpassword "userpass" and role"ROLE_USER" And I am on „demo/secured/login" When I fill in "Username" with"user" And I fill in "Password" with"userpass" And I press "Login" Then I should be on "/"
  16. 16. Testujemy czy napisany kod spełnia napisaneprzez nas feature:php vendorbehatbehatbinbehat@AcmeDemoBundlesecurityBehat zwraca wynik:2 scenarios (2 undefined)11 steps (11 undefined)0m0.165s
  17. 17. Rezultaty wykonywania kroków• Success• Undefinied• Pending• Failure• Skipped• Ambigous• Redundant
  18. 18. /** * @Given /^there is user "([^"]*)" with password"([^"]*)" and role "([^"]* )"$/ */ public function thereIsUserWithPasswordAndRole($arg1,$arg2, $arg3) { throw new PendingException(); } /** * @Given /^I am on "([^"]*)"$/ */ public function iAmOn($arg1) { throw new PendingException(); }
  19. 19. MinkMink symuluje interakcje przeglądarki z aplikacją.Aby pracować z narzędziem Mink należy zmienićkod w pliku FeatureContext.php na:class FeatureContext extendsMinkContext implementsKernelAwareInterface
  20. 20. thereIsUserWithPasswordAndRole() ciąglewymaga zaimplementowaniaDodanie do konstruktora FeatureContextjednej linijkipublic function __construct(array $parameters){ $this->parameters = $parameters; $this->useContext(guest, newGuestContext);}
  21. 21. <?phpnamespace AcmeDemoBundleFeaturesContext;use BehatMinkExtensionContextMinkContext, BehatBehatExceptionPendingException;class GuestContext extends MinkContext{ /** * @Given /^there is user "([^"]*)" with password"([^"]*)" and role "([^"]*)"$/ */ public function thereIsUserWithPasswordAndRole($arg1,$arg2, $arg3) { throw new PendingException(); }}
  22. 22. Schemat pracy w metodyce BDD jestnastępujący: należy napisać się test, a następnieprzetestować system oraz w razie potrzebypoprawiać go tak długo aż przejdzie testy.Należy zaimplementować test oraz napisać koduprogramu. Po przetestowaniu programu Behatzwraca wynik:2 scenarios (2 passed)11 steps (11 passed)0m1.682sSukces!
  23. 23. Feature: Login In order to have access to the wide functionality ofapplication As a guest I need to login Background: Given there is user "user" with password "userpass" and role"ROLE_USER" And I am on "demo/secured/login" Scenario: Going to login page will show login form Then I should see "Username" in the "label[for=username]"element And I should see "Password" in the "label[for=password]"element And I should see an "input[type=submit]" element…
  24. 24. Scenario outline: Going to welcome pagewill show personalized welcome message Given I am logged in as <user> withpassword <password> And I am on "/" Then I should see <message> Examples: | user | password | message | | user | userpass | Hello user! | | user1 | userpass1 | Hello user1! |
  25. 25. Feature: Welcome text In order to have personalized front page of application As a user I need to go to welcome page Background: Given there is user "user" with password "userpass" and role"ROLE_USER" And there is user "user1" with password "userpass" and role"ROLE_USER" And I am on "/" Scenario: Going to welcome page will show personalized welcomemessage Given I am logged in as "user" with password "userpass" And I am on "/" Then I should see "Hello user!" Scenario: Going to welcome page will show personalized welcomemessage Given I am logged in as "user1" with password "userpass" And I am on "/" Then I should see "Hello user1!"
  26. 26. Co dalej?We wrześniu 2012 na konferencji SymfonyLive wLondynie Konstantin Kudryashov (twórca Behat)oraz Marcello Duarte (phpspec2) pokazali, w jakisposób pracować z kodem, aby korzystać z„Fullstack BDD”. Slajdy z tego wystąpieniaznajdują się na stronie: http://slidesha.re/RRKQFb,a uzupełnia je wpis na blogu:http://everzet.com/post/31581124270/fullstack-bdd-2012-wrapup.

×