SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

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
 

Tendances (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
 

Similaire à 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
 

Similaire à 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
 

Plus de 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
 

Plus de 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
 

Dernier

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 

Dernier (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 

November Camp - Spec BDD with PHPSpec 2