SlideShare a Scribd company logo
1 of 88
Download to read offline
WORKSHOPDAG 27 APRIL 2013
Automatiseren van functionele tests met Behat en Mink
&
VOORBEREIDING
• Download en installeerVirtualbox (https://www.virtualbox.org/)
• Download en installeerVagrant (http://www.vagrantup.com/)
• https://github.com/pfznl/wsd13-functionaltesting/
• $ git clone https://github.com/pfznl/wsd13-functionaltesting.git
• $ cd wsd13-functionaltesting
• $ vagrant up
• ???
• Profit
WAT HEB JE NODIG?
• Computer/laptop
• PHP 5.3
• [Java] (als je selenium wilt draaien)
• Virtualbox
• [Vagrant]
https://github.com/pfznl/wsd13-functionaltesting/
EVENVOORSTELLEN
• @Richard_Tuin
• Software ontwikkelaar
• Speciale interesse in kwaliteit
• Werkzaam bij Enrise
EN WIE ZIJN JULLIE?
HET PROBLEEM
• Verschillend beeld op scope/werking van de oplevering
• De klant weet soms achteraf pas hoe het systeem precies
gebruikt kan worden
• “Het is wel mooi, maar zou x toch y kunnen werken?”
• “Bedankt voor de nieuwe feature, maar nu werkt x niet meer”
HET PROBLEEM
• Verschillend beeld op scope/werking van de oplevering
• De klant weet soms achteraf pas hoe het systeem precies
gebruikt kan worden
• “Het is wel mooi, maar zou x toch y kunnen werken?”
• “Bedankt voor de nieuwe feature, maar nu werkt x niet meer”
WANT EIGENLIJK...
• ... hebben we een gezamenlijk doel
• ... willen we wat we gaan bouwen zo nauwkeurig mogelijk
definiëren
• ... willen we constante kwaliteit leveren
MAAR ER IS NOG EEN
PROBLEEM...
Developers zijn lui
DAT BETEKENT DAT...
• ... we beter, en op gelijk niveau moeten communiceren
• ... we een documentatiesysteem moeten bedenken voor de
afstemming
• ... we regelmatig moeten valideren dat wat we leveren nog
volgens specificaties is
DAT BETEKENT DAT...
• ... we beter, en op gelijk niveau moeten communiceren
• ... we een documentatiesysteem moeten bedenken voor de
afstemming
• ... we regelmatig moeten valideren dat wat we leveren nog
volgens specificaties is
Automatiseren?
SAMENWERKEN & DOCUMENTEREN
REGELMATIG (HER)VALIDEREN
VAN ACCEPTATIECRITERIA
Documentatie
LATEN WE BIJ HET BEGIN
BEGINNEN...
(dus nog even geen code)
KWALITEIT
Wat is dat nou eigenlijk?
KWALITEIT
=
SOFTWARE DIE AAN DE EISEN
VOLDOET
HOE ZORG JE DANVOOR
KWALITEIT?
SAMENWERKEN &
DOCUMENTEREN
ITERATIEF
is het sleutelwoord
ITERATIEF
“Stapsgewijs naar een optimum gaan.”
SOFTWAREONTWIKKELING
AGILE MANIFESTO
Mensen en hun onderlinge interactie > processen and tools
Werkende software > allesomvattende documentatie
Samenwerking met de klant > contractonderhandelingen
Inspelen op verandering > het volgen van een plan
SAMENWERKEN EN
DOCUMENTEREN
SAMENWERKEN EN
DOCUMENTEREN
1
SAMENWERKEN EN
DOCUMENTEREN
1
2
SAMENWERKEN EN
DOCUMENTEREN
1
2
3
OPSTELLENVAN REQUIREMENTS
• Omschrijven hoe een probleem opgelost wordt
• Gezamenlijk met de klant opstellen
• In de taal (technische) van de klant
• Functioneel gericht, niet technisch gericht
Ik wil graag een zoekmachine bouwen, zodat
mijn bezoekers het hele internet kunnen
doorzoeken!
Ik wil graag een zoekmachine bouwen, zodat
mijn bezoekers het hele internet kunnen
doorzoeken!
Wow, leuke klus!
Ik ga direct aan de slag
Alstublieft! Hier is de zoekmachine, mooi hè?
Alstublieft! Hier is de zoekmachine, mooi hè?
Jawel, mooie foto op de achtergrond. En
het zoeken werkt, maar ik bedoelde ook
dat bezoekers op afbeeldingen kunnen
zoeken!
Alstublieft! Hier is de zoekmachine, mooi hè?
Jawel, mooie foto op de achtergrond. En
het zoeken werkt, maar ik bedoelde ook
dat bezoekers op afbeeldingen kunnen
zoeken!
Ja zeg, daar kom je nu mee
Alstublieft! Hier is de zoekmachine, mooi hè?
Jawel, mooie foto op de achtergrond. En
het zoeken werkt, maar ik bedoelde ook
dat bezoekers op afbeeldingen kunnen
zoeken!
Ja zeg, daar kom je nu mee
SCHRIJF VOORBEELDEN!
Ter ondersteuning van de communicatie
STAPPENPLAN
1. Omschrijf de feature in één zin
2. Omschrijf de intentie
3. Schrijf realistische scenario’s
PRAKTIJK
Feature: {feature omschrijving}
{intentie}
As a {personage(s)}
I want {feature}
So that {intentie}
Scenario: {scenario omschrijving}
Given {context}
And {meer context}
When {actie}
Then {resultaat}
Scenario: ...
Informatie: http://dannorth.net/whats-in-a-story/
VOORBEELD ZOEKFUNCTIE
Feature: Search on the internet
As a bing.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 search the term “PHP”
Then I should see search results containing “PHP”
LEVENDE DOCUMENTATIE
• Alle features en scenario’s bij elkaar zijn de documentatie
• Bij een change request werk je deze documentatie daarom bij
OVERWEGINGEN
• Hoe gedetailleerd schrijf je de scenario’s?
• Wie leest/schrijft de scenario’s?
COMMUNICATIE IS DE FOCUS
Automatiseren is maar bijzaak
Developers zijn lui
AUTOMATISEREN
Kun je leren...
“A php framework for testing your business expectations.”
“Mink is an open source acceptance test framework for web
applications, written in PHP 5.3.”
+
+
AWESOME
COMPONENTENVAN EEN FUNCTIONELE
TESTSUITE
• Features
• Feature parser
• Browser controller client
• Browser controller/simulator
• Stappen programmeren met browser automatisering
COMPONENTENVAN EEN FUNCTIONELE
TESTSUITE
• Features
• Feature parser
• Browser controller client
• Browser controller/simulator
• Stappen programmeren met browser automatisering
Documentatie
COMPONENTENVAN EEN FUNCTIONELE
TESTSUITE
• Features
• Feature parser
• Browser controller client
• Browser controller/simulator
• Stappen programmeren met browser automatisering
Documentatie
Behat
COMPONENTENVAN EEN FUNCTIONELE
TESTSUITE
• Features
• Feature parser
• Browser controller client
• Browser controller/simulator
• Stappen programmeren met browser automatisering
Documentatie
Behat
Mink
COMPONENTENVAN EEN FUNCTIONELE
TESTSUITE
• Features
• Feature parser
• Browser controller client
• Browser controller/simulator
• Stappen programmeren met browser automatisering
Documentatie
Behat
Mink
Selenium, Sahi, Goutte, etc.
COMPONENTENVAN EEN FUNCTIONELE
TESTSUITE
• Features
• Feature parser
• Browser controller client
• Browser controller/simulator
• Stappen programmeren met browser automatisering
Documentatie
Behat
Mink
Selenium, Sahi, Goutte, etc.
MinkExtension
COMPONENTEN OVERZICHT
TOYOUR BATTLESTATIONS!
Tijd voor code
START DEVIRTUALBOX
$ vagrant up
Of importeer de OVA
Of gebruik je lokale PHP installatie
INSTALLERENVAN BEHAT
1. Maak een map genaamd “testsuite”
2. Installeer composer (http://docs.behat.org/quick_intro.html#installation)
3. Maak een bestand composer.json met de volgende inhoud:
4. $ php composer.phar install
{
"require": {
"behat/behat": "2.4.*@stable"
},
"minimum-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}
$ curl http://getcomposer.org/installer | php
INSTALLERENVAN BEHAT
1. Maak een map genaamd “testsuite”
2. Installeer composer (http://docs.behat.org/quick_intro.html#installation)
3. Maak een bestand composer.json met de volgende inhoud:
4. $ php composer.phar install
{
"require": {
"behat/behat": "2.4.*@stable"
},
"minimum-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}
That’s it!
$ curl http://getcomposer.org/installer | php
HELLO BEHAT
1. Initialiseer een Behat testsuite met het commando:
$ bin/behat --init
2. Behat heeft de volgende mappen en bestanden aangemaakt:
3. Run de testsuite: $ bin/behat
STEPS? (TERMINOLOGIE)
Feature: {feature omschrijving}
{intentie}
As a {personage(s)}
I want {feature}
So that {intentie}
Scenario: {scenario omschrijving}
Given {context}
And {meer context}
When {actie}
Then {resultaat}
Scenario: ...
STEPS? (TERMINOLOGIE)
Feature: {feature omschrijving}
{intentie}
As a {personage(s)}
I want {feature}
So that {intentie}
Scenario: {scenario omschrijving}
Given {context}
And {meer context}
When {actie}
Then {resultaat}
Scenario: ...
Feature, user story, module
STEPS? (TERMINOLOGIE)
Feature: {feature omschrijving}
{intentie}
As a {personage(s)}
I want {feature}
So that {intentie}
Scenario: {scenario omschrijving}
Given {context}
And {meer context}
When {actie}
Then {resultaat}
Scenario: ...
Feature, user story, module
Scenario
STEPS? (TERMINOLOGIE)
Feature: {feature omschrijving}
{intentie}
As a {personage(s)}
I want {feature}
So that {intentie}
Scenario: {scenario omschrijving}
Given {context}
And {meer context}
When {actie}
Then {resultaat}
Scenario: ...
Feature, user story, module
Scenario
Steps
VOORBEELD FEATURE
UITBREIDING COMPOSER.JSON
{
"require": {
"behat/behat": "2.4.*@stable",
"behat/mink-extension": "*",
"behat/mink": "*",
"behat/mink-selenium2-driver": "*",
"behat/mink-goutte-driver": "*",
"behat/mink-zombie-driver": "*",
"behat/mink-sahi-driver": "*"
},
"minimum-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}
$ composer.phar update
VOORBEELD ZOEKFUNCTIE
Feature: Search on the internet
As a bing.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 search the term “PHP”
Then I should see search results containing “PHP”
features/search.feature
STEP DEFINITIES
/**
* @Given /^I am on the homepage$/
*/
public function iAmOnTheHomepage()
{
throw new PendingException();
}
/**
* @When /^I search the term "([^"]*)"$/
*/
public function iSearchTheTerm($arg1)
{
throw new PendingException();
}
Deze kun je in FeatureContext.php plaatsen, echter...
MINKEXTENSION
1. Is een set van (basis) voorgedefinieerde steps
2. Maakt gebruik van Mink
3. Maar... niet alle teksten van de steps zijn even bruikbaar
/**
* Opens homepage.
*
* @Given /^(?:|I )am on (?:|the )homepage$/
* @When /^(?:|I )go to (?:|the )homepage$/
*/
public function iAmOnHomepage()
{
$this->getSession()->visit($this->locatePath('/'));
}
MINKTERMINOLOGIE
• Driver = Browser controller/emulator
• Session = Browser
• Page = Document(Element)
• Element
• Selectors
• XPath
• CSS
• Named
./BEHAT.YML
default:
extensions:
BehatMinkExtensionExtension:
default_session: goutte
goutte: ~
base_url: "http://www.bing.com"
context:
parameters:
foo: "bar"
En dan....
$ bin/behat
MINK 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);
}
FEATURECONTEXT.PHP
• Alles wat je in beginsel nodig hebt
• De class voor je:
• Step definitions
• Hooks
• Initialisatie
STEP DEFINITIES MAKEN
/**
* @When /^I search the term "([^"]*)"$/
*/
public function iSearchTheTerm($searchTerm)
{
$this->fillField('q', $searchTerm); // Mink definities
$this->pressButton('go');
}
/**
* @When /^I search the term "([^"]*)"$/
*/
public function iSearchTheTerm($searchTerm)
{
$page = $this->getSession()->getPage();
$page->fillField('q', $searchTerm);
$page->pressButton('go');
}
UITKOMST
SELECTORS
• Selecteren van elementen
• XPath, CSS, Names
$elements = $page->findAll('xpath', './/div[@class="sa_mc"]');
$elements = $page->findAll('css', 'div[class="sa_mc"]');
$elements = $page->findAll('named', array('link', 'Register');
$elements = $page->findAll('named', array('button', 'Search');
DE LAATSTE STAP
Then I should see search results containing “PHP”
/**
* @Then /^I should see search results containing (.*)$/
*/
public function iShouldSeeSearchResultsContaining($searchTerm)
{
$searchTerm = quotemeta($searchTerm);
$regex = sprintf('/%s/mi', $searchTerm);
$page = $this->getSession()->getPage();
$elements = $page->findAll('xpath', './/div[@class="sa_mc"]');
foreach ($elements as $element) {
if (!preg_match($regex, $element->getText())) {
throw new Exception('One of the elements did not match the searchterm');
}
}
}
PROFIELEN
• Volledige configuratie per omgeving
• Selectie op basis van filters
• Te definieren in behat.yml:
• Aan te roepen met: $ bin/behat --profile profielnaam
default:
extension:
BehatMinkExtensionContextMinkContext
base_url: “http://www.example.org”
profielnaam:
extension:
BehatMinkExtensionContextMinkContext
base_url: “http://acc.example.org”
TAGS
• Handig om selectie te maken van features/scenario’s
• Via command line: $ bin/behat --tags “@slow”
• Definieer als filters in profile
@smoke
Feature: Search on the www
@slow
Scenario: ...
search.feature
slowonly:
filters:
tags: “@slow”
behat.yml
fast:
filters:
tags: “~@slow”
behat.yml
FILTERS
• Tests groeperen
• Snel vs. traag
• Tags
• Configuratie in behat.yml
smoketests:
filters:
tags: “@smoketest&&~@wip”
development:
filters:
tags: “~@slow&&~@wip”
HOOKS
• @beforeSuite
• @beforeFeature
• @beforeScenario
• @beforeStep
• @afterSuite
• @afterFeature
• @afterScenario
• @afterStep
HOOKS
/**
* @afterScenario
*/
public function logoutUser()
{
$this->visit('/logout');
}
features/bootstrap/FeatureContext.php
BROWSER CONTROLLERS
Javascript Snelheid Opmerking
Goutte Nee ++ Emulator
Selenium2 Ja -
Sahi Ja ~
Geen response
statuscode, headers,
authenticatie
Zombie.js Ja +
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 |
DRIVER BENCHMARK
Goutte 2.736ms
Selenium2 16.682ms
Sahi ???
Zombie.js 7.533ms
2007
0 5,000 10,000 15,000 20,000
Goutte Selenium Zombie.js
MULTILINEVARIABLES
Scenario:
Given I input that spans several lines
"""
Test one
two three
"""
/**
* @Given /^I input that spans several lines$/
*/
public function iInputThatSpansSeveralLines(PyStringNode $string)
{
(string) $string;
$string->getRaw(); // string
$string->getLines(); // array
}
TABLES
Scenario:
Given the following users are registered
| name | password |
| Foo | test123 |
| Admin | secret |
When I go to the user overview
Then I should see Foo
And I should see Admin
/**
* @Given /^the following users are registered$/
*/
public function theFollowingUsersAreRegistered(TableNode $table)
{
foreach ($table->getHash() as $row) {
// ... $row['name'], $row['password']
}
}
LETTHERE BETESTING!
BEDANKT
• Feedback: http://joind.in/talk/view/8566
• Vragen?
• @Richard_Tuin
• richardtuin@gmail.com
• skype: richardtuin

More Related Content

Similar to PFZ Workshop - Automatiseren van functionele tests

Flex In De Praktijk
Flex In De PraktijkFlex In De Praktijk
Flex In De Praktijkmarcel panse
 
Webinar product backlog management.pdf
Webinar product backlog management.pdfWebinar product backlog management.pdf
Webinar product backlog management.pdfDelta-N
 
Nord Toelichting Techniek
Nord Toelichting TechniekNord Toelichting Techniek
Nord Toelichting Techniektjercus
 
How Oracle Management Cloud enabled a successful scratch of a 7-year old per...
How Oracle Management Cloud enabled a successful scratch of a 7-year old per...How Oracle Management Cloud enabled a successful scratch of a 7-year old per...
How Oracle Management Cloud enabled a successful scratch of a 7-year old per...Lucas Jellema
 
Niet onderhoudbare software in 10 makkelijke stappen
Niet onderhoudbare software in 10 makkelijke stappenNiet onderhoudbare software in 10 makkelijke stappen
Niet onderhoudbare software in 10 makkelijke stappenRick Beerendonk
 
Take control of your deployments with Release Management
Take control of your deployments with Release ManagementTake control of your deployments with Release Management
Take control of your deployments with Release ManagementRick van den Bosch
 
Sdb Presentatie
Sdb PresentatieSdb Presentatie
Sdb Presentatiemenfey
 
Projectpaas drupaljam 2013 rotterdam
Projectpaas drupaljam 2013 rotterdamProjectpaas drupaljam 2013 rotterdam
Projectpaas drupaljam 2013 rotterdamBert Boerland
 
Web applicatie van scratch
Web applicatie van scratchWeb applicatie van scratch
Web applicatie van scratchHanzehogeschool
 
Versiebeheer van database changes
Versiebeheer van database changesVersiebeheer van database changes
Versiebeheer van database changesArjen van Vliet
 
Getting Real [Dutch]
Getting Real [Dutch]Getting Real [Dutch]
Getting Real [Dutch]Niels Bruin
 
XPages Introductie
XPages IntroductieXPages Introductie
XPages IntroductieRob Bontekoe
 
WordPress plugin development
WordPress plugin developmentWordPress plugin development
WordPress plugin developmentLuc De Brouwer
 
IMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens NeudeckerIMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens NeudeckerIMPACT Centre of Competence
 
Profiel thymos rudi respen
Profiel thymos   rudi respenProfiel thymos   rudi respen
Profiel thymos rudi respenRudi Respen
 
FlightCheck Online - Do More 2007
FlightCheck Online - Do More 2007FlightCheck Online - Do More 2007
FlightCheck Online - Do More 2007arnold
 
De 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentDe 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentFloris Lof
 
Deployment strategieën, WP Meetup Enschede, 26-02-2015
Deployment strategieën, WP Meetup Enschede, 26-02-2015Deployment strategieën, WP Meetup Enschede, 26-02-2015
Deployment strategieën, WP Meetup Enschede, 26-02-2015Arjan Snaterse
 

Similar to PFZ Workshop - Automatiseren van functionele tests (20)

Flex In De Praktijk
Flex In De PraktijkFlex In De Praktijk
Flex In De Praktijk
 
Webinar product backlog management.pdf
Webinar product backlog management.pdfWebinar product backlog management.pdf
Webinar product backlog management.pdf
 
Nord Toelichting Techniek
Nord Toelichting TechniekNord Toelichting Techniek
Nord Toelichting Techniek
 
Starlogic Framework
Starlogic FrameworkStarlogic Framework
Starlogic Framework
 
How Oracle Management Cloud enabled a successful scratch of a 7-year old per...
How Oracle Management Cloud enabled a successful scratch of a 7-year old per...How Oracle Management Cloud enabled a successful scratch of a 7-year old per...
How Oracle Management Cloud enabled a successful scratch of a 7-year old per...
 
Niet onderhoudbare software in 10 makkelijke stappen
Niet onderhoudbare software in 10 makkelijke stappenNiet onderhoudbare software in 10 makkelijke stappen
Niet onderhoudbare software in 10 makkelijke stappen
 
Take control of your deployments with Release Management
Take control of your deployments with Release ManagementTake control of your deployments with Release Management
Take control of your deployments with Release Management
 
Sdb Presentatie
Sdb PresentatieSdb Presentatie
Sdb Presentatie
 
Projectpaas drupaljam 2013 rotterdam
Projectpaas drupaljam 2013 rotterdamProjectpaas drupaljam 2013 rotterdam
Projectpaas drupaljam 2013 rotterdam
 
Web applicatie van scratch
Web applicatie van scratchWeb applicatie van scratch
Web applicatie van scratch
 
Versiebeheer van database changes
Versiebeheer van database changesVersiebeheer van database changes
Versiebeheer van database changes
 
Getting Real [Dutch]
Getting Real [Dutch]Getting Real [Dutch]
Getting Real [Dutch]
 
XPages Introductie
XPages IntroductieXPages Introductie
XPages Introductie
 
WordPress plugin development
WordPress plugin developmentWordPress plugin development
WordPress plugin development
 
IMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens NeudeckerIMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens Neudecker
 
Profiel thymos rudi respen
Profiel thymos   rudi respenProfiel thymos   rudi respen
Profiel thymos rudi respen
 
FlightCheck Online - Do More 2007
FlightCheck Online - Do More 2007FlightCheck Online - Do More 2007
FlightCheck Online - Do More 2007
 
De 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentDe 10 geboden van WordPress Development
De 10 geboden van WordPress Development
 
New and improved ASP.NET MVC 5
New and improved ASP.NET MVC 5New and improved ASP.NET MVC 5
New and improved ASP.NET MVC 5
 
Deployment strategieën, WP Meetup Enschede, 26-02-2015
Deployment strategieën, WP Meetup Enschede, 26-02-2015Deployment strategieën, WP Meetup Enschede, 26-02-2015
Deployment strategieën, WP Meetup Enschede, 26-02-2015
 

PFZ Workshop - Automatiseren van functionele tests

  • 1. WORKSHOPDAG 27 APRIL 2013 Automatiseren van functionele tests met Behat en Mink &
  • 2. VOORBEREIDING • Download en installeerVirtualbox (https://www.virtualbox.org/) • Download en installeerVagrant (http://www.vagrantup.com/) • https://github.com/pfznl/wsd13-functionaltesting/ • $ git clone https://github.com/pfznl/wsd13-functionaltesting.git • $ cd wsd13-functionaltesting • $ vagrant up • ??? • Profit
  • 3. WAT HEB JE NODIG? • Computer/laptop • PHP 5.3 • [Java] (als je selenium wilt draaien) • Virtualbox • [Vagrant] https://github.com/pfznl/wsd13-functionaltesting/
  • 4. EVENVOORSTELLEN • @Richard_Tuin • Software ontwikkelaar • Speciale interesse in kwaliteit • Werkzaam bij Enrise
  • 5. EN WIE ZIJN JULLIE?
  • 6. HET PROBLEEM • Verschillend beeld op scope/werking van de oplevering • De klant weet soms achteraf pas hoe het systeem precies gebruikt kan worden • “Het is wel mooi, maar zou x toch y kunnen werken?” • “Bedankt voor de nieuwe feature, maar nu werkt x niet meer”
  • 7. HET PROBLEEM • Verschillend beeld op scope/werking van de oplevering • De klant weet soms achteraf pas hoe het systeem precies gebruikt kan worden • “Het is wel mooi, maar zou x toch y kunnen werken?” • “Bedankt voor de nieuwe feature, maar nu werkt x niet meer”
  • 8. WANT EIGENLIJK... • ... hebben we een gezamenlijk doel • ... willen we wat we gaan bouwen zo nauwkeurig mogelijk definiëren • ... willen we constante kwaliteit leveren
  • 9. MAAR ER IS NOG EEN PROBLEEM...
  • 11. DAT BETEKENT DAT... • ... we beter, en op gelijk niveau moeten communiceren • ... we een documentatiesysteem moeten bedenken voor de afstemming • ... we regelmatig moeten valideren dat wat we leveren nog volgens specificaties is
  • 12. DAT BETEKENT DAT... • ... we beter, en op gelijk niveau moeten communiceren • ... we een documentatiesysteem moeten bedenken voor de afstemming • ... we regelmatig moeten valideren dat wat we leveren nog volgens specificaties is Automatiseren?
  • 15. LATEN WE BIJ HET BEGIN BEGINNEN... (dus nog even geen code)
  • 16. KWALITEIT Wat is dat nou eigenlijk?
  • 17. KWALITEIT = SOFTWARE DIE AAN DE EISEN VOLDOET
  • 18. HOE ZORG JE DANVOOR KWALITEIT?
  • 23. AGILE MANIFESTO Mensen en hun onderlinge interactie > processen and tools Werkende software > allesomvattende documentatie Samenwerking met de klant > contractonderhandelingen Inspelen op verandering > het volgen van een plan
  • 28. OPSTELLENVAN REQUIREMENTS • Omschrijven hoe een probleem opgelost wordt • Gezamenlijk met de klant opstellen • In de taal (technische) van de klant • Functioneel gericht, niet technisch gericht
  • 29. Ik wil graag een zoekmachine bouwen, zodat mijn bezoekers het hele internet kunnen doorzoeken!
  • 30. Ik wil graag een zoekmachine bouwen, zodat mijn bezoekers het hele internet kunnen doorzoeken! Wow, leuke klus! Ik ga direct aan de slag
  • 31. Alstublieft! Hier is de zoekmachine, mooi hè?
  • 32. Alstublieft! Hier is de zoekmachine, mooi hè? Jawel, mooie foto op de achtergrond. En het zoeken werkt, maar ik bedoelde ook dat bezoekers op afbeeldingen kunnen zoeken!
  • 33. Alstublieft! Hier is de zoekmachine, mooi hè? Jawel, mooie foto op de achtergrond. En het zoeken werkt, maar ik bedoelde ook dat bezoekers op afbeeldingen kunnen zoeken! Ja zeg, daar kom je nu mee
  • 34. Alstublieft! Hier is de zoekmachine, mooi hè? Jawel, mooie foto op de achtergrond. En het zoeken werkt, maar ik bedoelde ook dat bezoekers op afbeeldingen kunnen zoeken! Ja zeg, daar kom je nu mee
  • 36. STAPPENPLAN 1. Omschrijf de feature in één zin 2. Omschrijf de intentie 3. Schrijf realistische scenario’s
  • 37. PRAKTIJK Feature: {feature omschrijving} {intentie} As a {personage(s)} I want {feature} So that {intentie} Scenario: {scenario omschrijving} Given {context} And {meer context} When {actie} Then {resultaat} Scenario: ... Informatie: http://dannorth.net/whats-in-a-story/
  • 38. VOORBEELD ZOEKFUNCTIE Feature: Search on the internet As a bing.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 search the term “PHP” Then I should see search results containing “PHP”
  • 39. LEVENDE DOCUMENTATIE • Alle features en scenario’s bij elkaar zijn de documentatie • Bij een change request werk je deze documentatie daarom bij
  • 40. OVERWEGINGEN • Hoe gedetailleerd schrijf je de scenario’s? • Wie leest/schrijft de scenario’s?
  • 41. COMMUNICATIE IS DE FOCUS Automatiseren is maar bijzaak
  • 44. “A php framework for testing your business expectations.”
  • 45. “Mink is an open source acceptance test framework for web applications, written in PHP 5.3.”
  • 46. +
  • 48. COMPONENTENVAN EEN FUNCTIONELE TESTSUITE • Features • Feature parser • Browser controller client • Browser controller/simulator • Stappen programmeren met browser automatisering
  • 49. COMPONENTENVAN EEN FUNCTIONELE TESTSUITE • Features • Feature parser • Browser controller client • Browser controller/simulator • Stappen programmeren met browser automatisering Documentatie
  • 50. COMPONENTENVAN EEN FUNCTIONELE TESTSUITE • Features • Feature parser • Browser controller client • Browser controller/simulator • Stappen programmeren met browser automatisering Documentatie Behat
  • 51. COMPONENTENVAN EEN FUNCTIONELE TESTSUITE • Features • Feature parser • Browser controller client • Browser controller/simulator • Stappen programmeren met browser automatisering Documentatie Behat Mink
  • 52. COMPONENTENVAN EEN FUNCTIONELE TESTSUITE • Features • Feature parser • Browser controller client • Browser controller/simulator • Stappen programmeren met browser automatisering Documentatie Behat Mink Selenium, Sahi, Goutte, etc.
  • 53. COMPONENTENVAN EEN FUNCTIONELE TESTSUITE • Features • Feature parser • Browser controller client • Browser controller/simulator • Stappen programmeren met browser automatisering Documentatie Behat Mink Selenium, Sahi, Goutte, etc. MinkExtension
  • 56. START DEVIRTUALBOX $ vagrant up Of importeer de OVA Of gebruik je lokale PHP installatie
  • 57. INSTALLERENVAN BEHAT 1. Maak een map genaamd “testsuite” 2. Installeer composer (http://docs.behat.org/quick_intro.html#installation) 3. Maak een bestand composer.json met de volgende inhoud: 4. $ php composer.phar install { "require": { "behat/behat": "2.4.*@stable" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" } } $ curl http://getcomposer.org/installer | php
  • 58. INSTALLERENVAN BEHAT 1. Maak een map genaamd “testsuite” 2. Installeer composer (http://docs.behat.org/quick_intro.html#installation) 3. Maak een bestand composer.json met de volgende inhoud: 4. $ php composer.phar install { "require": { "behat/behat": "2.4.*@stable" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" } } That’s it! $ curl http://getcomposer.org/installer | php
  • 59. HELLO BEHAT 1. Initialiseer een Behat testsuite met het commando: $ bin/behat --init 2. Behat heeft de volgende mappen en bestanden aangemaakt: 3. Run de testsuite: $ bin/behat
  • 60. STEPS? (TERMINOLOGIE) Feature: {feature omschrijving} {intentie} As a {personage(s)} I want {feature} So that {intentie} Scenario: {scenario omschrijving} Given {context} And {meer context} When {actie} Then {resultaat} Scenario: ...
  • 61. STEPS? (TERMINOLOGIE) Feature: {feature omschrijving} {intentie} As a {personage(s)} I want {feature} So that {intentie} Scenario: {scenario omschrijving} Given {context} And {meer context} When {actie} Then {resultaat} Scenario: ... Feature, user story, module
  • 62. STEPS? (TERMINOLOGIE) Feature: {feature omschrijving} {intentie} As a {personage(s)} I want {feature} So that {intentie} Scenario: {scenario omschrijving} Given {context} And {meer context} When {actie} Then {resultaat} Scenario: ... Feature, user story, module Scenario
  • 63. STEPS? (TERMINOLOGIE) Feature: {feature omschrijving} {intentie} As a {personage(s)} I want {feature} So that {intentie} Scenario: {scenario omschrijving} Given {context} And {meer context} When {actie} Then {resultaat} Scenario: ... Feature, user story, module Scenario Steps
  • 65. UITBREIDING COMPOSER.JSON { "require": { "behat/behat": "2.4.*@stable", "behat/mink-extension": "*", "behat/mink": "*", "behat/mink-selenium2-driver": "*", "behat/mink-goutte-driver": "*", "behat/mink-zombie-driver": "*", "behat/mink-sahi-driver": "*" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" } } $ composer.phar update
  • 66. VOORBEELD ZOEKFUNCTIE Feature: Search on the internet As a bing.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 search the term “PHP” Then I should see search results containing “PHP” features/search.feature
  • 67. STEP DEFINITIES /** * @Given /^I am on the homepage$/ */ public function iAmOnTheHomepage() { throw new PendingException(); } /** * @When /^I search the term "([^"]*)"$/ */ public function iSearchTheTerm($arg1) { throw new PendingException(); } Deze kun je in FeatureContext.php plaatsen, echter...
  • 68. MINKEXTENSION 1. Is een set van (basis) voorgedefinieerde steps 2. Maakt gebruik van Mink 3. Maar... niet alle teksten van de steps zijn even bruikbaar /** * Opens homepage. * * @Given /^(?:|I )am on (?:|the )homepage$/ * @When /^(?:|I )go to (?:|the )homepage$/ */ public function iAmOnHomepage() { $this->getSession()->visit($this->locatePath('/')); }
  • 69. MINKTERMINOLOGIE • Driver = Browser controller/emulator • Session = Browser • Page = Document(Element) • Element • Selectors • XPath • CSS • Named
  • 70. ./BEHAT.YML default: extensions: BehatMinkExtensionExtension: default_session: goutte goutte: ~ base_url: "http://www.bing.com" context: parameters: foo: "bar" En dan.... $ bin/behat
  • 71. MINK 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); }
  • 72. FEATURECONTEXT.PHP • Alles wat je in beginsel nodig hebt • De class voor je: • Step definitions • Hooks • Initialisatie
  • 73. STEP DEFINITIES MAKEN /** * @When /^I search the term "([^"]*)"$/ */ public function iSearchTheTerm($searchTerm) { $this->fillField('q', $searchTerm); // Mink definities $this->pressButton('go'); } /** * @When /^I search the term "([^"]*)"$/ */ public function iSearchTheTerm($searchTerm) { $page = $this->getSession()->getPage(); $page->fillField('q', $searchTerm); $page->pressButton('go'); }
  • 75. SELECTORS • Selecteren van elementen • XPath, CSS, Names $elements = $page->findAll('xpath', './/div[@class="sa_mc"]'); $elements = $page->findAll('css', 'div[class="sa_mc"]'); $elements = $page->findAll('named', array('link', 'Register'); $elements = $page->findAll('named', array('button', 'Search');
  • 76. DE LAATSTE STAP Then I should see search results containing “PHP” /** * @Then /^I should see search results containing (.*)$/ */ public function iShouldSeeSearchResultsContaining($searchTerm) { $searchTerm = quotemeta($searchTerm); $regex = sprintf('/%s/mi', $searchTerm); $page = $this->getSession()->getPage(); $elements = $page->findAll('xpath', './/div[@class="sa_mc"]'); foreach ($elements as $element) { if (!preg_match($regex, $element->getText())) { throw new Exception('One of the elements did not match the searchterm'); } } }
  • 77. PROFIELEN • Volledige configuratie per omgeving • Selectie op basis van filters • Te definieren in behat.yml: • Aan te roepen met: $ bin/behat --profile profielnaam default: extension: BehatMinkExtensionContextMinkContext base_url: “http://www.example.org” profielnaam: extension: BehatMinkExtensionContextMinkContext base_url: “http://acc.example.org”
  • 78. TAGS • Handig om selectie te maken van features/scenario’s • Via command line: $ bin/behat --tags “@slow” • Definieer als filters in profile @smoke Feature: Search on the www @slow Scenario: ... search.feature slowonly: filters: tags: “@slow” behat.yml fast: filters: tags: “~@slow” behat.yml
  • 79. FILTERS • Tests groeperen • Snel vs. traag • Tags • Configuratie in behat.yml smoketests: filters: tags: “@smoketest&&~@wip” development: filters: tags: “~@slow&&~@wip”
  • 80. HOOKS • @beforeSuite • @beforeFeature • @beforeScenario • @beforeStep • @afterSuite • @afterFeature • @afterScenario • @afterStep
  • 81. HOOKS /** * @afterScenario */ public function logoutUser() { $this->visit('/logout'); } features/bootstrap/FeatureContext.php
  • 82. BROWSER CONTROLLERS Javascript Snelheid Opmerking Goutte Nee ++ Emulator Selenium2 Ja - Sahi Ja ~ Geen response statuscode, headers, authenticatie Zombie.js Ja +
  • 83. 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 |
  • 84. DRIVER BENCHMARK Goutte 2.736ms Selenium2 16.682ms Sahi ??? Zombie.js 7.533ms 2007 0 5,000 10,000 15,000 20,000 Goutte Selenium Zombie.js
  • 85. MULTILINEVARIABLES Scenario: Given I input that spans several lines """ Test one two three """ /** * @Given /^I input that spans several lines$/ */ public function iInputThatSpansSeveralLines(PyStringNode $string) { (string) $string; $string->getRaw(); // string $string->getLines(); // array }
  • 86. TABLES Scenario: Given the following users are registered | name | password | | Foo | test123 | | Admin | secret | When I go to the user overview Then I should see Foo And I should see Admin /** * @Given /^the following users are registered$/ */ public function theFollowingUsersAreRegistered(TableNode $table) { foreach ($table->getHash() as $row) { // ... $row['name'], $row['password'] } }
  • 88. BEDANKT • Feedback: http://joind.in/talk/view/8566 • Vragen? • @Richard_Tuin • richardtuin@gmail.com • skype: richardtuin