SlideShare a Scribd company logo
1 of 73
Download to read offline
Spec BDD WITH 


PHPSPEC 2
November Camp

Stockholm 22/11/2013
flickr.com/arnolouise/3252847397/
Kacper Gunia @cakper
Software Engineer @SensioLabsUK
Symfony Certified Developer
Polish Symfony Community
Silesian PHP User Group
Softw
are
Quality
flickr.com/adforce1/2462794123/
INTERNAL
Quality
flickr.com/ensh/5084228263/
EXTERNAL
Quality
flickr.com/arselectronicacenter/8695704856/
INTERNAL
vs

EXTERNAL
It’s NOT VS
It’s AND
InnerNAL
And

EXTERNAL
flickr.com/pmiaki/6768810175/
How to ensure
quality?

Test
How to test?

Automa
te
So you WRITE
your code…
…and your tests
HOW DARE YOU?
are YOU sure
Tests ARE
correct?
Test
Driven
Development
Red

Refactor

Green
BUT…
test Something
tha doesn’t
t
exists?
flickr.com/ucumari/580865728/
Test In TDD
means


Specifica
tion
Specifica
tion
describes

Beha
vior
BeHa
vior
Driven
Development
IMPROVED

Naming
Conventions
Tools
TDD
v2.0

‘TDD DONE RIGHT’
Story BDD
&
Spec BDD
STORY BDD

description of
business-targeted
application behavior
SPEC BDD

specification for
low-level
implementation
Story BDD
Failing
Scenario

Passing
Scenario

Failing
Spec

RefacTOR

Passing
Spec

SPEC BDD
External quality
Failing
Scenario

Passing
Scenario

Failing
Spec

RefacTOR

Passing
Spec

INTERNAL QUALITY
BEHA 

T
(Story BDD)

&
PHPSpec 

(Spec BDD)
BEHA 

T
(Story BDD)

&
PHPSpec 

(Spec BDD)
PHPSPEC 2

FRAMEWORK SPEC BDD
CREATED BY
@_MD & @EVERZET
PHPSPEC 2

Bundled With Mocking
Framework - Prophecy
BUT…
WHY NOT
PHPUNIT?
PHPUNIT Is A

TESTING TOOL
PHPSPEC Is A

DESIGN TOOL
EVIDENCE?
PHPUNIT
PHPSPEC
Differences?
tEST Suite

Specifica
tion
tEST

EXAMPLE
Assertion

expect tion
a
class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  	
  	
  function	
  it_returns_movie_title()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>getTitle()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldReturn('Star	
  Wars');	
  
	
  	
  	
  	
  }	
  
}
Ma
tchers
IDENTITY MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_is_a_great_movie()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>getRating()-­‐>shouldBe(5);	
  
	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  $this-­‐>getTitle()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeEqualTo('Star	
  Wars');	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  $this-­‐>getReleaseDate()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldReturn(233366400);	
  
	
  	
  }	
  
}
COMPARISON MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_is_great_movie()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>getRating()-­‐>shouldBeLike('5');	
  
	
  	
  }	
  
}
THROW MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_does_not_allow_negative_ratings()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this	
  
	
  	
  	
  	
  	
  	
  -­‐>shouldThrow('InvalidArgumentException')	
  
	
   	
  	
  	
  	
  -­‐>duringSetRating(-­‐3);	
  
	
  	
  }	
  
}
THROW MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_does_not_allow_negative_ratings()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>shouldThrow(	
  
	
  	
  	
  	
  	
  	
  	
  	
  new	
  InvalidArgumentException(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Invalid	
  rating”	
  
	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  )-­‐>during('setRating',	
  array(-­‐3));	
  
	
  	
  	
  	
  }	
  
}
TYPE MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_is_a_movie()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>shouldHaveType('Movie');	
  
	
  	
  	
  	
  $this-­‐>shouldReturnAnInstanceOf('Movie');	
  
	
  	
  	
  	
  $this-­‐>shouldBeAnInstanceOf('Movie');	
  
	
  	
  	
  	
  $this-­‐>shouldImplement('Movie');	
  
	
  	
  }	
  
}
OBJECT-STATE MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_is_available_on_cinemas()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>shouldBeAvailableOnCinemas();	
  
	
  	
  }	
  
}	
  
!

class	
  Movie	
  
{	
  
	
  	
  public	
  function	
  isAvailableOnCinemas()	
  
	
  	
  {	
  return	
  true;	
  }<?php	
  
}
OBJECT-STATE MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_has_a_soundtrack()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>shouldHaveSoundtrack();	
  
	
  	
  }	
  
}	
  
!

class	
  Movie	
  
{	
  
	
  	
  public	
  function	
  hasSoundtrack()	
  
	
  	
  {	
  return	
  true;	
  }	
  
}
COUNT MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_has_one_director()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>getDirectors()-­‐>shouldHaveCount(1);	
  
	
  	
  }	
  
}
SCALAR MATCHER

class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_has_a_string_as_title()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>getTitle()-­‐>shouldBeString();	
  
	
  	
  }	
  
!

	
  	
  function	
  it_has_an_array_as_cast()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>getCast()-­‐>shouldBeArray();	
  
	
  	
  }	
  
}
INLINE MATCHER
class	
  MovieSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  function	
  it_has_default_options()	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>getOptions()-­‐>shouldHaveKey('username');	
  
	
  	
  }	
  
!

	
  	
  public	
  function	
  getMatchers()	
  
	
  	
  {	
  
	
  	
  	
  	
  return	
  [	
  
	
  	
  	
  	
  	
  	
  'haveKey'	
  =>	
  function($subject,	
  $key)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  array_key_exists($key,	
  $subject);	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  ];	
  
	
  	
  }	
  
}
BUT…
Softw
are Design
is about

Messaging
TEST DOUBLES
DUMMIES

class	
  CinemaSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  /**	
  
	
  	
  	
  *	
  @param	
  BoxOffice	
  $boxOffice	
  
	
  	
  	
  */	
  
	
  	
  function	
  it_is_a_cinema($boxOffice)	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($boxOffice);	
  
	
  	
  	
  	
  $this-­‐>shouldHaveType('Cinema');	
  
	
  	
  }	
  
}
STUBS

class	
  CinemaSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  /**	
  
	
  	
  	
  *	
  @param	
  Movie	
  $movie	
  
	
  	
  	
  */	
  
	
  	
  function	
  it_displays_big_movie_title($movie)	
  
	
  	
  {	
  
	
  	
  	
  	
  $movie-­‐>getTitle()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>willReturn('Star	
  Wars’);	
  
!

	
  	
  	
  	
  $this-­‐>displayTitle($movie)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldReturn('<h1>Star	
  Wars</h1>');	
  
	
  	
  }	
  
}
MOCKS
class	
  CinemaSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  /**	
  
	
  	
  	
  *	
  @param	
  DvdPlayer	
  $dvdPlayer	
  
	
  	
  	
  *	
  @param	
  MovieDisc	
  $movieDisc	
  
	
  	
  	
  */	
  
	
  	
  function	
  it_plays_movie($dvdPlayer,	
  $movieDisc)	
  
	
  	
  {	
  
	
  	
  	
  	
  $dvdPlayer-­‐>playDisc($movieDisc)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!

	
  	
  	
  	
  $this-­‐>setPlayer($dvdPlayer);	
  
	
  	
  	
  	
  $this-­‐>playMovie($movieDisc);	
  
	
  	
  }	
  
}
SPIES
class	
  CinemaSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  /**	
  
	
  	
  	
  *	
  @param	
  DvdPlayer	
  $dvdPlayer	
  
	
  	
  	
  *	
  @param	
  MovieDisc	
  $movieDisc	
  
	
  	
  	
  */	
  
	
  	
  function	
  it_plays_movie($dvdPlayer,	
  $movieDisc)	
  
	
  	
  {	
  
	
  	
  	
  	
  $this-­‐>setPlayer($dvdPlayer);	
  
	
  	
  	
  	
  $this-­‐>playMovie($movieDisc);	
  
!

	
  	
  	
  	
  $dvdPlayer-­‐>playDisc($movieDisc)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldHaveBeenCalled();	
  
	
  	
  }	
  
}
SET UP & TEAR DOWN
class	
  CinemaSpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  	
  	
  /**	
  
	
  	
  	
  	
  	
  *	
  @param	
  BoxOffice	
  $boxOffice	
  
	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  function	
  let($boxOffice)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>beConstructedWith($boxOffice);	
  
	
  	
  	
  	
  }	
  
!

	
  	
  	
  	
  function	
  letGo()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>tellPeopleToGoHome();	
  
	
  	
  	
  	
  }	
  
}
BUT…
HOW TO
‘DESIGN’?
THREE RULES OF TDD

1.
2.
3.

WRITE NO PRODUCTION CODE EXCEPT 

TO PASS A FAILING TEST
WRITE ONLY ENOUGH OF A TEST 

TO DEMONSTRATE A FAILURE
WRITE ONLY ENOUGH PRODUCTION 

CODE TO PASS A TEST
4 RULES OF SIMPLE DESIGN

1.
2.
3.
4.

Passes all the tests
Express every idea we need to
express
Contains no duplication
Minimized the number of classes,
methods and other moving parts
SMELLS

1.
2.
3.
4.

CODE SMELLS
TEST SMELLS
DRY SMELLS
…and others
And?
QUICK START

{	
  
	
  	
  	
  	
  "require-­‐dev":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "phpspec/phpspec":	
  "2.0.*@dev"	
  
	
  	
  	
  	
  },	
  
	
  	
  	
  	
  "config":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "bin-­‐dir":	
  "bin"	
  
	
  	
  	
  	
  },	
  
	
  	
  	
  	
  "autoload":	
  {"psr-­‐0":	
  {"":	
  "src"}}	
  
}

http://phpspec.net/
THANK YOU!

?
JOIND.IN/10130

More Related Content

What's hot

Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Leonardo Proietti
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteLeonardo Proietti
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICKonstantin Kudryashov
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful softwareJorn Oomen
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Konstantin Kudryashov
 
Let's play a game with blackfire player
Let's play a game with blackfire playerLet's play a game with blackfire player
Let's play a game with blackfire playerMarcin Czarnecki
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using CodeceptionJeroen van Dijk
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the frameworkGOG.com dev team
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in actionJace Ju
 
購物車程式架構簡介
購物車程式架構簡介購物車程式架構簡介
購物車程式架構簡介Jace Ju
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsRoss Tuck
 
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)James Titcumb
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mockingKonstantin Kudryashov
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 

What's hot (20)

Mocking Demystified
Mocking DemystifiedMocking Demystified
Mocking Demystified
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 
Zero to SOLID
Zero to SOLIDZero to SOLID
Zero to SOLID
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
Let's play a game with blackfire player
Let's play a game with blackfire playerLet's play a game with blackfire player
Let's play a game with blackfire player
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the framework
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in action
 
購物車程式架構簡介
購物車程式架構簡介購物車程式架構簡介
購物車程式架構簡介
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 

Similar to November Camp - Spec BDD with PHPSpec 2

New Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian BergmannNew Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian Bergmanndpc
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11Michelangelo van Dam
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitinternational PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitsmueller_sandsmedia
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxMichelangelo van Dam
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Michelangelo van Dam
 
PhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsPhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsBastian Feder
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Michelangelo van Dam
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Michelangelo van Dam
 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceMeet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceIvan Chepurnyi
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 

Similar to November Camp - Spec BDD with PHPSpec 2 (20)

Unittests für Dummies
Unittests für DummiesUnittests für Dummies
Unittests für Dummies
 
QA for PHP projects
QA for PHP projectsQA for PHP projects
QA for PHP projects
 
New Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian BergmannNew Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian Bergmann
 
logic321
logic321logic321
logic321
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitinternational PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
 
PhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsPhpUnit - The most unknown Parts
PhpUnit - The most unknown Parts
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceMeet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Lithium Best
Lithium Best Lithium Best
Lithium Best
 
Fact, Fiction, and FP
Fact, Fiction, and FPFact, Fiction, and FP
Fact, Fiction, and FP
 

More from Kacper Gunia

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemKacper Gunia
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedKacper Gunia
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingKacper Gunia
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD dieKacper Gunia
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Kacper Gunia
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolKacper Gunia
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupKacper Gunia
 

More from Kacper Gunia (9)

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty system
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doing
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD die
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ tool
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
 
Code Dojo
Code DojoCode Dojo
Code Dojo
 
SpecBDD in PHP
SpecBDD in PHPSpecBDD in PHP
SpecBDD in PHP
 

Recently uploaded

Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 

Recently uploaded (20)

Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 

November Camp - Spec BDD with PHPSpec 2