behat dpc12

98
ACCEPTANCE & INTEGRATION TESTING WITH BEHAT DPC 2012 - Ben Waine - @bwaine https://joind.in/6218 Thursday, 7 June 12

Upload: benwaine

Post on 08-May-2015

2.299 views

Category:

Technology


0 download

DESCRIPTION

Slides from my Tutorial

TRANSCRIPT

Page 1: Behat dpc12

ACCEPTANCE & INTEGRATION TESTING WITH

BEHATDPC 2012 - Ben Waine - @bwaine

https://joind.in/6218

Thursday, 7 June 12

Page 2: Behat dpc12

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

Page 3: Behat dpc12

Demo: The Environment

Thursday, 7 June 12

Page 4: Behat dpc12

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

Page 5: Behat dpc12

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

Page 6: Behat dpc12

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

Page 7: Behat dpc12

My Questions

Thursday, 7 June 12

Page 8: Behat dpc12

Behaviour Driven Development

Thursday, 7 June 12

Page 9: Behat dpc12

Stories

Thursday, 7 June 12

Page 10: Behat dpc12

Dan North - Whats In A Story?

http://dannorth.net/whats-in-a-story/Thursday, 7 June 12

Page 11: Behat dpc12

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

Page 12: Behat dpc12

Behat‘A open source behaviour driven development [testing]

framework’

‘Inspired by Ruby’s Cucumber project’

Thursday, 7 June 12

Page 13: Behat dpc12

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

Page 14: Behat dpc12

Where Does Behat Sit In The BDD Ecosystem?

PHPSpec - Class Level BDD

Behat - Service / UI Level Testing

Thursday, 7 June 12

Page 15: Behat dpc12

BDD == TDD??

http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/Thursday, 7 June 12

Page 16: Behat dpc12

Behat - Installation So Easy I’m Not Even Covering It.

Composer

Phar

Pear

Github

Thursday, 7 June 12

Page 18: Behat dpc12

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

Page 19: Behat dpc12

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

Page 20: Behat dpc12

Gherkin

Thursday, 7 June 12

Page 21: Behat dpc12

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

Page 22: Behat dpc12

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

Page 23: Behat dpc12

Steps - Plain Old PHP

Thursday, 7 June 12

Page 24: Behat dpc12

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

Page 25: Behat dpc12

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

Page 26: Behat dpc12

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

Page 27: Behat dpc12

Behat Directory Structure

Thursday, 7 June 12

Page 28: Behat dpc12

Exercise One: Hello World

Thursday, 7 June 12

Page 29: Behat dpc12

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

Page 30: Behat dpc12

The BDD approach - write scenarios that define behaviour

first.

Thursday, 7 June 12

Page 31: Behat dpc12

Setting Up A Project

1. cd /home/tuser/tutorial/02-HelloScript

2. run bin/behat --init

Thursday, 7 June 12

Page 32: Behat dpc12

Behat Killer Feature - Write A Step Get The Regex For Free!

Thursday, 7 June 12

Page 33: Behat dpc12

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

Page 34: Behat dpc12

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

Page 35: Behat dpc12

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

Page 36: Behat dpc12

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

Page 37: Behat dpc12

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

Page 38: Behat dpc12

Time to share.

Thursday, 7 June 12

Page 39: Behat dpc12

UI Testing With Behat & Mink

Thursday, 7 June 12

Page 40: Behat dpc12

My Questions

Thursday, 7 June 12

Page 41: Behat dpc12

Mink

Goutte

Selenium

Web Driver

Sahi

Zombie Js

Thursday, 7 June 12

Page 42: Behat dpc12

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

Page 43: Behat dpc12

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

Page 44: Behat dpc12

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

Page 45: Behat dpc12

Exercise Two: Hello World On The Web

Thursday, 7 June 12

Page 46: Behat dpc12

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

Page 47: Behat dpc12

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

Page 48: Behat dpc12

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

Page 49: Behat dpc12

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

Page 50: Behat dpc12

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

Page 51: Behat dpc12

The BDD Workflow

5. FAIL

6. Write web page

7. PASS

Thursday, 7 June 12

Page 52: Behat dpc12

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

Page 53: Behat dpc12

Testing Javascript Interactions

Thursday, 7 June 12

Page 54: Behat dpc12

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

Page 55: Behat dpc12

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

Page 56: Behat dpc12

Steps To Use For Testing JS

See: http://mink.behat.org for tips on what we can do.

Thursday, 7 June 12

Page 57: Behat dpc12

Exercise Three: Hello World On The Web

With Javascript

Thursday, 7 June 12

Page 58: Behat dpc12

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

Page 59: Behat dpc12

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

Page 60: Behat dpc12

The BDD Workflow

6. FAIL

7. Write additional functionality

8. PASS

Thursday, 7 June 12

Page 61: Behat dpc12

Dynamic Fixture Building: Phabric

Shameless self promotion. I Built it.Thursday, 7 June 12

Page 62: Behat dpc12

So Far...

Thursday, 7 June 12

Page 63: Behat dpc12

Options For Loading Data

SQL Fixtures

Steps With SQL in

Behat’s Fixture Loading

Phabric

Thursday, 7 June 12

Page 64: Behat dpc12

I Don’t like Fixture Files.

Thursday, 7 June 12

Page 65: Behat dpc12

Behat’s Fixture Building Tool

http://propel.posterous.com/propel2-meets-behat-for-the-win

Thursday, 7 June 12

Page 66: Behat dpc12

Phabric

Thursday, 7 June 12

Page 67: Behat dpc12

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

Page 68: Behat dpc12

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

Page 69: Behat dpc12

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

Page 70: Behat dpc12

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

Page 71: Behat dpc12

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

Page 72: Behat dpc12

Phabric Demo

Thursday, 7 June 12

Page 73: Behat dpc12

A side note: Hooks

Thursday, 7 June 12

Page 74: Behat dpc12

Exercise Four: Play With Phabric

Thursday, 7 June 12

Page 75: Behat dpc12

Exercise Four

Use the supplied example to populate the web page with this mornings tutorials.

Thursday, 7 June 12

Page 76: Behat dpc12

Common Contexts

Thursday, 7 June 12

Page 77: Behat dpc12

Where: https://github.com/Behat/CommonContexts

What: Out the box solutions to common problems.

Thursday, 7 June 12

Page 78: Behat dpc12

My Favourite & Example

WebApi Context - Used to test web services.

Thursday, 7 June 12

Page 79: Behat dpc12

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

Page 80: Behat dpc12

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

Page 81: Behat dpc12

Case Study: Behat At Skybet

Thursday, 7 June 12

Page 82: Behat dpc12

Sky Bet

Skybet.com - A large sports betting site in the UK

Technology: PHP, MySQL, nodejs

Testing: PHPUnit, Behat

Thursday, 7 June 12

Page 83: Behat dpc12

Problems

1) Definition of Done

2) Regression

3) Testing The Full Stack

Thursday, 7 June 12

Page 84: Behat dpc12

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

Page 85: Behat dpc12

The Players: Business Analyst

Thursday, 7 June 12

Page 86: Behat dpc12

The Players:The Tester

Thursday, 7 June 12

Page 87: Behat dpc12

Ninja, Cat Like,

Good Looking, Charismatic,

Hard Working,Modest

Developers.

Thursday, 7 June 12

Page 88: Behat dpc12

Solution

Business Analysts take business requirements write stories.

Testers ‘translate’ into Gherkin.

Developers write steps and build the feature.

Thursday, 7 June 12

Page 89: Behat dpc12

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

Page 90: Behat dpc12

Tips From The Trenches

Make sure you have your testing mix correct.

Thursday, 7 June 12

Page 91: Behat dpc12

Thursday, 7 June 12

Page 92: Behat dpc12

Trouble :(

Thursday, 7 June 12

Page 93: Behat dpc12

Tips From The Trenches

Keep you Gherkin dialect lean and mean. Make someone in charge of the Gherkin.

Thursday, 7 June 12

Page 94: Behat dpc12

Tips From The Trenches

Consider writing abstractions over the provided Behat / Mink Steps to make your feature files less brittle.

Thursday, 7 June 12

Page 95: Behat dpc12

Time Left / Take Home Exercise

Thursday, 7 June 12

Page 96: Behat dpc12

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

Page 97: Behat dpc12

TLDR - Behat Is Super Cool. Go Forth And Use It.

Questions?

Thursday, 7 June 12

Page 98: Behat dpc12

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