Top Banner
WORKSHOPDAG 27 APRIL 2013 Automatiseren van functionele tests met Behat en Mink &
88

PFZ Workshop - Automatiseren van functionele tests

Aug 21, 2015

Download

Technology

Richard Tuin
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PFZ Workshop - Automatiseren van functionele tests

WORKSHOPDAG 27 APRIL 2013Automatiseren van functionele tests met Behat en Mink

&

Page 2: PFZ Workshop - Automatiseren van functionele tests

VOORBEREIDING• Download en installeer Virtualbox (https://www.virtualbox.org/)

• Download en installeer Vagrant (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

Page 3: PFZ Workshop - Automatiseren van functionele tests

WAT HEB JE NODIG?• Computer/laptop

• PHP 5.3

• [Java] (als je selenium wilt draaien)

• Virtualbox

• [Vagrant]

https://github.com/pfznl/wsd13-functionaltesting/

Page 4: PFZ Workshop - Automatiseren van functionele tests

EVEN VOORSTELLEN

• @Richard_Tuin

• Software ontwikkelaar

• Speciale interesse in kwaliteit

• Werkzaam bij Enrise

Page 5: PFZ Workshop - Automatiseren van functionele tests

EN WIE ZIJN JULLIE?

Page 6: PFZ Workshop - Automatiseren van functionele tests

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”

Page 7: PFZ Workshop - Automatiseren van functionele tests

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”

Page 8: PFZ Workshop - Automatiseren van functionele tests

WANT EIGENLIJK...

• ... hebben we een gezamenlijk doel

• ... willen we wat we gaan bouwen zo nauwkeurig mogelijk definiëren

• ... willen we constante kwaliteit leveren

Page 9: PFZ Workshop - Automatiseren van functionele tests

MAAR ER IS NOG EEN PROBLEEM...

Page 10: PFZ Workshop - Automatiseren van functionele tests

Developers zijn lui

Page 11: PFZ Workshop - Automatiseren van functionele tests

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

Page 12: PFZ Workshop - Automatiseren van functionele tests

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?

Page 13: PFZ Workshop - Automatiseren van functionele tests

SAMENWERKEN & DOCUMENTEREN

Page 14: PFZ Workshop - Automatiseren van functionele tests

REGELMATIG (HER)VALIDEREN VAN ACCEPTATIECRITERIA

Documentatie

Page 15: PFZ Workshop - Automatiseren van functionele tests

LATEN WE BIJ HET BEGIN BEGINNEN...(dus nog even geen code)

Page 16: PFZ Workshop - Automatiseren van functionele tests

KWALITEITWat is dat nou eigenlijk?

Page 17: PFZ Workshop - Automatiseren van functionele tests

KWALITEIT=

SOFTWARE DIE AAN DE EISEN VOLDOET

Page 18: PFZ Workshop - Automatiseren van functionele tests

HOE ZORG JE DAN VOOR KWALITEIT?

Page 19: PFZ Workshop - Automatiseren van functionele tests

SAMENWERKEN & DOCUMENTEREN

Page 20: PFZ Workshop - Automatiseren van functionele tests

ITERATIEFis het sleutelwoord

Page 21: PFZ Workshop - Automatiseren van functionele tests

ITERATIEF“Stapsgewijs naar een optimum gaan.”

Page 22: PFZ Workshop - Automatiseren van functionele tests

SOFTWAREONTWIKKELING

Page 23: PFZ Workshop - Automatiseren van functionele tests

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

Page 24: PFZ Workshop - Automatiseren van functionele tests

SAMENWERKEN EN DOCUMENTEREN

Page 25: PFZ Workshop - Automatiseren van functionele tests

SAMENWERKEN EN DOCUMENTEREN

1

Page 26: PFZ Workshop - Automatiseren van functionele tests

SAMENWERKEN EN DOCUMENTEREN

1

2

Page 27: PFZ Workshop - Automatiseren van functionele tests

SAMENWERKEN EN DOCUMENTEREN

1

2

3

Page 28: PFZ Workshop - Automatiseren van functionele tests

OPSTELLEN VAN REQUIREMENTS

• Omschrijven hoe een probleem opgelost wordt

• Gezamenlijk met de klant opstellen

• In de taal (technische) van de klant

• Functioneel gericht, niet technisch gericht

Page 29: PFZ Workshop - Automatiseren van functionele tests

Ik wil graag een zoekmachine bouwen, zodat mijn bezoekers het hele internet kunnen

doorzoeken!

Page 30: PFZ Workshop - Automatiseren van functionele tests

Ik wil graag een zoekmachine bouwen, zodat mijn bezoekers het hele internet kunnen

doorzoeken!

Wow, leuke klus!Ik ga direct aan de slag

Page 31: PFZ Workshop - Automatiseren van functionele tests

Alstublieft! Hier is de zoekmachine, mooi hè?

Page 32: PFZ Workshop - Automatiseren van functionele tests

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!

Page 33: PFZ Workshop - Automatiseren van functionele tests

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

Page 34: PFZ Workshop - Automatiseren van functionele tests

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

Page 35: PFZ Workshop - Automatiseren van functionele tests

SCHRIJF VOORBEELDEN!Ter ondersteuning van de communicatie

Page 36: PFZ Workshop - Automatiseren van functionele tests

STAPPENPLAN

1. Omschrijf de feature in één zin

2. Omschrijf de intentie

3. Schrijf realistische scenario’s

Page 37: PFZ Workshop - Automatiseren van functionele tests

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/

Page 38: PFZ Workshop - Automatiseren van functionele tests

VOORBEELD ZOEKFUNCTIEFeature: 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”

Page 39: PFZ Workshop - Automatiseren van functionele tests

LEVENDE DOCUMENTATIE

• Alle features en scenario’s bij elkaar zijn de documentatie

• Bij een change request werk je deze documentatie daarom bij

Page 40: PFZ Workshop - Automatiseren van functionele tests

OVERWEGINGEN

• Hoe gedetailleerd schrijf je de scenario’s?

• Wie leest/schrijft de scenario’s?

Page 41: PFZ Workshop - Automatiseren van functionele tests

COMMUNICATIE IS DE FOCUSAutomatiseren is maar bijzaak

Page 42: PFZ Workshop - Automatiseren van functionele tests

Developers zijn lui

Page 43: PFZ Workshop - Automatiseren van functionele tests

AUTOMATISERENKun je leren...

Page 44: PFZ Workshop - Automatiseren van functionele tests

“A php framework for testing your business expectations.”

Page 45: PFZ Workshop - Automatiseren van functionele tests

“Mink is an open source acceptance test framework for web applications, written in PHP 5.3.”

Page 46: PFZ Workshop - Automatiseren van functionele tests

+

Page 47: PFZ Workshop - Automatiseren van functionele tests

+

AWESOME

Page 48: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN VAN EEN FUNCTIONELE TESTSUITE

• Features

• Feature parser

• Browser controller client

• Browser controller/simulator

• Stappen programmeren met browser automatisering

Page 49: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN VAN EEN FUNCTIONELE TESTSUITE

• Features

• Feature parser

• Browser controller client

• Browser controller/simulator

• Stappen programmeren met browser automatisering

Documentatie

Page 50: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN VAN EEN FUNCTIONELE TESTSUITE

• Features

• Feature parser

• Browser controller client

• Browser controller/simulator

• Stappen programmeren met browser automatisering

Documentatie

Behat

Page 51: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN VAN EEN FUNCTIONELE TESTSUITE

• Features

• Feature parser

• Browser controller client

• Browser controller/simulator

• Stappen programmeren met browser automatisering

Documentatie

Behat

Mink

Page 52: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN VAN EEN FUNCTIONELE TESTSUITE

• Features

• Feature parser

• Browser controller client

• Browser controller/simulator

• Stappen programmeren met browser automatisering

Documentatie

Behat

Mink

Selenium, Sahi, Goutte, etc.

Page 53: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN VAN 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

Page 54: PFZ Workshop - Automatiseren van functionele tests

COMPONENTEN OVERZICHT

Page 55: PFZ Workshop - Automatiseren van functionele tests

TO YOUR BATTLESTATIONS!Tijd voor code

Page 56: PFZ Workshop - Automatiseren van functionele tests

START DE VIRTUALBOX$ vagrant up

Of importeer de OVAOf gebruik je lokale PHP installatie

Page 57: PFZ Workshop - Automatiseren van functionele tests

INSTALLEREN VAN BEHAT1. 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

Page 58: PFZ Workshop - Automatiseren van functionele tests

INSTALLEREN VAN BEHAT1. 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

Page 59: PFZ Workshop - Automatiseren van functionele tests

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

Page 60: PFZ Workshop - Automatiseren van functionele tests

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: ...

Page 61: PFZ Workshop - Automatiseren van functionele tests

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

Page 62: PFZ Workshop - Automatiseren van functionele tests

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

Page 63: PFZ Workshop - Automatiseren van functionele tests

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

Page 64: PFZ Workshop - Automatiseren van functionele tests

VOORBEELD FEATURE

Page 65: PFZ Workshop - Automatiseren van functionele tests

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

Page 66: PFZ Workshop - Automatiseren van functionele tests

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

Page 67: PFZ Workshop - Automatiseren van functionele tests

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...

Page 68: PFZ Workshop - Automatiseren van functionele tests

MINKEXTENSION1. 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('/'));}

Page 69: PFZ Workshop - Automatiseren van functionele tests

MINK TERMINOLOGIE

• Driver = Browser controller/emulator• Session = Browser• Page = Document(Element)

• Element• Selectors

• XPath• CSS• Named

Page 70: PFZ Workshop - Automatiseren van functionele tests

./BEHAT.YMLdefault: extensions: Behat\MinkExtension\Extension: default_session: goutte goutte: ~ base_url: "http://www.bing.com" context: parameters: foo: "bar"

En dan....

$ bin/behat

Page 71: PFZ Workshop - Automatiseren van functionele tests

MINK STEPSGiven /^(?:|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);}

Page 72: PFZ Workshop - Automatiseren van functionele tests

FEATURECONTEXT.PHP

• Alles wat je in beginsel nodig hebt

• De class voor je:

• Step definitions

• Hooks

• Initialisatie

Page 73: PFZ Workshop - Automatiseren van functionele tests

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');}

Page 74: PFZ Workshop - Automatiseren van functionele tests

UITKOMST

Page 75: PFZ Workshop - Automatiseren van functionele tests

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');

Page 76: PFZ Workshop - Automatiseren van functionele tests

DE LAATSTE STAPThen 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'); } }}

Page 77: PFZ Workshop - Automatiseren van functionele tests

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: Behat\MinkExtension\Context\MinkContext base_url: “http://www.example.org”profielnaam: extension: Behat\MinkExtension\Context\MinkContext base_url: “http://acc.example.org”

Page 78: PFZ Workshop - Automatiseren van functionele tests

TAGS• Handig om selectie te maken van features/scenario’s

• Via command line: $ bin/behat --tags “@slow”

• Definieer als filters in profile

@smokeFeature: Search on the www@slowScenario: ...

search.feature

slowonly: filters: tags: “@slow”

behat.ymlfast: filters: tags: “~@slow”

behat.yml

Page 79: PFZ Workshop - Automatiseren van functionele tests

FILTERS• Tests groeperen• Snel vs. traag• Tags• Configuratie in behat.ymlsmoketests: filters: tags: “@smoketest&&~@wip”development: filters: tags: “~@slow&&~@wip”

Page 80: PFZ Workshop - Automatiseren van functionele tests

HOOKS

• @beforeSuite

• @beforeFeature

• @beforeScenario

• @beforeStep

• @afterSuite

• @afterFeature

• @afterScenario

• @afterStep

Page 81: PFZ Workshop - Automatiseren van functionele tests

HOOKS/** * @afterScenario */public function logoutUser(){ $this->visit('/logout');}

features/bootstrap/FeatureContext.php

Page 82: PFZ Workshop - Automatiseren van functionele tests

BROWSER CONTROLLERS

Javascript Snelheid Opmerking

Goutte Nee ++ Emulator

Selenium2 Ja -

Sahi Ja ~Geen response

statuscode, headers, authenticatie

Zombie.js Ja +

Page 83: PFZ Workshop - Automatiseren van functionele tests

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 |

Page 84: PFZ Workshop - Automatiseren van functionele tests

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

Page 85: PFZ Workshop - Automatiseren van functionele tests

MULTILINE VARIABLES 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}

Page 86: PFZ Workshop - Automatiseren van functionele tests

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'] }}

Page 87: PFZ Workshop - Automatiseren van functionele tests

LET THERE BE TESTING!

Page 88: PFZ Workshop - Automatiseren van functionele tests

BEDANKT

• Feedback: http://joind.in/talk/view/8566

• Vragen?

• @Richard_Tuin

[email protected]

• skype: richardtuin