• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Acceptance & Integration Testing With Behat (PBC11)
 

Acceptance & Integration Testing With Behat (PBC11)

on

  • 3,143 views

Slides of the talk I gave at PBC11

Slides of the talk I gave at PBC11

Statistics

Views

Total Views
3,143
Views on SlideShare
3,139
Embed Views
4

Actions

Likes
7
Downloads
68
Comments
0

3 Embeds 4

http://www.docshut.com 2
http://www.slashdocs.com 1
http://www.php-talks.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) Acceptance & Integration Testing With Behat (PBC11) Presentation Transcript

    • Acceptance & Integration Testing Using Behat Ben Waine Email: ben@ben-waine.co.uk Twitter: @bwaineSaturday, 29 October 11
    • Pair Programming Say hello to the person next to you....Saturday, 29 October 11
    • Set Up USB StickSaturday, 29 October 11
    • 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
    • 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
    • Me Software Engineer PHP Developer Sky Bet PHP / MySQL Stack PHPUnit / Selenium / BehatSaturday, 29 October 11
    • Roadmap •Intro To Behaviour Driven Development •Introducing Behat •Gherkin & Steps •API / Service Layer Testing •UI Testing •Phabric - Dynamic Fixture CreationSaturday, 29 October 11
    • joind.in http://joind.in/talk/view/4328Saturday, 29 October 11
    • What Marco Said......Saturday, 29 October 11
    • StoriesSaturday, 29 October 11
    • What is BDD?Saturday, 29 October 11
    • Introducing Behat....Saturday, 29 October 11
    • Resistance is futile.......Saturday, 29 October 11Origins in Rubys cucumber
    • What Does It Test? Scripts API’s Web Pages ModelsSaturday, 29 October 11
    • Integration Testing != Unit TestingSaturday, 29 October 11
    • Anatomy Of A Behat TestSaturday, 29 October 11
    • Saturday, 29 October 11Describes the behaviour in a storyHuman ReadableSamples Later
    • Saturday, 29 October 11PHP that maps to lines of the gherkin.Behat parses gherkin and runs the associatedsteps.
    • Writing Behat Tests $ben > cd /path/to/projects/tests $ben > behat --initSaturday, 29 October 11Bootstrap Behat. Provides you with a structure
    • Writing Behat TestsSaturday, 29 October 11
    • 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
    • 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
    • Scenarios Given (Some Context) When (Some Event) Then (The Outcome)Saturday, 29 October 11Keywords.Always follow the same formula
    • Given (Some Context) Given there is conference data in the databaseSaturday, 29 October 11Sets up some state or context
    • 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
    • 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.
    • 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!!!!
    • 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!!!!
    • / Everybody Stand Back / Behat Knows Regular ExpressionsSaturday, 29 October 11PHP Annotations used to map steps to linesBehat supplies regex.
    • Demo One Behat’s - Regex FuSaturday, 29 October 11
    • Introducing....... The Sample DomainSaturday, 29 October 11
    • My Amazing PHP Conference WebsiteSaturday, 29 October 11
    • Service LayersSaturday, 29 October 11
    • Demo OneSaturday, 29 October 11
    • 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.
    • 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.
    • 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.
    • 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.
    • /** * @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
    • Exceptions == Test FailuresSaturday, 29 October 11
    • Demo Two Passing Behat TestSaturday, 29 October 11
    • Exercise One Testing a service layer with Behat.Saturday, 29 October 11
    • Exercise One Open the PDF in the misc folder. Read through Section One. Start Coding :)Saturday, 29 October 11
    • Failing TestSaturday, 29 October 11If exceptions are encountered .....
    • Passing Test!Saturday, 29 October 11
    • What about the UI?Saturday, 29 October 11We’ve covered testing a service class. But how do you test the UI?
    • MinkSaturday, 29 October 11Part of the Behat Project.A abstraction over a number of different browser testing tools.
    • Mink Goutte Sahi Zombie.jsSaturday, 29 October 11Goutte - headless browserSahi - like seleniumZombie.js -
    • Extend Mink Context Includes predefined steps Use Bundled steps to create higher level abstractions.Saturday, 29 October 11
    • Back To: My Amazing PHP Conference Website!Saturday, 29 October 11We need a UI to testintroducing.....
    • 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.
    • Link FeatureContext.php to UIContext.phpSaturday, 29 October 11This is ok - but ties the feature to your implementation.
    • 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’
    • Demo Three A Behat UI Test (Using Mink + Goutte)Saturday, 29 October 11This is ok - but ties the feature to your implementation.
    • Exercise Two Testing the UI with Mink and the headless browser Goutte.Saturday, 29 October 11
    • Exercise Two Open the PDF in the sources folder. Read through Section Two. Start Coding :)Saturday, 29 October 11
    • 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
    • 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.
    • /** * @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.
    • /** * @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.
    • 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.
    • Exercise Three Abstracting the UI implementation away from the Gherkin.Saturday, 29 October 11
    • Exercise Three Open the PDF in the sources folder. Read through Section Three. Start Coding :)Saturday, 29 October 11
    • Javascript Testing with SahiSaturday, 29 October 11
    • Back To: My Amazing PHP Conference Website!Saturday, 29 October 11We need a UI to testintroducing.....
    • 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.
    • 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
    • // 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!
    • Demo Five UI Testing With SahiSaturday, 29 October 11This is ok - but ties the feature to your implementation.
    • Saturday, 29 October 11
    • Exercise Four UI Testing With SahiSaturday, 29 October 11
    • Exercise Four Open the PDF in the sources folder. Read through Section Four. Start Coding :)Saturday, 29 October 11
    • DataSaturday, 29 October 11How do you supply your data?
    • SQL FixtureSaturday, 29 October 11Can be difficult to maintain.Hides Data in a fixture NOT in your scenarios.
    • PhabricSaturday, 29 October 11
    • 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
    • Demo Five Dynamic fixture creation with Phabric.Saturday, 29 October 11This is ok - but ties the feature to your implementation.
    • 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.
    • The ProblemSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
    • The Business AnalystSaturday, 29 October 11BA / Product owner has all the knowledgeWrite stories
    • The TesterSaturday, 29 October 11Testers test implementation vs the story
    • The DeveloperSaturday, 29 October 11Dev - write the codeAutomate the process of testing if code meets therequirements of a story
    • The ProblemSaturday, 29 October 11Whats the problem we are solving.Three elements of the team.Delivering the product first time. Correctly.
    • 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.
    • 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.
    • 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.
    • Balance.Saturday, 29 October 11Jason HugginsThe place of acceptance and integration tests
    • 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!
    • joind.in http://joind.in/talk/view/4328Saturday, 29 October 11
    • Questions?Saturday, 29 October 11
    • 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