SlideShare uma empresa Scribd logo
1 de 73
Baixar para ler 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

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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
 

Semelhante a 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
 

Semelhante a 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
 

Mais 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
 

Mais 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
 

Último

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
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
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
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbuapidays
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
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
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusZilliz
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
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
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
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
 
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
 

Último (20)

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...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
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
 
+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...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
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...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
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
 
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
 

November Camp - Spec BDD with PHPSpec 2