Upload
benwaine
View
2.313
Download
0
Embed Size (px)
DESCRIPTION
Slides from my Tutorial
Citation preview
ACCEPTANCE & INTEGRATION TESTING WITH
BEHATDPC 2012 - Ben Waine - @bwaine
https://joind.in/6218
Thursday, 7 June 12
The EnvironmentOracle Open Box
Ubuntu 12.12Behat + Examples Installed
1. Get Open Box and the VHD from the provided USB stick.
2. Install Open Box
3. Load the VHD
Thursday, 7 June 12
Demo: The Environment
Thursday, 7 June 12
BEN WAINE• Freelance Software Engineer
•Worked with Behat at Sky and IPC
•DPC was the second conference I ever attended in 2009. Glad to be back!
•Twitter : @bwaine
Thursday, 7 June 12
Todays Roadmap
1. Introduction to BDD and Behat2. How to Write Behat Tests3. Mink - UI Testing With Behat4. Mink - Javascript Testing5. Phabric - Fixture Building6. Behat - Common Contexts7. Case Study - Behat In The Wild8. Tips From The Trenches9. Questions
Thursday, 7 June 12
Todays Roadmap
1. Introduction to BDD and Behat2. How to Write Behat Tests3. Mink - UI Testing With Behat4. Mink - Javascript Testing5. Phabric - Fixture Building6. Behat - Common Contexts7. Case Study - Behat In The Wild8. Tips From The Trenches9. Questions
Thursday, 7 June 12
My Questions
Thursday, 7 June 12
Behaviour Driven Development
Thursday, 7 June 12
Stories
Thursday, 7 June 12
Dan North - Whats In A Story?
http://dannorth.net/whats-in-a-story/Thursday, 7 June 12
Title (one line describing the story) Narrative:As a [role]I want [feature]So that [benefit] Acceptance Criteria: (presented as Scenarios) Scenario 1: TitleGiven [context] And [some more context]...When [event]Then [outcome] And [another outcome]...
Dan North’s Recipe For A Story
Thursday, 7 June 12
Behat‘A open source behaviour driven development [testing]
framework’
‘Inspired by Ruby’s Cucumber project’
Thursday, 7 June 12
Behat - What Can We Do With It?
Test Anything!
Web Applications
Web Services
Shell Scripts
PHP Scripts
Your developers relationship
skills
Thursday, 7 June 12
Where Does Behat Sit In The BDD Ecosystem?
PHPSpec - Class Level BDD
Behat - Service / UI Level Testing
Thursday, 7 June 12
BDD == TDD??
http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/Thursday, 7 June 12
Behat - Installation So Easy I’m Not Even Covering It.
Composer
Phar
Pear
Github
Thursday, 7 June 12
My Friend Shashi -
http://lestbddphp.wordpress.com/2012/05/07/enjoy-minkextension-for-behat/
Great article on setting up Behat 2.4 (latest version)
Thursday, 7 June 12
Testing Unix’s famous ‘ls’ command
1. In the VM open Sublime Text 2
2. cd /home/tuser/tutorial/01-LinuxCommands
An Example From behat.org
Thursday, 7 June 12
Testing Unix’s famous ‘ls’ command
1. Run: bin/behat features/ls.feature
2. Open features/ls.feature
3. Open features/bootstrap/FeatureContext.php
What does a behat test consist of?
Thursday, 7 June 12
Gherkin
Thursday, 7 June 12
Testing Unix’s famous ‘ls’ commandfeatures/ls.feature
Feature: ls In order to see the directory structure As a UNIX user I need to be able to list the current directory's contents
Scenario: List 2 files in a directory Given I am in a directory "test" And I have a file named "foo" And I have a file named "bar" When I run "ls" Then I should get: """ bar foo """
Source: http://docs.behat.org/quick_intro.htmlThursday, 7 June 12
Title (one line describing the story) Narrative:As a [role]I want [feature]So that [benefit] Acceptance Criteria: (presented as Scenarios) Scenario 1: TitleGiven [context] And [some more context]...When [event]Then [outcome] And [another outcome]...
Dan North’s Recipe For A Story
Thursday, 7 June 12
Steps - Plain Old PHP
Thursday, 7 June 12
features/bootstrap/FeatureContext.php<?php
use Behat\Behat\Context\BehatContext, Behat\Behat\Exception\PendingException;use Behat\Gherkin\Node\PyStringNode, Behat\Gherkin\Node\TableNode;
class FeatureContext extends BehatContext{ private $output;
/** @Given /^I am in a directory "([^"]*)"$/ */ public function iAmInADirectory($dir) { if (!file_exists($dir)) { mkdir($dir); } chdir($dir); }
1/2Source: http://docs.behat.org/quick_intro.html
Thursday, 7 June 12
features/bootstrap/FeatureContext.php /** @Given /^I have a file named "([^"]*)"$/ */ public function iHaveAFileNamed($file) { touch($file); }
/** @When /^I run "([^"]*)"$/ */ public function iRun($command) { exec($command, $output); $this->output = trim(implode("\n", $output)); }
/** @Then /^I should get:$/ */ public function iShouldGet(PyStringNode $string) { if ((string) $string !== $this->output) { throw new Exception( "Actual output is:\n" . $this->output ); } } 2/2
Thursday, 7 June 12
Testing Unix’s famous ‘ls’ command
Feature Files & Feature Contexts
Which contain:
Features / Stories and Steps
What does a behat test consist of?
Thursday, 7 June 12
Behat Directory Structure
Thursday, 7 June 12
Exercise One: Hello World
Thursday, 7 June 12
Exercise One
Write a php script which takes the users name as it’s only argument.
When executed it should write ‘Hello’ to the screen.
eg. Hello Ben
If no name is given then it should output ‘Hello Stranger’
Thursday, 7 June 12
The BDD approach - write scenarios that define behaviour
first.
Thursday, 7 June 12
Setting Up A Project
1. cd /home/tuser/tutorial/02-HelloScript
2. run bin/behat --init
Thursday, 7 June 12
Behat Killer Feature - Write A Step Get The Regex For Free!
Thursday, 7 June 12
The BDD Workflow
1. Create features/hello.feature
2. Write a scenario to test the ‘hello’ script
3. Run bin/behat features/hello.feature
4. Copy the steps into features/bootstrap/FeatureContext.php
Thursday, 7 June 12
Clues
1. The Command is in another directory. Change to that directory in the given step?
2. When is an event or action
3. Then tests the event
Thursday, 7 June 12
The BDD Workflow
1. Create features/hello.feature
2. Write a scenario to test the ‘hello’ script
3. Run bin/behat features/hello.feature
4. Copy the steps into features/bootstrap/FeatureContext.php
Thursday, 7 June 12
5. Complete the methods in the FeatureContext.php file.
6. Run bin/behat features/hello.feature
7. FAIL
8. Write the Hello Script.
9. PASS
The BDD Workflow
Thursday, 7 June 12
Dan North Revisited:Making a Good Story
The title should describe an activity
The narrative should include a role, a feature and a benefit
The scenario title should say what’s different
The scenario should be described in terms of Givens, Events and Outcomes
The givens should define all of, and no more than, the required context
The event should describe the feature
The story should be small enough to fit in an iteration
Thursday, 7 June 12
Time to share.
Thursday, 7 June 12
UI Testing With Behat & Mink
Thursday, 7 June 12
My Questions
Thursday, 7 June 12
Mink
Goutte
Selenium
Web Driver
Sahi
Zombie Js
Thursday, 7 June 12
Mink - A UI Testing Tool AbstractionHeadless Browser (Goutte)
Makes HTTP calls and inspect the outputFast and lightweightCan’t test Javascipt / AJAX
Browser Controller (Sahi / Selenium / WebDriver)
Control a real browserSimulates user interaction with a web siteCan test javascript / AJAXSlower than headless browser
Thursday, 7 June 12
Included With MinkA new context class to use
Bundled steps to test UI elements with. Eg:
Given I am on "/wiki/Main_Page" When I fill in "search" with "Behavior Driven Development" And I press "searchButton" Then I should see "agile software development"
Source: http://behat.org/cookbook/behat_and_mink.html
Thursday, 7 June 12
Using MinkContext
<?php
class FeatureContext extends BehatContext{ public function __construct(array $parameters) { $this->useContext( 'mink', new Behat\MinkExtension\Context\MinkContext ); }}
If you have custom steps or an existing FeatureContext
Thursday, 7 June 12
Exercise Two: Hello World On The Web
Thursday, 7 June 12
Exercise TwoWrite a simple web page with a form.
The form should have a single field ‘name’.
When typing in a name and pressing submit, the page should reload and print the message ‘Hello _name_’
eg. Hello Ben
On the page with the greeting a link with the text ‘again’ should take you back to the original form page.
Thursday, 7 June 12
Setting Up A Project
1. cd /home/tuser/tutorial/03-HelloPage
2. run bin/behat --init
3. Web page goes in the ‘public’ directory
4. Add behat.yml to 03-HelloPageSee example misc/behat.yml
Thursday, 7 June 12
Using MinkContext
<?php
class FeatureContext extends BehatContext{ public function __construct(array $parameters) { $this->useContext( 'mink', new Behat\MinkExtension\Context\MinkContext ); }}
If you have custom steps or an existing FeatureContext
Thursday, 7 June 12
Using MinkContext
New in 2.4 - If Mink extension is installed and you have no custom steps. It’s automatic!
Great for testers.
Thursday, 7 June 12
The BDD Workflow
1. Create features/hello.feature
2. Write a scenario to test the ‘hello’ pageUse bundled Mink Steps
3. Use MinkContext
4. Run bin/behat features/hello.featureWow no new steps required!
Thursday, 7 June 12
The BDD Workflow
5. FAIL
6. Write web page
7. PASS
Thursday, 7 June 12
Debugging Steps
Then /^print last response$/
Then /^show last response$/
Lets try this on the test we have just written.
‘And I Wait’ - implement yourself with fgets
Thursday, 7 June 12
Testing Javascript Interactions
Thursday, 7 June 12
Tagging Tests For Javascript Testing
@javascriptScenario: As an attendeeI should be able to tag scenarios after reading thisGiven I am testing javascriptWhen I read this slideThen I'll tag scenarios with @javascript LIKE A BOSS
Use tags to tell Mink to use a full browser rather than Goutte.
Thursday, 7 June 12
Steps To Use For Testing JS
/** * @Then /^I wait for the suggestion box to appear$/ */ public function iWaitForTheSuggestionBoxToAppear() { $this->getSubcontext('mink') ->getSession() ->wait(1000, "$('.name').children().length > 0"); }
Custom steps which manipulate the mink session.
Thursday, 7 June 12
Steps To Use For Testing JS
See: http://mink.behat.org for tips on what we can do.
Thursday, 7 June 12
Exercise Three: Hello World On The Web
With Javascript
Thursday, 7 June 12
ExerciseThree
Extend your solution from the previous exercise.
Use the supplied jQuery plugin to make your form suggest names as the user enters letters into the name field.
See hint.php for some clues.
Thursday, 7 June 12
The BDD Workflow
1. Open features/hello.feature
2. Write additional scenarios to test the ‘autocomplete’ functionality
3. Run behat features/hello.feature
4. Add steps to FeatureContext.php and complete
5. Run behat features/hello.feature
Thursday, 7 June 12
The BDD Workflow
6. FAIL
7. Write additional functionality
8. PASS
Thursday, 7 June 12
Dynamic Fixture Building: Phabric
Shameless self promotion. I Built it.Thursday, 7 June 12
So Far...
Thursday, 7 June 12
Options For Loading Data
SQL Fixtures
Steps With SQL in
Behat’s Fixture Loading
Phabric
Thursday, 7 June 12
I Don’t like Fixture Files.
Thursday, 7 June 12
Behat’s Fixture Building Tool
http://propel.posterous.com/propel2-meets-behat-for-the-win
Thursday, 7 June 12
Phabric
Thursday, 7 June 12
Phabric Features
Represent Table Data In A Gherkin Table Node
Scenario: Basic Data InsertGiven The following conference exists | name | description | cdate | | Symfony Day | Anual Symfony conference in Paris | 2011-10-21 09:00:00 | | Zend Con | Zend Conference in San Fran | 2011-10-17 09:00:00 |When I am on "/index.php"And I wait for 10 secondsThen I should see "Zend Con" in the ".conf" element
Thursday, 7 June 12
Phabric Features
Map Business Friendly Names To Column Headers
Scenario: Change Column NamesGiven The following conference exists | Conf Name | Conf Description | Conf Date | | Symfony Day | Annual Symfony conference in Paris| 2011-10-21 09:00:00 | | Zend Con | Zend Conference in San Fran | 2011-10-17 09:00:00 |When I am on "/index.php"And I wait for 10 secondsThen I should see "Zend Con" in the ".conf" element
Thursday, 7 June 12
Phabric Features
Default Values Allow You To Omit Columns
Scenario: Use a default value - use default value for conference description.Given The following conference exists | Conf Name | Conf Date | | Symfony Day | 21/10/2011 09:00 | | Zend Con | 17/10/2011 09:00 |When I am on "/index.php"And I wait for 10 secondsThen I should see "Zend Con" in the ".conf" element
Thursday, 7 June 12
Phabric FeaturesTransformations Allow Data To Be Reformatted Before Insert
or Update to the Database.
Scenario: Change Column Data - Reformat dateGiven The following conference exists | Conf Name | Conf Description | Conf Date | | Symfony Day | Anual Symfony conference in Paris | 21/10/2011 09:00 | | Zend Con | Zend Conference in San Fran | 17/10/2011 09:00 |When I am on "/index.php"And I wait for 10 secondsThen I should see "Zend Con" in the ".conf" element
Thursday, 7 June 12
Phabric Features
Relationships Supported
Powered By Doctrine DBAL - Works On Most Popular Databases
Interfaces Provided To Integrate Your Own Data Providers
Easy Configuration
State is set up in the test - clear visibility of what is being tested
Thursday, 7 June 12
Phabric Demo
Thursday, 7 June 12
A side note: Hooks
Thursday, 7 June 12
Exercise Four: Play With Phabric
Thursday, 7 June 12
Exercise Four
Use the supplied example to populate the web page with this mornings tutorials.
Thursday, 7 June 12
Common Contexts
Thursday, 7 June 12
Where: https://github.com/Behat/CommonContexts
What: Out the box solutions to common problems.
Thursday, 7 June 12
My Favourite & Example
WebApi Context - Used to test web services.
Thursday, 7 June 12
Using A Common ContextEnsure the common contexts are installed.
/** * Feature context. */class FeatureContext extends MinkContext{ public function __construct($kernel) { $this->useContext('symfony_extra', new \Behat\CommonContexts\SymfonyMailerContext($kernel) );
parent::__construct($kernel); }}
Source: https://github.com/Behat/CommonContexts
Thursday, 7 June 12
Exercise Five
Use the new WebApi steps to spec a simple API.
Use the provided files to create a ‘fake’ that satisfies the scenarios.
See the misc folder for a WebApi cheat sheet.
Thursday, 7 June 12
Case Study: Behat At Skybet
Thursday, 7 June 12
Sky Bet
Skybet.com - A large sports betting site in the UK
Technology: PHP, MySQL, nodejs
Testing: PHPUnit, Behat
Thursday, 7 June 12
Problems
1) Definition of Done
2) Regression
3) Testing The Full Stack
Thursday, 7 June 12
Solution
Build a workflow that lets people work together, helps fight regression and provides visibility of
progress to the business.
Behat
Thursday, 7 June 12
The Players: Business Analyst
Thursday, 7 June 12
The Players:The Tester
Thursday, 7 June 12
Ninja, Cat Like,
Good Looking, Charismatic,
Hard Working,Modest
Developers.
Thursday, 7 June 12
Solution
Business Analysts take business requirements write stories.
Testers ‘translate’ into Gherkin.
Developers write steps and build the feature.
Thursday, 7 June 12
Solution
A story is ‘done’ when the Behat tests pass and a final check by the BA is complete.
Tests are run on every commit to master branch.
Behat tests test the full stack - provide confidence ‘all the moving parts are working’.
Thursday, 7 June 12
Tips From The Trenches
Make sure you have your testing mix correct.
Thursday, 7 June 12
Thursday, 7 June 12
Trouble :(
Thursday, 7 June 12
Tips From The Trenches
Keep you Gherkin dialect lean and mean. Make someone in charge of the Gherkin.
Thursday, 7 June 12
Tips From The Trenches
Consider writing abstractions over the provided Behat / Mink Steps to make your feature files less brittle.
Thursday, 7 June 12
Time Left / Take Home Exercise
Thursday, 7 June 12
Point Behat At Your Own Website And Write Some Scenarios.
1) cd /home/tuser/tutorial/06-takehome
2) Alter behat.yml to point at your live site
3) Write scenarios that test your site
Thursday, 7 June 12
TLDR - Behat Is Super Cool. Go Forth And Use It.
Questions?
Thursday, 7 June 12
Thanks :-)
Please Rate My Tutorial: https://joind.in/6218
Websites & Sources
http://behat.orghttp://mink.behat.orghttp://dannorth.net/whats-in-a-story/http://github.com/benwaine/BehatTutorialhttp://ben-waine.co.uk/blog
Thursday, 7 June 12