SlideShare a Scribd company logo
PHPDAY 2013, VERONA
Automated acceptance testing with Behat and Mink
&
Saturday, May 18, 13
LET ME INTRODUCE MYSELF
• @Richard_Tuin
• Software developer from the Netherlands
• Particular interest in QA
• Working for
Saturday, May 18, 13
INEFFICIENCY
• Different view on scope and resulting product
• Clients don’t get a feel of how they will use the product
• “I like what you’ve built, but it doesn’t do what i meant”
• “Thanks for this new feature, but now x stopped working!”
Saturday, May 18, 13
INEFFICIENCY
• Different view on scope and resulting product
• Clients don’t get a feel of how they will use the product
• “I like what you’ve built, but it doesn’t do what i meant”
• “Thanks for this new feature, but now x stopped working!”
Saturday, May 18, 13
BECAUSE
• ... the dev team and the client have the same goal
• ... we want to know that what we build has value
• ... we want to deliver consistent quality
Saturday, May 18, 13
BUTTHERE’S ANOTHER
PROBLEM...
Saturday, May 18, 13
Developers are lazy
Saturday, May 18, 13
SOTHIS MEANS...
• ... we have to focus more on communication
• ... leave no room for misinterpretation
• ... we have to work together with the client
• ... we got to have a system
• ... we have to validate regularly if what we have built is still
according to acceptance criteria
Saturday, May 18, 13
SOTHIS MEANS...
• ... we have to focus more on communication
• ... leave no room for misinterpretation
• ... we have to work together with the client
• ... we got to have a system
• ... we have to validate regularly if what we have built is still
according to acceptance criteria
Automation?
Saturday, May 18, 13
WORKTOGETHER & DOCUMENTTOGETHER
Saturday, May 18, 13
AUTOMATETHEVALIDATION
AGAINST ACCEPTANCE
CRITERIA
Documentation
Saturday, May 18, 13
SO... HOW?
Saturday, May 18, 13
ITERATIVE
is the keyword
Saturday, May 18, 13
ITERATIVE
“Gradually get to the highest value.”
Saturday, May 18, 13
ITERATIVE SOFTWARE
DEVELOPMENT
Saturday, May 18, 13
WRITING REQUIREMENTS
• Describe how a problem will be solved
• Write them together with your client
• In the (technical) language of the client
• Try to describe the functional problem, not the technical one
Saturday, May 18, 13
WRITE EXAMPLES!
They will reduce misinterpretation and illustrate the result
Saturday, May 18, 13
FEATURE FILE LAYOUT
Feature: {feature description}
{intention}
As a {person}
I want {feature}
So that {intention}
Scenario: {specific scenario description}
Given {context}
And {more context}
When {action}
Then {result}
Scenario: ...
Information: http://dannorth.net/whats-in-a-story/
Saturday, May 18, 13
EXAMPLE FEATURE
Feature: Searching on the internet
As a google.com visitor
I want to use the search engine
So that i can find information on the internet
Scenario: Simple keyword search
Given I am on the homepage
When I fill in the search term “PHP”
And I press “Google search”
Then I should see search results containing “PHP”
Scenario: I feel lucky
Given I am on the homepage
When I fill in the search term “PHP”
And I press “I’m feeling lucky”
Then I should not be on google.com
And I should see “PHP”
Saturday, May 18, 13
STEPS? (TERMINOLOGY)
Feature: {feature description}
{intention}
As a {person}
I want {feature}
So that {intention}
Scenario: {specific scenario description}
Given {context}
And {more context}
When {action}
Then {result}
Scenario: ...
Saturday, May 18, 13
STEPS? (TERMINOLOGY)
Feature: {feature description}
{intention}
As a {person}
I want {feature}
So that {intention}
Scenario: {specific scenario description}
Given {context}
And {more context}
When {action}
Then {result}
Scenario: ...
Feature, user story, module
Saturday, May 18, 13
STEPS? (TERMINOLOGY)
Feature: {feature description}
{intention}
As a {person}
I want {feature}
So that {intention}
Scenario: {specific scenario description}
Given {context}
And {more context}
When {action}
Then {result}
Scenario: ...
Feature, user story, module
Scenario
Saturday, May 18, 13
STEPS? (TERMINOLOGY)
Feature: {feature description}
{intention}
As a {person}
I want {feature}
So that {intention}
Scenario: {specific scenario description}
Given {context}
And {more context}
When {action}
Then {result}
Scenario: ...
Feature, user story, module
Scenario
Steps
Saturday, May 18, 13
LIVING DOCUMENTATION
• All features and scenarios make great documentation!
• A change request starts with rewriting documentation
• Easy to see what functionality the application contains
• Easy to get a feel for the impact of a change
• Easy to get a new team member involved
Saturday, May 18, 13
COMMUNICATION IS KEY
Automation is not the focus
Saturday, May 18, 13
Developers are lazy
Saturday, May 18, 13
AUTOMATION
Makes us happy :-)
Saturday, May 18, 13
“A php framework for testing your business expectations.”
-behat.org
Saturday, May 18, 13
“Mink is an open source acceptance test framework for web
applications, written in PHP 5.3.”
Saturday, May 18, 13
+
Saturday, May 18, 13
+
AWESOME
Saturday, May 18, 13
COMPONENTS OF A BEHAT+MINK
FUNCTIONALTEST SUITE
• Features
• Feature parser
• Generic browser controller client
• Browser controller/simulator
• Executable code that controls the browser controller client
Saturday, May 18, 13
COMPONENTS OF A BEHAT+MINK
FUNCTIONALTEST SUITE
• Features
• Feature parser
• Generic browser controller client
• Browser controller/simulator
• Executable code that controls the browser controller client
Living documentation
Saturday, May 18, 13
COMPONENTS OF A BEHAT+MINK
FUNCTIONALTEST SUITE
• Features
• Feature parser
• Generic browser controller client
• Browser controller/simulator
• Executable code that controls the browser controller client
Living documentation
Behat
Saturday, May 18, 13
COMPONENTS OF A BEHAT+MINK
FUNCTIONALTEST SUITE
• Features
• Feature parser
• Generic browser controller client
• Browser controller/simulator
• Executable code that controls the browser controller client
Living documentation
Behat
Mink
Saturday, May 18, 13
COMPONENTS OF A BEHAT+MINK
FUNCTIONALTEST SUITE
• Features
• Feature parser
• Generic browser controller client
• Browser controller/simulator
• Executable code that controls the browser controller client
Living documentation
Behat
Mink
Selenium, Zombie.js, Goutte,
etc.
Saturday, May 18, 13
COMPONENTS OF A BEHAT+MINK
FUNCTIONALTEST SUITE
• Features
• Feature parser
• Generic browser controller client
• Browser controller/simulator
• Executable code that controls the browser controller client
Living documentation
Behat
Mink
Selenium, Zombie.js, Goutte,
etc.
MinkExtension
Saturday, May 18, 13
1. Using Composer or Phar
$ composer install
{
"require": {
"behat/behat": "*",
"behat/mink": "*",
"behat/mink-extension": "*",
"behat/mink-goutte-driver": "*",
"behat/mink-selenium2-driver": "*"
},
"minimum-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}
INSTALLING BEHAT+MINK
Saturday, May 18, 13
1. Using Composer or Phar
$ composer install
{
"require": {
"behat/behat": "*",
"behat/mink": "*",
"behat/mink-extension": "*",
"behat/mink-goutte-driver": "*",
"behat/mink-selenium2-driver": "*"
},
"minimum-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}
INSTALLING BEHAT+MINK
That’s it!
Saturday, May 18, 13
HELLO BEHAT
1. Initialize a Behat testsuite skeleton
$ bin/behat --init
2. Behat creates it’s standard project structure
Saturday, May 18, 13
MINKEXTENSION
1. Bridges the gap between Behat and Mink
2. Contains a set of predefined step definitions
3. Not all step definitions may be usable for all projects
4. Behat + Mink is easy:
use BehatMinkExtensionContextMinkContext;
class FeatureContext extends MinkContext
{
// ...
}
features/FeatureContext.php
Saturday, May 18, 13
MINKEXTENSION STEPS
Given /^(?:|I )am on (?:|the )homepage$/
When /^(?:|I )go to (?:|the )homepage$/
Given /^(?:|I )am on "(?P<page>[^"]+)"$/
When /^(?:|I )fill in "(?P<field>(?:[^"]|")*)" with "(?P<value>(?:[^"]|")*)"$/
When /^(?:|I )press "(?P<button>(?:[^"]|")*)"$/
When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/
Then /^(?:|I )should be on "(?P<page>[^"]+)"$/
Then /^(?:|I )should see "(?P<text>(?:[^"]|")*)"$/
$ bin/behat -dl
/**
* Clicks link with specified id|title|alt|text.
*
* @When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/
*/
public function clickLink($link)
{
$link = $this->fixStepArgument($link);
$this->getSession()->getPage()->clickLink($link);
}
Saturday, May 18, 13
BEHAT.YML
• Place for configuration options
• Basic Behat / Mink config
default:
extensions:
BehatMinkExtensionExtension:
base_url: "http://www.yourwebsite.com"
goutte: ~
selenium2: ~
Saturday, May 18, 13
EXAMPLE FEATURE
Saturday, May 18, 13
EXAMPLE FEATURE
Feature: Search on the internet
As a google.com visitor
I want to use the search engine
So that i can find information on the internet
Scenario: Simple keyword search
Given I am on the homepage
When I fill in the search term “PHP”
And I press “Google search”
Then I should see search results containing “PHP”
features/search.feature
Saturday, May 18, 13
STEP DEFINITIONS
/**
* @When /^I fill in the search term "([^"]*)"$/
*/
public function iSearchTheTerm($arg1)
{
throw new PendingException();
}
Put these in your FeatureContext.php file.
$ bin/behat
Running Behat
Behat gives you step suggestions:
Saturday, May 18, 13
WRITING STEP DEFINITIONS
/**
* @When /^I search the term "([^"]*)"$/
*/
public function iSearchTheTerm($searchTerm)
{
$this->fillField('q', $searchTerm); // method from MinkExtension
$this->pressButton('Google search');
}
Saturday, May 18, 13
MINKTERMINOLOGY
• Driver = Browser controller/emulator
• Session = Browser
• Page = Document(Element)
• Element
• Selectors
• XPath
• CSS
• Named
Saturday, May 18, 13
RUNNING IT
Saturday, May 18, 13
PAGE/DOCUMENTTRAVERSAL
• Selection of elements on a page
• Selectors based on XPath, CSS, Names
$page = $this->getPage();
$elements = $page->findAll('xpath', './/div[@class="sa_mc"]');
$elements = $page->findAll('css', 'div[class="sa_mc"]');
Saturday, May 18, 13
ELEMENT ACTIONS
$page = $this->getSession()->getPage();
$loginLink = $page->find('css', '#login');
$loginLink->click();
->getValue();
->setValue();
->keyUp();
->press();
etcetera...
Saturday, May 18, 13
OTHER FEATURES
Great to get started
Saturday, May 18, 13
PROFILES
• Full configuration per environment
• Feature / Scenario selection based on filters
• Define them in behat.yml:
• Call the profile with: $ bin/behat --profile acceptance
default:
extension:
BehatMinkExtensionContextMinkContext
base_url: “http://www.example.org”
acceptance:
extension:
BehatMinkExtensionContextMinkContext
base_url: “http://acc.example.org”
Saturday, May 18, 13
TAGS
• Metadata for features and scenarios
• Via command line: $ bin/behat --tags “@smoke”
• Define as filter in profile
@smoke
Feature: Search on the www
@javascript
Scenario: ...
search.feature
smoke:
filters:
tags: “@smoke”
behat.yml
nojs:
filters:
tags: “~@javascript”
behat.yml
Saturday, May 18, 13
FILTERS
• Grouping tests
• Tags
• Configuration in behat.yml
smoketests:
filters:
tags: “@smoketest&&~@wip”
development:
filters:
tags: “~@slow&&~@wip”
Saturday, May 18, 13
BROWSER CONTROLLERS
Javascript Speed Remark
Goutte No ++ Emulator
Selenium2 Yes -
Zombie.js Yes +
Saturday, May 18, 13
SCENARIO OUTLINES
Scenario Outline: Simple keyword search
Given I am on the homepage
When I search the term <searchterm>
Then I should see search results containing <searchterm>
Examples:
| searchterm |
| PHP |
| Java |
| Pie |
| This string is possibly too long and uncommon |
Saturday, May 18, 13
DRIVER BENCHMARK
Goutte 2.736ms
Selenium2 16.682ms
Zombie.js 7.533ms
0 5,000 10,000 15,000 20,000
Goutte Selenium2 Zombie.js
Saturday, May 18, 13
HOOKS
• @beforeSuite
• @beforeFeature
• @beforeScenario
• @beforeStep
• @afterSuite
• @afterFeature
• @afterScenario
• @afterStep
Saturday, May 18, 13
HOOKS
• @beforeSuite
• @beforeFeature
• @beforeScenario
• @beforeStep
• @afterSuite
• @afterFeature
• @afterScenario
• @afterStep
Saturday, May 18, 13
HOOK EXAMPLE
/**
* @afterScenario
*/
public function logoutUser()
{
$this->visit('/logout');
}
features/bootstrap/FeatureContext.php
Saturday, May 18, 13
LOCALIZATION
• Write features in your own language
# language: it
Funzionalità: non so scrivere italiano
Scenario: ...
Dato ...
Quando ...
Allora ...
Schema dello scenario: ...
Dato ...
Quando ...
Allora ...
Esempi:
...
Saturday, May 18, 13
INTEGRATION WITH JENKINS
• Behat includes export to jUnit format
• Jenkins build step example
${WORKSPACE}/bin/behat --format junit --out ${WORKSPACE}/build
Saturday, May 18, 13
CONCLUSION
1. Writing examples is great to improve communication
2. Automating acceptance criteria = consistent quality
3. Behat and Mink are an excellent combination to do this
Saturday, May 18, 13
QUESTIONS?
Saturday, May 18, 13
THANKYOU!
• Feedback: http://joind.in/talk/view/8647
• More questions? Contact me, i love this subject!
• @Richard_Tuin
• richardtuin@gmail.com
• skype: richardtuin
Saturday, May 18, 13

More Related Content

KEY
El proceso de desarrollo con herramientas Open Source
PDF
Documentación
PDF
Gestión de requisitos y su trazabilidad en la Gestión de Servicios TI
PDF
Introducción a Groovy
PPT
M1 tema 1 deteccion de incendios quimica del fuego
PDF
BDD + PHP = behat!
PDF
Especificación medianteejemplos
PPTX
SEMINARIO WEB - El ABC del Test Automation: ¿Qué, por qué, cuando y cómo?
El proceso de desarrollo con herramientas Open Source
Documentación
Gestión de requisitos y su trazabilidad en la Gestión de Servicios TI
Introducción a Groovy
M1 tema 1 deteccion de incendios quimica del fuego
BDD + PHP = behat!
Especificación medianteejemplos
SEMINARIO WEB - El ABC del Test Automation: ¿Qué, por qué, cuando y cómo?

Similar to Phpday - Automated acceptance testing with Behat and Mink (20)

PDF
Intro to Ember.js
PDF
DIY Synthetic: Private WebPagetest Magic
PDF
Monitoring Behavioral Driven Infrastructures mit Cucumber-Nagios by Mike Adolphs
PDF
Mobile App Feature Configuration and A/B Experiments
PDF
Scaling PHP to 40 Million Uniques
PDF
GraphQL Without a Database | Frontend Developer Love
PDF
Teaching Programming Online
PDF
April JavaScript Tools
PDF
Moving away from legacy code with BDD
PDF
Tek 2013 - Building Web Apps from a New Angle with AngularJS
PDF
APIDays 2018 - API Development Lifecycle - The secret ingredient behind RESTf...
PDF
Lone StarPHP 2013 - Building Web Apps from a New Angle
PDF
Mwalls velocity levelup
PDF
What Ops Can Learn From Design
PDF
PHPDay 2013 - High Performance PHP
ODP
PrettyFaces: SEO, Dynamic, Parameters, Bookmarks, Navigation for JSF / JSF2 (...
PDF
Business selectors
PDF
Backbone
PDF
Discover the Possibilities of the Jira Cloud Asset API
Intro to Ember.js
DIY Synthetic: Private WebPagetest Magic
Monitoring Behavioral Driven Infrastructures mit Cucumber-Nagios by Mike Adolphs
Mobile App Feature Configuration and A/B Experiments
Scaling PHP to 40 Million Uniques
GraphQL Without a Database | Frontend Developer Love
Teaching Programming Online
April JavaScript Tools
Moving away from legacy code with BDD
Tek 2013 - Building Web Apps from a New Angle with AngularJS
APIDays 2018 - API Development Lifecycle - The secret ingredient behind RESTf...
Lone StarPHP 2013 - Building Web Apps from a New Angle
Mwalls velocity levelup
What Ops Can Learn From Design
PHPDay 2013 - High Performance PHP
PrettyFaces: SEO, Dynamic, Parameters, Bookmarks, Navigation for JSF / JSF2 (...
Business selectors
Backbone
Discover the Possibilities of the Jira Cloud Asset API
Ad

Recently uploaded (20)

PDF
Business Ethics Teaching Materials for college
PDF
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
PPTX
Open Quiz Monsoon Mind Game Final Set.pptx
PDF
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PPTX
Onica Farming 24rsclub profitable farm business
PDF
102 student loan defaulters named and shamed – Is someone you know on the list?
PDF
The Final Stretch: How to Release a Game and Not Die in the Process.
PDF
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
PPTX
Renaissance Architecture: A Journey from Faith to Humanism
PDF
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PPTX
The Healthy Child – Unit II | Child Health Nursing I | B.Sc Nursing 5th Semester
PDF
O7-L3 Supply Chain Operations - ICLT Program
PPTX
Cell Structure & Organelles in detailed.
PDF
2.FourierTransform-ShortQuestionswithAnswers.pdf
PDF
Open folder Downloads.pdf yes yes ges yes
PPTX
NOI Hackathon - Summer Edition - GreenThumber.pptx
PDF
Insiders guide to clinical Medicine.pdf
PDF
01-Introduction-to-Information-Management.pdf
Business Ethics Teaching Materials for college
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
Open Quiz Monsoon Mind Game Final Set.pptx
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
Microbial diseases, their pathogenesis and prophylaxis
Onica Farming 24rsclub profitable farm business
102 student loan defaulters named and shamed – Is someone you know on the list?
The Final Stretch: How to Release a Game and Not Die in the Process.
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
Renaissance Architecture: A Journey from Faith to Humanism
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
The Healthy Child – Unit II | Child Health Nursing I | B.Sc Nursing 5th Semester
O7-L3 Supply Chain Operations - ICLT Program
Cell Structure & Organelles in detailed.
2.FourierTransform-ShortQuestionswithAnswers.pdf
Open folder Downloads.pdf yes yes ges yes
NOI Hackathon - Summer Edition - GreenThumber.pptx
Insiders guide to clinical Medicine.pdf
01-Introduction-to-Information-Management.pdf
Ad

Phpday - Automated acceptance testing with Behat and Mink

  • 1. PHPDAY 2013, VERONA Automated acceptance testing with Behat and Mink & Saturday, May 18, 13
  • 2. LET ME INTRODUCE MYSELF • @Richard_Tuin • Software developer from the Netherlands • Particular interest in QA • Working for Saturday, May 18, 13
  • 3. INEFFICIENCY • Different view on scope and resulting product • Clients don’t get a feel of how they will use the product • “I like what you’ve built, but it doesn’t do what i meant” • “Thanks for this new feature, but now x stopped working!” Saturday, May 18, 13
  • 4. INEFFICIENCY • Different view on scope and resulting product • Clients don’t get a feel of how they will use the product • “I like what you’ve built, but it doesn’t do what i meant” • “Thanks for this new feature, but now x stopped working!” Saturday, May 18, 13
  • 5. BECAUSE • ... the dev team and the client have the same goal • ... we want to know that what we build has value • ... we want to deliver consistent quality Saturday, May 18, 13
  • 8. SOTHIS MEANS... • ... we have to focus more on communication • ... leave no room for misinterpretation • ... we have to work together with the client • ... we got to have a system • ... we have to validate regularly if what we have built is still according to acceptance criteria Saturday, May 18, 13
  • 9. SOTHIS MEANS... • ... we have to focus more on communication • ... leave no room for misinterpretation • ... we have to work together with the client • ... we got to have a system • ... we have to validate regularly if what we have built is still according to acceptance criteria Automation? Saturday, May 18, 13
  • 14. ITERATIVE “Gradually get to the highest value.” Saturday, May 18, 13
  • 16. WRITING REQUIREMENTS • Describe how a problem will be solved • Write them together with your client • In the (technical) language of the client • Try to describe the functional problem, not the technical one Saturday, May 18, 13
  • 17. WRITE EXAMPLES! They will reduce misinterpretation and illustrate the result Saturday, May 18, 13
  • 18. FEATURE FILE LAYOUT Feature: {feature description} {intention} As a {person} I want {feature} So that {intention} Scenario: {specific scenario description} Given {context} And {more context} When {action} Then {result} Scenario: ... Information: http://dannorth.net/whats-in-a-story/ Saturday, May 18, 13
  • 19. EXAMPLE FEATURE Feature: Searching on the internet As a google.com visitor I want to use the search engine So that i can find information on the internet Scenario: Simple keyword search Given I am on the homepage When I fill in the search term “PHP” And I press “Google search” Then I should see search results containing “PHP” Scenario: I feel lucky Given I am on the homepage When I fill in the search term “PHP” And I press “I’m feeling lucky” Then I should not be on google.com And I should see “PHP” Saturday, May 18, 13
  • 20. STEPS? (TERMINOLOGY) Feature: {feature description} {intention} As a {person} I want {feature} So that {intention} Scenario: {specific scenario description} Given {context} And {more context} When {action} Then {result} Scenario: ... Saturday, May 18, 13
  • 21. STEPS? (TERMINOLOGY) Feature: {feature description} {intention} As a {person} I want {feature} So that {intention} Scenario: {specific scenario description} Given {context} And {more context} When {action} Then {result} Scenario: ... Feature, user story, module Saturday, May 18, 13
  • 22. STEPS? (TERMINOLOGY) Feature: {feature description} {intention} As a {person} I want {feature} So that {intention} Scenario: {specific scenario description} Given {context} And {more context} When {action} Then {result} Scenario: ... Feature, user story, module Scenario Saturday, May 18, 13
  • 23. STEPS? (TERMINOLOGY) Feature: {feature description} {intention} As a {person} I want {feature} So that {intention} Scenario: {specific scenario description} Given {context} And {more context} When {action} Then {result} Scenario: ... Feature, user story, module Scenario Steps Saturday, May 18, 13
  • 24. LIVING DOCUMENTATION • All features and scenarios make great documentation! • A change request starts with rewriting documentation • Easy to see what functionality the application contains • Easy to get a feel for the impact of a change • Easy to get a new team member involved Saturday, May 18, 13
  • 25. COMMUNICATION IS KEY Automation is not the focus Saturday, May 18, 13
  • 27. AUTOMATION Makes us happy :-) Saturday, May 18, 13
  • 28. “A php framework for testing your business expectations.” -behat.org Saturday, May 18, 13
  • 29. “Mink is an open source acceptance test framework for web applications, written in PHP 5.3.” Saturday, May 18, 13
  • 32. COMPONENTS OF A BEHAT+MINK FUNCTIONALTEST SUITE • Features • Feature parser • Generic browser controller client • Browser controller/simulator • Executable code that controls the browser controller client Saturday, May 18, 13
  • 33. COMPONENTS OF A BEHAT+MINK FUNCTIONALTEST SUITE • Features • Feature parser • Generic browser controller client • Browser controller/simulator • Executable code that controls the browser controller client Living documentation Saturday, May 18, 13
  • 34. COMPONENTS OF A BEHAT+MINK FUNCTIONALTEST SUITE • Features • Feature parser • Generic browser controller client • Browser controller/simulator • Executable code that controls the browser controller client Living documentation Behat Saturday, May 18, 13
  • 35. COMPONENTS OF A BEHAT+MINK FUNCTIONALTEST SUITE • Features • Feature parser • Generic browser controller client • Browser controller/simulator • Executable code that controls the browser controller client Living documentation Behat Mink Saturday, May 18, 13
  • 36. COMPONENTS OF A BEHAT+MINK FUNCTIONALTEST SUITE • Features • Feature parser • Generic browser controller client • Browser controller/simulator • Executable code that controls the browser controller client Living documentation Behat Mink Selenium, Zombie.js, Goutte, etc. Saturday, May 18, 13
  • 37. COMPONENTS OF A BEHAT+MINK FUNCTIONALTEST SUITE • Features • Feature parser • Generic browser controller client • Browser controller/simulator • Executable code that controls the browser controller client Living documentation Behat Mink Selenium, Zombie.js, Goutte, etc. MinkExtension Saturday, May 18, 13
  • 38. 1. Using Composer or Phar $ composer install { "require": { "behat/behat": "*", "behat/mink": "*", "behat/mink-extension": "*", "behat/mink-goutte-driver": "*", "behat/mink-selenium2-driver": "*" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" } } INSTALLING BEHAT+MINK Saturday, May 18, 13
  • 39. 1. Using Composer or Phar $ composer install { "require": { "behat/behat": "*", "behat/mink": "*", "behat/mink-extension": "*", "behat/mink-goutte-driver": "*", "behat/mink-selenium2-driver": "*" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" } } INSTALLING BEHAT+MINK That’s it! Saturday, May 18, 13
  • 40. HELLO BEHAT 1. Initialize a Behat testsuite skeleton $ bin/behat --init 2. Behat creates it’s standard project structure Saturday, May 18, 13
  • 41. MINKEXTENSION 1. Bridges the gap between Behat and Mink 2. Contains a set of predefined step definitions 3. Not all step definitions may be usable for all projects 4. Behat + Mink is easy: use BehatMinkExtensionContextMinkContext; class FeatureContext extends MinkContext { // ... } features/FeatureContext.php Saturday, May 18, 13
  • 42. MINKEXTENSION STEPS Given /^(?:|I )am on (?:|the )homepage$/ When /^(?:|I )go to (?:|the )homepage$/ Given /^(?:|I )am on "(?P<page>[^"]+)"$/ When /^(?:|I )fill in "(?P<field>(?:[^"]|")*)" with "(?P<value>(?:[^"]|")*)"$/ When /^(?:|I )press "(?P<button>(?:[^"]|")*)"$/ When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/ Then /^(?:|I )should be on "(?P<page>[^"]+)"$/ Then /^(?:|I )should see "(?P<text>(?:[^"]|")*)"$/ $ bin/behat -dl /** * Clicks link with specified id|title|alt|text. * * @When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/ */ public function clickLink($link) { $link = $this->fixStepArgument($link); $this->getSession()->getPage()->clickLink($link); } Saturday, May 18, 13
  • 43. BEHAT.YML • Place for configuration options • Basic Behat / Mink config default: extensions: BehatMinkExtensionExtension: base_url: "http://www.yourwebsite.com" goutte: ~ selenium2: ~ Saturday, May 18, 13
  • 45. EXAMPLE FEATURE Feature: Search on the internet As a google.com visitor I want to use the search engine So that i can find information on the internet Scenario: Simple keyword search Given I am on the homepage When I fill in the search term “PHP” And I press “Google search” Then I should see search results containing “PHP” features/search.feature Saturday, May 18, 13
  • 46. STEP DEFINITIONS /** * @When /^I fill in the search term "([^"]*)"$/ */ public function iSearchTheTerm($arg1) { throw new PendingException(); } Put these in your FeatureContext.php file. $ bin/behat Running Behat Behat gives you step suggestions: Saturday, May 18, 13
  • 47. WRITING STEP DEFINITIONS /** * @When /^I search the term "([^"]*)"$/ */ public function iSearchTheTerm($searchTerm) { $this->fillField('q', $searchTerm); // method from MinkExtension $this->pressButton('Google search'); } Saturday, May 18, 13
  • 48. MINKTERMINOLOGY • Driver = Browser controller/emulator • Session = Browser • Page = Document(Element) • Element • Selectors • XPath • CSS • Named Saturday, May 18, 13
  • 50. PAGE/DOCUMENTTRAVERSAL • Selection of elements on a page • Selectors based on XPath, CSS, Names $page = $this->getPage(); $elements = $page->findAll('xpath', './/div[@class="sa_mc"]'); $elements = $page->findAll('css', 'div[class="sa_mc"]'); Saturday, May 18, 13
  • 51. ELEMENT ACTIONS $page = $this->getSession()->getPage(); $loginLink = $page->find('css', '#login'); $loginLink->click(); ->getValue(); ->setValue(); ->keyUp(); ->press(); etcetera... Saturday, May 18, 13
  • 52. OTHER FEATURES Great to get started Saturday, May 18, 13
  • 53. PROFILES • Full configuration per environment • Feature / Scenario selection based on filters • Define them in behat.yml: • Call the profile with: $ bin/behat --profile acceptance default: extension: BehatMinkExtensionContextMinkContext base_url: “http://www.example.org” acceptance: extension: BehatMinkExtensionContextMinkContext base_url: “http://acc.example.org” Saturday, May 18, 13
  • 54. TAGS • Metadata for features and scenarios • Via command line: $ bin/behat --tags “@smoke” • Define as filter in profile @smoke Feature: Search on the www @javascript Scenario: ... search.feature smoke: filters: tags: “@smoke” behat.yml nojs: filters: tags: “~@javascript” behat.yml Saturday, May 18, 13
  • 55. FILTERS • Grouping tests • Tags • Configuration in behat.yml smoketests: filters: tags: “@smoketest&&~@wip” development: filters: tags: “~@slow&&~@wip” Saturday, May 18, 13
  • 56. BROWSER CONTROLLERS Javascript Speed Remark Goutte No ++ Emulator Selenium2 Yes - Zombie.js Yes + Saturday, May 18, 13
  • 57. SCENARIO OUTLINES Scenario Outline: Simple keyword search Given I am on the homepage When I search the term <searchterm> Then I should see search results containing <searchterm> Examples: | searchterm | | PHP | | Java | | Pie | | This string is possibly too long and uncommon | Saturday, May 18, 13
  • 58. DRIVER BENCHMARK Goutte 2.736ms Selenium2 16.682ms Zombie.js 7.533ms 0 5,000 10,000 15,000 20,000 Goutte Selenium2 Zombie.js Saturday, May 18, 13
  • 59. HOOKS • @beforeSuite • @beforeFeature • @beforeScenario • @beforeStep • @afterSuite • @afterFeature • @afterScenario • @afterStep Saturday, May 18, 13
  • 60. HOOKS • @beforeSuite • @beforeFeature • @beforeScenario • @beforeStep • @afterSuite • @afterFeature • @afterScenario • @afterStep Saturday, May 18, 13
  • 61. HOOK EXAMPLE /** * @afterScenario */ public function logoutUser() { $this->visit('/logout'); } features/bootstrap/FeatureContext.php Saturday, May 18, 13
  • 62. LOCALIZATION • Write features in your own language # language: it Funzionalità: non so scrivere italiano Scenario: ... Dato ... Quando ... Allora ... Schema dello scenario: ... Dato ... Quando ... Allora ... Esempi: ... Saturday, May 18, 13
  • 63. INTEGRATION WITH JENKINS • Behat includes export to jUnit format • Jenkins build step example ${WORKSPACE}/bin/behat --format junit --out ${WORKSPACE}/build Saturday, May 18, 13
  • 64. CONCLUSION 1. Writing examples is great to improve communication 2. Automating acceptance criteria = consistent quality 3. Behat and Mink are an excellent combination to do this Saturday, May 18, 13
  • 66. THANKYOU! • Feedback: http://joind.in/talk/view/8647 • More questions? Contact me, i love this subject! • @Richard_Tuin • [email protected] • skype: richardtuin Saturday, May 18, 13