Acceptance & Integration Testing With Behat (PBC11)
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Acceptance & Integration Testing With Behat (PBC11)

on

  • 3,571 views

Slides of the talk I gave at PBC11

Slides of the talk I gave at PBC11

Statistics

Views

Total Views
3,571
Views on SlideShare
3,565
Embed Views
6

Actions

Likes
7
Downloads
70
Comments
0

3 Embeds 6

http://www.php-talks.com 3
http://www.docshut.com 2
http://www.slashdocs.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Acceptance & Integration Testing With Behat (PBC11) Presentation Transcript

  • 1. Acceptance & Integration Testing Using Behat Ben Waine Email: ben@ben-waine.co.uk Twitter: @bwaineSaturday, 29 October 11
  • 2. Pair Programming Say hello to the person next to you....Saturday, 29 October 11
  • 3. Set Up USB StickSaturday, 29 October 11
  • 4. Set Up For instant set up: 1) Copy code into a new vhost with the web root pointing at the ‘public’ folder. 2) Uncomment line 13 in: tests/acceptance/features/bootstrap/UIContext.php 3) Install Sahi from the misc folder.Saturday, 29 October 11
  • 5. Set Up Goto: tests/acceptance/ If setting up today run the Behat command using behat.phar eg: php behat.phar --tags demo1 If you have previously set up, run the behat command eg: behat --tags demo1Saturday, 29 October 11
  • 6. Me Software Engineer PHP Developer Sky Bet PHP / MySQL Stack PHPUnit / Selenium / BehatSaturday, 29 October 11
  • 7. Roadmap •Intro To Behaviour Driven Development •Introducing Behat •Gherkin & Steps •API / Service Layer Testing •UI Testing •Phabric - Dynamic Fixture CreationSaturday, 29 October 11
  • 8. joind.in http://joind.in/talk/view/4328Saturday, 29 October 11
  • 9. What Marco Said......Saturday, 29 October 11
  • 10. StoriesSaturday, 29 October 11
  • 11. What is BDD?Saturday, 29 October 11
  • 12. Introducing Behat....Saturday, 29 October 11
  • 13. Resistance is futile.......Saturday, 29 October 11Origins in Rubys cucumber
  • 14. What Does It Test? Scripts API’s Web Pages ModelsSaturday, 29 October 11
  • 15. Integration Testing != Unit TestingSaturday, 29 October 11
  • 16. Anatomy Of A Behat TestSaturday, 29 October 11
  • 17. Saturday, 29 October 11Describes the behaviour in a storyHuman ReadableSamples Later
  • 18. Saturday, 29 October 11PHP that maps to lines of the gherkin.Behat parses gherkin and runs the associatedsteps.
  • 19. Writing Behat Tests $ben > cd /path/to/projects/tests $ben > behat --initSaturday, 29 October 11Bootstrap Behat. Provides you with a structure
  • 20. Writing Behat TestsSaturday, 29 October 11
  • 21. Feature Files Feature: Home Page When visiting the PHPCon site As a site visitor I need to be able to see what ` conferences are coming upSaturday, 29 October 11Name of testDescription of test
  • 22. ScenariosScenario: Get all conferences Given there is conference data in the database When I go to the homepage Then I should see three conferences in a tableSaturday, 29 October 11Scenario.Multiple scenarios in a single feature file
  • 23. Scenarios Given (Some Context) When (Some Event) Then (The Outcome)Saturday, 29 October 11Keywords.Always follow the same formula
  • 24. Given (Some Context) Given there is conference data in the databaseSaturday, 29 October 11Sets up some state or context
  • 25. When (Some Event) When I go to the homepage When I use the findConferences method When I am on "/index.php" When I fill in "search-text" with "PHP"Saturday, 29 October 11Executes whatever it is your testing.A http call, a method invocation, a page load
  • 26. Then (The Outcome) Then I should see three conferences in a table Then I should get a array of three conferences Then I should see "PHPNW"Saturday, 29 October 11An assertion.Has it worked?Are we seeing what we expect to see.
  • 27. ConferenceService.feature Feature: ConferenceService Class In order to display conferences on PHPCon site As a developer I need to be able to retrieve conferences Scenario: Get all conferences Given there is conference data in the database When I use the findConferences method Then I should get a array of three conferences AND it should contain the conference “PHPNW”Saturday, 29 October 11Written By our TESTERS - Fed In From BAsHow is this feature executed?Each step is reusable!MENTION PHP METHODS + ANNOTATIONS!!!!
  • 28. Class Methods & AnnotationsSaturday, 29 October 11Written By our TESTERS - Fed In From BAsHow is this feature executed?Each step is reusable!MENTION PHP METHODS + ANNOTATIONS!!!!
  • 29. / Everybody Stand Back / Behat Knows Regular ExpressionsSaturday, 29 October 11PHP Annotations used to map steps to linesBehat supplies regex.
  • 30. Demo One Behat’s - Regex FuSaturday, 29 October 11
  • 31. Introducing....... The Sample DomainSaturday, 29 October 11
  • 32. My Amazing PHP Conference WebsiteSaturday, 29 October 11
  • 33. Service LayersSaturday, 29 October 11
  • 34. Demo OneSaturday, 29 October 11
  • 35. Fill in the Feature Context File public function __construct(array $parameters) { $params = array( user => $parameters[database][username], password => $parameters[database][password], driver => $parameters[database][driver], path => $parameters[database][dbPath], ); $con = DoctrineDBALDriverManager::getConnection($params); $confMapper = new PHPConConferenceMapper($con); $confService = new PHPConConferenceService($confMapper); $this->service = $confService; }Saturday, 29 October 11The Feature context file- Ever feature gets a instance. Set up someresources.- Set up the object to test - similar to PHPUnit’s setup method.
  • 36. Fill in the Feature Context File /** * @Given /^there is conference data in the database$/ */ public function thereIsConferneceDataInTheDatabase() { $fileName = self::$dataDir . sample-conf-session-data.sql; self::executeQueriesInFile($fileName); }Saturday, 29 October 11Remember - Given sets the state.Loads an sql fixture to the DB.
  • 37. Fill in the Feature Context File /** * @When /^I use the findConferences method$/ */ public function iUseTheFindConferencesMethod() { $this->result = $this->service->findConferences(); }Saturday, 29 October 11Remember - When executes the thing you want totest.
  • 38. Fill in the Feature Context File /** *@Then /^I should get an array of (d+) conferences$/ */ public function iShouldGetAnArrayOfConferences ($numberOfCons) { assertInternalType(array, $this->result); assertEquals($numberOfCons, count($this->result)); }Saturday, 29 October 11Remember - This verifies the outputAlso - identified a number. Passes the number intothe method.
  • 39. /** * @Then /^it should contain the * conference "([^"]*)"$/ */ public function itShouldContainTheConference ($confName) { $names = array(); foreach($this->result as $conf) { $names[$conf->getName()] = true; } if(!array_key_exists($confName, $names)) { throw new Exception("Conference " . $confName . " not found"); } }Saturday, 29 October 11
  • 40. Exceptions == Test FailuresSaturday, 29 October 11
  • 41. Demo Two Passing Behat TestSaturday, 29 October 11
  • 42. Exercise One Testing a service layer with Behat.Saturday, 29 October 11
  • 43. Exercise One Open the PDF in the misc folder. Read through Section One. Start Coding :)Saturday, 29 October 11
  • 44. Failing TestSaturday, 29 October 11If exceptions are encountered .....
  • 45. Passing Test!Saturday, 29 October 11
  • 46. What about the UI?Saturday, 29 October 11We’ve covered testing a service class. But how do you test the UI?
  • 47. MinkSaturday, 29 October 11Part of the Behat Project.A abstraction over a number of different browser testing tools.
  • 48. Mink Goutte Sahi Zombie.jsSaturday, 29 October 11Goutte - headless browserSahi - like seleniumZombie.js -
  • 49. Extend Mink Context Includes predefined steps Use Bundled steps to create higher level abstractions.Saturday, 29 October 11
  • 50. Back To: My Amazing PHP Conference Website!Saturday, 29 October 11We need a UI to testintroducing.....
  • 51. Example Using Minks Bundled Steps Scenario: View all conferences on the homepage Given there is conference data in the database When I am on "/index.php" Then I should see "PHPNW" in the ".conferences" element And I should see "PHPUK" in the ".conferences" element And I should see "PBC11" in the ".conferences" elementSaturday, 29 October 11This is ok - but ties the feature to your implementation.
  • 52. Link FeatureContext.php to UIContext.phpSaturday, 29 October 11This is ok - but ties the feature to your implementation.
  • 53. class FeatureContext public function __construct(array $parameters) { $this->useContext(subcontext_alias, new UIContext($parameters)); ! // REST OF FEATURE CONSTRUCTOR } # features/bootstrap/UIContext.php use BehatBehatContextClosuredContextInterface, BehatBehatContextBehatContext, BehatBehatExceptionPendingException; use BehatGherkinNodePyStringNode, BehatGherkinNodeTableNode; require_once mink/autoload.php; class UIContext extends BehatMinkBehatContextMinkContext { }Saturday, 29 October 111) Linking feature files2) All steps included ‘out the box’
  • 54. Demo Three A Behat UI Test (Using Mink + Goutte)Saturday, 29 October 11This is ok - but ties the feature to your implementation.
  • 55. Exercise Two Testing the UI with Mink and the headless browser Goutte.Saturday, 29 October 11
  • 56. Exercise Two Open the PDF in the sources folder. Read through Section Two. Start Coding :)Saturday, 29 October 11
  • 57. Abstracting your scenario Scenario: View all conferences on the homepage Given there is conference data in the database When I am on the "home" page Then I should see "PHPNW" in the "conferences table” And I should see "PHPUK" in the "conferences table” And I should see "PBC11" in the "conferences table”Saturday, 29 October 11
  • 58. Mink Feature Context class UIContext extends BehatMinkBehatContext MinkContext { protected $pageList = array( "home" => /index.php); protected $elementList = array( "conferences table" => .conferences);Saturday, 29 October 11A simple abstraction that makes a map of pages >urls and elements > css selectors.Example of step delegation.Now you never change the feature file. Just steps.
  • 59. /** * @When /^I am on the "([^"]*)" page$/ */ public function iAmOnThePage($pageName) { if(!isset($this->pageList[$pageName])) { throw new Exception( Page Name: not in page list); } $page = $this->pageList[$pageName]; return new When("I am on "$page""); }Saturday, 29 October 11A simple abstraction that makes a map of pages >urls and elements > css selectors.Example of step delegation.Now you never change the feature file. Just steps.
  • 60. /** * @Then /^I should see "([^"]*)" in the "([^"]*)"$/ */ public function iShouldSeeInThe($text, $element) { if(!isset($this->elementList[$element])) { throw new Exception( Element: . $element . ‘not in element list); } $element = $this->elementList[$element]; return new Then("I should see "$text" in the "$element" element"); }Saturday, 29 October 11A simple abstraction that makes a map of pages >urls and elements > css selectors.Example of step delegation.Now you never change the feature file. Just steps.
  • 61. Demo Four A Behat UI Test (Using Mink + Goutte) UI implementation abstracted away from Gherkin.Saturday, 29 October 11This is ok - but ties the feature to your implementation.
  • 62. Exercise Three Abstracting the UI implementation away from the Gherkin.Saturday, 29 October 11
  • 63. Exercise Three Open the PDF in the sources folder. Read through Section Three. Start Coding :)Saturday, 29 October 11
  • 64. Javascript Testing with SahiSaturday, 29 October 11
  • 65. Back To: My Amazing PHP Conference Website!Saturday, 29 October 11We need a UI to testintroducing.....
  • 66. Example @javascript Scenario: Use autocomplete functionality to complete a input field Given there is conference data in the database When I am on the "home" page When I fill in "search-text" with "PHP" And I wait for the suggestion box to appear Then I should see "PHPNW"Saturday, 29 October 11Mention @tagsSO you need to test java script.Headless browser isn’t suitable.
  • 67. Great Reuse @javascript Scenario: Use autocomplete functionality to complete a input field Given there is conference data in the database When I am on the "home" page When I fill in "search-text" with "PHP" And I wait for the suggestion box to appear Then I should see "PHPNW"Saturday, 29 October 11These are supplied by Mink. Woohoo!REUSE
  • 68. // In the UIContext class /** * @Given /^I wait for the suggestion box to appear$/ */ public function iWaitForTheSuggestionBoxToAppear() { $this->getSession()->wait(5000, "$(.suggestions-results).children().length > 0" ); }Saturday, 29 October 11Get session - gets you minkWait,Then execute jquery!
  • 69. Demo Five UI Testing With SahiSaturday, 29 October 11This is ok - but ties the feature to your implementation.
  • 70. Saturday, 29 October 11
  • 71. Exercise Four UI Testing With SahiSaturday, 29 October 11
  • 72. Exercise Four Open the PDF in the sources folder. Read through Section Four. Start Coding :)Saturday, 29 October 11
  • 73. DataSaturday, 29 October 11How do you supply your data?
  • 74. SQL FixtureSaturday, 29 October 11Can be difficult to maintain.Hides Data in a fixture NOT in your scenarios.
  • 75. PhabricSaturday, 29 October 11
  • 76. Gherkin Tables Scenario: Given The following events exist | Name | Date | Venue | Desc | | PHPNW | 2011-10-08 09:00 | Ramada Hotel | Awesome conf! | | PHPUK | 2012-02-27 09:00 | London Business Center | Quite good conf. |Saturday, 29 October 11
  • 77. Demo Five Dynamic fixture creation with Phabric.Saturday, 29 October 11This is ok - but ties the feature to your implementation.
  • 78. Case Study: Behat at Sky BetSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
  • 79. The ProblemSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
  • 80. The Business AnalystSaturday, 29 October 11BA / Product owner has all the knowledgeWrite stories
  • 81. The TesterSaturday, 29 October 11Testers test implementation vs the story
  • 82. The DeveloperSaturday, 29 October 11Dev - write the codeAutomate the process of testing if code meets therequirements of a story
  • 83. The ProblemSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
  • 84. BDD - Skybet Workflow BA’s Write Stories Testers Write Gherkin Developers Write Steps + CodeSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
  • 85. BDD - Skybet Workflow Less Defects Fewer times through this cycleSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
  • 86. The Place Of Acceptance & Integration TestsSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
  • 87. Balance.Saturday, 29 October 11Jason HugginsThe place of acceptance and integration tests
  • 88. A whole world of trouble.Saturday, 29 October 11Takes a long time to run,Harder to implement, when they break you have to do this again!not as reassuring!
  • 89. joind.in http://joind.in/talk/view/4328Saturday, 29 October 11
  • 90. Questions?Saturday, 29 October 11
  • 91. Links Behat Github Page: https://github.com/Behat/Behat Mink On Github: https://github.com/Behat/Mink Website: http://behat.org/ Phabric On Github: https://github.com/benwaine/ PhabricSaturday, 29 October 11