SlideShare ist ein Scribd-Unternehmen logo
1 von 72
Downloaden Sie, um offline zu lesen
THE STATE OF PHPUNIT
     Volker Dusch / @__edorian
ABOUT ME
PHP since 10 years
CI
CleanCode
DevOps
TDD
Shipping
GET IN TOUCH

stackoverflow:
Twitter: @__edorian
Xing / G+: Volker Dusch
IRC: edorian
Mail: php@wallbash.com
LET'S GO
Unit testing in PHP got mainstream
THAT'S A GOOD THING!
                  Unit testing got "normal" in PHP
Even people that don't really know PHP or even the CLI know that they
                        should write unit tests.
AGENDA
Current State
PHPUnit.next
The EcoSystem
Annoying things we got rid of
Features you might have missed
Upcoming stuff
Test suite organization
Discussion
CURRENT STATE
Version: 3.6.12
Over 60 contributors since 3.6.0
Deep into the 3.6 Bugfix cycle, no new features will be added. Those
go into .next
French docs thanks to @poum and still current Japanese docs thanks
to @m-takagi!
If you want to help out:
https://github.com/sebastianbergmann/phpunit/#contributing
PHPUNIT.NEXT
   Next up: 3.7
   15+ features
   10+ issues fixed
   Details later
BC
Did you like upgrading to PHPUnit 3.6?
BC FREE-ISH
We are trying really hard to not introduce any BC breaks.
          Test listeners trigger one autoload call
          cwd gets restored after test case
          parameter cloning behavior
          Removed deprecated OutputTestCase
          and that's it
THE ECOSYSTEM
 http://phpqatools.org/ & friends
BDD
                        Use Behat, It's great!
We're not going to remove the BDD stuff in PHPUnit but It's not being
                            worked on.
WEB INTERFACE?
Not sure why you'd want that but someone solved that for you
       https://github.com/NSinopoli/VisualPHPUnit
MOCKING IS UGLY!
             Real world problems and solutions:
http://stackoverflow.com/search?tab=votes&q=[phpunit] mock
MOCKERY
                           Try it! It's great.
              Afraid it might be hard to set up and use?
Look into https://github.com/etsy/phpunit-extensions/wiki/Mockery

  Works with strict mode, leaves the old API intact and is as easy as
                        writing a comment:
   casMTs etnsPPntEtnin_okr_etae{
    ls yet xed HUi_xesosMceyTsCs

       /*@okr Fo*
        * mcey o /
       poetd$o;
        rtce fo

   }
LOTS OF LEGACY CODE?
            Or whatever "hard to test" is called these days.
              https://github.com/lapistano/proxy-object
One of the main purpose of this library is to expose invisible (private or
           protected) methods and properties to the SUT.
TESTING WEB SERVICES
Unit and Integration test web services with the same code?
     Try wsUnit https://github.com/lapistano/wsunit
IDE SUPPORT
Netbeans support improved and they adopted the skeleton-
generator
Honestly I have no clue about eclipse
PHPStorm has really beautiful coverage support by now
vim user? : p p n t - c v r g - e t
           !hui -oeaetx
JENKINS
Jenkins template: jenkins-php.org
clover php plugin
TRAVIS CI
Awesome for GitHub and collaboration
Everyone has the way to run their tests documented by now
No really CI but a very cool test runner
Use --coverage-text if you want to show off :)
COMPOSER
                      Last week:
       When someone does the work it it will happen
                    This week:
                       Someone did.
                     Current status at
https://github.com/sebastianbergmann/phpunit/issues/522
PHAR
                        The PHP tool format
We still have issues with process-isolation and figuring out the nicest
                 way to maintain and build the phars.
      Hopefully the 3.7 alpha will also feature a 3.6 & 3.7 phar.
PHPUNIT-SELENIUM
           Now maintained by @giorgiosironi
           Code coverage support

If you ask me: Don't drive your web tests with phpunit.
          Use Behat or something non php.
ANNOYING THINGS WE GOT
        RID OF
@ BLOCK
When using process-isolation PHPUnit won't die silently when
            unserializing of the test result fails.
CLI ARGUMENT PARSING
   ppntTsATsAppTsBTsBpp
    hui et et.h et et.h


This only executed TestA. Now it gives you an error message that you
                        are doing it wrong.
HEY, LISTEN!
Test listeners now trigger one autoload call instead of being silently
               ignored when the class was not loaded.
EXCEPTIONAL
         Improved reporting of exceptions...
pbi fnto tsNseEcpin(
 ulc ucin etetdxetos)
{
  $3=nwEcpin'he';
   e   e xeto(Tre)
  $2=nwIvldruetxeto(To,0 $3;
   e   e naiAgmnEcpin'w' , e)
  $1=nwEcpin'n' 0 $2;
   e   e xeto(Oe, , e)
  trw$1
   ho  e;
}


              because it only told you...
EcpintcTs:tsNseEcpin
 xetoSaket:etetdxetos
Ecpin Oe
 xeto: n

[rc]
 tae


                      but now...
EXCEPTIONAL
...we are printing out the previous exception names, messages and
                               traces.
 EcpintcTs:tsNseEcpin
  xetoSaket:etetdxetos
 Ecpin Oe
  xeto: n

 [rc]
  tae

 Cue b
  asd y
 Ivldruetxeto:To
  naiAgmnEcpin w

 [rc]
  tae

 Cue b
  asd y
 Ecpin Tre
  xeto: he

 [rc]
  tae
?????????????????
Fixed an annoying crash when using --process-isolation with PHP 5.3
                      and detect_unicode=on.
EVEN MORE EXCEPTIONAL
@xetdxeto xeto
 epceEcpin Ecpin


                   Works again!
ONE MORE THING
Ftlerr Ucuh ecpin'HUi_rmwr_xeto'wt msae'e
 aa ro: nagt xeto PPntFaeokEcpin ih esg Ni
te "et.h"nr"et.h"cudb oee. i ..
 hr tsspp o tsspp  ol e pnd' n .


              That one is still alive. Sorry ;)
     It just means that PHPUnit can't find any tests.
FEATURES YOU MIGHT HAVE
        MISSED
LINE ENDINGS MISMATCH
Ise0Ts:tsCmaeifrnLnEdns
 su53et:etoprDfeetienig
Fie asrigta tosrnsaeietcl
 ald setn ht w tig r  dnia.
--Epce
 -  xetd
++Ata
 +  cul
@ @
 @ @
 #ann:Srnscnandfeetln edns
  Wrig tig oti  ifrn ie nig!
 fo
  o
IMPROVED THE JSON LOG
If tests produce output it is now properly included in the log.
BOOTSTRAP ORDER
Bootstrap script should be loaded before trying to load
                testSuiteLoaderClass.
PROCESS ISOLATION FOR EVERYONE
Process Isolation did not work when PHPUnit is invoked through
 Apache Ant, for instance, due to PHP binary detection issues.
@EXPECTEDEXCEPTIONCODE
   Now can be 0 or a string.
       Useful for PDO
BINARY MESS
    Before it broke your terminal and BEEPed at you
1 Foet:eto
 ) oTs:tsFo
Fie asrigta tosrnsaeeul
 ald setn ht w tig r qa.
--Epce
 -  xetd
++Ata
 +  cul
@ @
 @ @
-
+☺♥☻♦
+♀
 ♂
+☼◄‼§↨↓←↔▼
 ♫►↕¶▬↑→∟▲


              Now it shows a hex dump:
Bnr Srn:0000000.....
 iay tig x012345....
ONE LINE ANNOTATIONS
                You can use:
/*@xetdxeto uaEcpin*
 * epceEcpin Fbrxeto /
COUNTING ON IT
Now working with Countable and Iterator Interfaces:
             assertCount()
             assertAttributeCount()
             assertNotCount()
             assertAttributeNotCount()
             assertSameSize()
             assertNotSameSize()
FLUENT INTERFACES
           A little mock improvement:
-wl(ti-rtrSl()
 >il$hs>eunef);
@REQUIRES
/*
 *
 *@eursPP54
    rqie H .
 */
pbi fnto tsTat)
 ulc ucin etri(
{
}
REQUIRES
<ie
 fl
   ppeso=530
    hVrin".."
   ppesoOeao=>"
    hVrinprtr"=
>
/aht/yetpp
 pt/oMTs.h
<fl>
 /ie
MAGIC SUPPORT
assertEquals() now looks for (and invokes) a __toString() method when
                 an object and string are compared.
PERFORMANCE
setUpBeforeClass() and tearDownAfterClass() are no longer invoked
              when all tests of the class are skipped
UPCOMING STUFF
LESS MAGIC NUMBERS
    @expectedException* now works with constants:
/*
 *
 *@xetdxeto Cas
    epceEcpin ls
 *@xetdxetoCd @ls:TAO_ISN
    epceEcpinoe Cas:EPTMSIG
 *@xetdxetoMsae@ls:TAO_ISN_ESG
    epceEcpinesg  Cas:EPTMSIGMSAE
 */


              Reduce copy paste testing.
*TEST.PHP IS TOO MAINSTREAM
Added --test-suffix that allows specifying which filename suffixes are
                       recognised by PHPUnit.
               Helps out some projects with their CI.
                    I don't see a general use case.
{"JSON": "YES PLEASE"}
We added assertJson* functions that work like the existing assertXml*
                            functions.
   asrJoFlEulJoFl(
    setsnieqassnie)
   asrJoSrnEulJoFl(
    setsntigqassnie)
   asrJoSrnEulJoSrn(
    setsntigqassntig)
CALLBACK MATCHER
          Helps with complex assertions on mocks
pbi fnto sn(msae EdonCni $ofg
 ulc ucin ed$esg, npitofg cni)


 It's not pretty but it might solve that one annoying problem:
$o-epcs$hs>ne)
 fo>xet(ti-oc()
  -mto(sn'
   >ehd'ed)
  -wt(
   >ih
     $hs>qaT(sn)
      ti-eulo'y',
     $hs>alak
      ti-clbc(
        fnto (cni){
         ucin $ofg
          $r =$ofg>eUl)
           ul  cni-gtr(;
          i($r){trwnwEcpin'..) }
           f!ul   ho e xeto(..';
          rtr $r-gtot)=='tp/eapecm;
           eun ul>eHs(  = ht:/xml.o'
        }
     )
  );
OO-ARRAYS
asrAryaKy)
 setraHse(
asrAryoHse(
 setraNtaKy)


   Now work with objects that implement ArrayAccess.
PHPUNIT.XSD
       PHPUnit now provides a configuration.xsd schema file.
            http://schema.phpunit.de/configuration.xsd
Useful to validate your phpunit.xml and phpunit.xml.dist configuration
                                 files.
   <xlvrin"."ecdn=UF8?
    ?m eso=10 noig"T-">
   <hui
    ppnt
     xlsxi"tp/www.r/01XLceaisac"
      mn:s=ht:/w.3og20/MShm-ntne
     xinNmsaeceaoain
      s:oaepcShmLcto
       =ht:/ceappntd/ofgrto.s"
        "tp/shm.hui.ecniuainxd
     [.]
      ..
   >
MORE @REQUIRES
/*
 *
 *@eursPP54dv
    rqie H .-e
 *@eursPPnt37dv
    rqie HUi  .-e
 *@eursfnto smFn
    rqie ucin oeuc
 *@eursfnto Cas:o
    rqie ucin ls:fo
 *@eursetninac
    rqie xeso  p
 *@eursetninmsl
    rqie xeso  yqi
 */


        Require functions, methods and extensions
        Merges Class & Method doc blocks
        PHP & PHPUnit version get override
.PHPT IMPROVEMENTS
-TS-
 -ET-

G-0:asrEul( Ln Edn DfeecsAeOsue
 H53 setqas) ie nig ifrne r bcr

-FL-
 -IE-
<pp
 ?h

$SRE[ag'[]='-ocniuain;
 _EVR'rv]1 -n-ofgrto'
$SRE[ag'[]='su53et;
 _EVR'rv]2 Ise0Ts'
$SRE[ag'[]=_DR_./0/su53etpp;
 _EVR'rv]3 _I_)'53Ise0Ts.h'

rqieoc _DR_.'./../HUi/uoodpp;
 eur_ne _I_  /../.PPntAtla.h'
PPntTxU_omn:mi(;
 HUi_etICmad:an)
?>
.PHPT IMPROVEMENTS
-EPCF-
 -XET-
PPnt% b SbsinBrmn.
 HUi s y eata egan

F

Tm:% %,Mmr:%M
 ie i s eoy sb

Teews1fiue
 hr a alr:

1 Ise0Ts:tsCmaeifrnLnEdns
 ) su53et:etoprDfeetienig
Fie asrigta tosrnsaeietcl
 ald setn ht w tig r  dnia.
--Epce
 -  xetd
++Ata
 +  cul
@ @
 @ @
 #ann:Srnscnandfeetln edns
  Wrig tig oti  ifrn ie nig!
 fo
  o

%:i
 s%

FIUE!
 ALRS
Tss 1 Asrin:1 Fiue:1
 et: , setos , alrs .
.PHPT IMPROVEMENTS
Before 3.7 diffs where really hard to read.
Now the diff will be processed line by line.
LISTS AND COLLECTIONS
pbi fnto tsAsrCnanOlIsacsf)
 ulc ucin etsetotisnyntneO(
{
  $irr =ary
   lbay   ra(
     nwBo(,
      e ok)
     nwBo(
      e ok)
  );
  $hs>setotisnyntneO(
   ti-asrCnanOlIsacsf
     'ok,
      Bo'
     $irr
      lbay
  );
}


    Helper for checking Collection objects and arrays.
        Descriptive assertion and error message.
FAILED @EXPECTEDEXCEPTION ANNOTATIONS
                  Before:
Fie asrigta ecpino tp "roEcpin mthsepce ecp
 ald setn ht xeto f ye Errxeto" ace xetd xe
to "yxeto"
 in MEcpin.


                   Now:
Fie asrigta ecpino tp "roEcpin mthsepce ecp
 ald setn ht xeto f ye Errxeto" ace xetd xe
to "yxeto"
 in MEcpin.
Msaefo "roEcpin ws"neie vral $ts.
 esg rm Errxeto" a udfnd aibe hi"
LESS REQUIRES, LESS CRASHES
  <htls adnoeeFlsrmhtls=tu"
   wieit dUcvrdieFoWieit"re>


   People seem to constantly run into issues with code coverage
  <htls poesnoeeFlsrmhtls=tu"
   wieit rcsUcvrdieFoWieit"re>


When enabled, uncovered whitelisted files are processed to properly
            calculate the number of executable lines.
     If not we take a quite ok guess to get the number of ELOC.
MORE USEFUL GROUPS
$ppnt-gopFayet
  hui -ru lkTss



<hui>
 ppnt
  <rus
   gop>
   <xld>
    ecue
     <ru>lkTss/ru>
     gopFayet<gop
   <ecue
    /xld>
  <gop>
   /rus
  <etuts../
   tssie . >
<ppnt
 /hui>


              Now works as expected
TEST SUITE ORGANIZATION
FOLDER LAYOUT?
poet
 rjc/
  ppntxlds
   hui.m.it
  sc
   r/
  tss
   et/
   bosrppp
    otta.h
   ui/
    nt
   itgto/
    neain
   fntoa/(rsse/
    ucinl  o ytm)
   hles
    epr/
TEST DISTRIBUTION
http://elblinkin.info/2012/03/goldilocks-on-test-sizes/
SMALL HINTS
Use the xml configuration for pretty much everything
Separate unit and integration tests
Your unit test folders should mirror your applications folder
structure
To only execute specific tests use phpunit --filter or phpunit
tests/unit/module1
Use the strict mode from the get go and never turn it off.
Imho: Don't have a test namespace. Nicer to read and shows
production usage.
DISCUSSION
      Issues?
 Feature requests?
 Anything I missed?
THANK YOU
The State of PHPUnit
The State of PHPUnit

Weitere ähnliche Inhalte

Was ist angesagt?

PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to heroJeremy Cook
 
Introduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnitIntroduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnitMichelangelo van Dam
 
Javascript fundamentals for php developers
Javascript fundamentals for php developersJavascript fundamentals for php developers
Javascript fundamentals for php developersChris Ramakers
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentationnicobn
 
Test Driven Development with PHPUnit
Test Driven Development with PHPUnitTest Driven Development with PHPUnit
Test Driven Development with PHPUnitMindfire Solutions
 
[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform
[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform
[Webinar] An Hour with the CTO: All About APIs and the Nuxeo PlatformNuxeo
 
Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Joseph Scott
 
¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...
¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...
¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...Software Guru
 
Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516SOAT
 
Tetcon2016 160104
Tetcon2016 160104Tetcon2016 160104
Tetcon2016 160104Bordeaux I
 
Flow of events during Media Player creation in Android
Flow of events during Media Player creation in AndroidFlow of events during Media Player creation in Android
Flow of events during Media Player creation in AndroidSomenath Mukhopadhyay
 
Non stop random2b
Non stop random2bNon stop random2b
Non stop random2bphanhung20
 
CyberLink LabelPrint 2.5 Exploitation Process
CyberLink LabelPrint 2.5 Exploitation ProcessCyberLink LabelPrint 2.5 Exploitation Process
CyberLink LabelPrint 2.5 Exploitation ProcessThomas Gregory
 
Exploit Development: EzServer Buffer Overflow oleh Tom Gregory
Exploit Development: EzServer Buffer Overflow oleh Tom GregoryExploit Development: EzServer Buffer Overflow oleh Tom Gregory
Exploit Development: EzServer Buffer Overflow oleh Tom Gregoryzakiakhmad
 
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練Sheng-Hao Ma
 
Exploit Research and Development Megaprimer: Win32 Egghunter
Exploit Research and Development Megaprimer: Win32 EgghunterExploit Research and Development Megaprimer: Win32 Egghunter
Exploit Research and Development Megaprimer: Win32 EgghunterAjin Abraham
 
Unit testing en iOS @ MobileCon Galicia
Unit testing en iOS @ MobileCon GaliciaUnit testing en iOS @ MobileCon Galicia
Unit testing en iOS @ MobileCon GaliciaRobot Media
 

Was ist angesagt? (20)

PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to hero
 
Introduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnitIntroduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnit
 
Javascript fundamentals for php developers
Javascript fundamentals for php developersJavascript fundamentals for php developers
Javascript fundamentals for php developers
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentation
 
Test Driven Development with PHPUnit
Test Driven Development with PHPUnitTest Driven Development with PHPUnit
Test Driven Development with PHPUnit
 
[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform
[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform
[Webinar] An Hour with the CTO: All About APIs and the Nuxeo Platform
 
Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )
 
¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...
¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...
¡Ups! código inseguro: detección, explotación y mitigación de vulnerabilidade...
 
Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516
 
Tetcon2016 160104
Tetcon2016 160104Tetcon2016 160104
Tetcon2016 160104
 
Hidden Gems of Ruby 1.9
Hidden Gems of Ruby 1.9Hidden Gems of Ruby 1.9
Hidden Gems of Ruby 1.9
 
Flow of events during Media Player creation in Android
Flow of events during Media Player creation in AndroidFlow of events during Media Player creation in Android
Flow of events during Media Player creation in Android
 
GNU Parallel și GNU Stow
GNU Parallel și GNU StowGNU Parallel și GNU Stow
GNU Parallel și GNU Stow
 
Non stop random2b
Non stop random2bNon stop random2b
Non stop random2b
 
Ipc
IpcIpc
Ipc
 
CyberLink LabelPrint 2.5 Exploitation Process
CyberLink LabelPrint 2.5 Exploitation ProcessCyberLink LabelPrint 2.5 Exploitation Process
CyberLink LabelPrint 2.5 Exploitation Process
 
Exploit Development: EzServer Buffer Overflow oleh Tom Gregory
Exploit Development: EzServer Buffer Overflow oleh Tom GregoryExploit Development: EzServer Buffer Overflow oleh Tom Gregory
Exploit Development: EzServer Buffer Overflow oleh Tom Gregory
 
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
 
Exploit Research and Development Megaprimer: Win32 Egghunter
Exploit Research and Development Megaprimer: Win32 EgghunterExploit Research and Development Megaprimer: Win32 Egghunter
Exploit Research and Development Megaprimer: Win32 Egghunter
 
Unit testing en iOS @ MobileCon Galicia
Unit testing en iOS @ MobileCon GaliciaUnit testing en iOS @ MobileCon Galicia
Unit testing en iOS @ MobileCon Galicia
 

Andere mochten auch

Patrick Decuyper liquideert NV Alles voor Antwerp
Patrick Decuyper liquideert NV Alles voor AntwerpPatrick Decuyper liquideert NV Alles voor Antwerp
Patrick Decuyper liquideert NV Alles voor AntwerpThierry Debels
 
Cers 20th anniversary customer experience (cx) seminar phil klaus
Cers 20th anniversary customer experience (cx) seminar phil klausCers 20th anniversary customer experience (cx) seminar phil klaus
Cers 20th anniversary customer experience (cx) seminar phil klausphilippklaus
 
NV LANOYE knoopt terug aan met winst
NV LANOYE knoopt terug aan met winstNV LANOYE knoopt terug aan met winst
NV LANOYE knoopt terug aan met winstThierry Debels
 
L’institut de promotion des formations sur l'islam est né
L’institut de promotion des formations sur l'islam est néL’institut de promotion des formations sur l'islam est né
L’institut de promotion des formations sur l'islam est néThierry Debels
 
Как заставить говорить корову? Product design мобильного приложения. Павел Гр...
Как заставить говорить корову? Product design мобильного приложения. Павел Гр...Как заставить говорить корову? Product design мобильного приложения. Павел Гр...
Как заставить говорить корову? Product design мобильного приложения. Павел Гр...Pavlo Grozian
 
Happy New Year 2009 Eng
Happy New Year 2009   EngHappy New Year 2009   Eng
Happy New Year 2009 EngFR Projects
 
Introducing Two Fingers Brewing Co.
Introducing Two Fingers Brewing Co.Introducing Two Fingers Brewing Co.
Introducing Two Fingers Brewing Co.mattsadler
 
Franse Gemeenschap wil islam verzoenen met Westerse waarden
Franse Gemeenschap wil islam verzoenen met Westerse waardenFranse Gemeenschap wil islam verzoenen met Westerse waarden
Franse Gemeenschap wil islam verzoenen met Westerse waardenThierry Debels
 

Andere mochten auch (14)

Patrick Decuyper liquideert NV Alles voor Antwerp
Patrick Decuyper liquideert NV Alles voor AntwerpPatrick Decuyper liquideert NV Alles voor Antwerp
Patrick Decuyper liquideert NV Alles voor Antwerp
 
社内LTへの道
社内LTへの道社内LTへの道
社内LTへの道
 
Cers 20th anniversary customer experience (cx) seminar phil klaus
Cers 20th anniversary customer experience (cx) seminar phil klausCers 20th anniversary customer experience (cx) seminar phil klaus
Cers 20th anniversary customer experience (cx) seminar phil klaus
 
Inspiring Reading With Mobile Devices
Inspiring Reading With Mobile DevicesInspiring Reading With Mobile Devices
Inspiring Reading With Mobile Devices
 
Sun Safety Myths
Sun Safety MythsSun Safety Myths
Sun Safety Myths
 
Interactividad y Web 2.0
Interactividad y Web 2.0Interactividad y Web 2.0
Interactividad y Web 2.0
 
NV LANOYE knoopt terug aan met winst
NV LANOYE knoopt terug aan met winstNV LANOYE knoopt terug aan met winst
NV LANOYE knoopt terug aan met winst
 
TEL concept developments
TEL concept developmentsTEL concept developments
TEL concept developments
 
L’institut de promotion des formations sur l'islam est né
L’institut de promotion des formations sur l'islam est néL’institut de promotion des formations sur l'islam est né
L’institut de promotion des formations sur l'islam est né
 
Как заставить говорить корову? Product design мобильного приложения. Павел Гр...
Как заставить говорить корову? Product design мобильного приложения. Павел Гр...Как заставить говорить корову? Product design мобильного приложения. Павел Гр...
Как заставить говорить корову? Product design мобильного приложения. Павел Гр...
 
Zaragoza turismo 210
Zaragoza turismo 210Zaragoza turismo 210
Zaragoza turismo 210
 
Happy New Year 2009 Eng
Happy New Year 2009   EngHappy New Year 2009   Eng
Happy New Year 2009 Eng
 
Introducing Two Fingers Brewing Co.
Introducing Two Fingers Brewing Co.Introducing Two Fingers Brewing Co.
Introducing Two Fingers Brewing Co.
 
Franse Gemeenschap wil islam verzoenen met Westerse waarden
Franse Gemeenschap wil islam verzoenen met Westerse waardenFranse Gemeenschap wil islam verzoenen met Westerse waarden
Franse Gemeenschap wil islam verzoenen met Westerse waarden
 

Ähnlich wie The State of PHPUnit

PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best PracticesEdorian
 
Making the most of 2.2
Making the most of 2.2Making the most of 2.2
Making the most of 2.2markstory
 
Multiprocessing with python
Multiprocessing with pythonMultiprocessing with python
Multiprocessing with pythonPatrick Vergain
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit TestingMike Lively
 
PythonBrasil[8] - CPython for dummies
PythonBrasil[8] - CPython for dummiesPythonBrasil[8] - CPython for dummies
PythonBrasil[8] - CPython for dummiesTatiana Al-Chueyr
 
(Slightly) Smarter Smart Pointers
(Slightly) Smarter Smart Pointers(Slightly) Smarter Smart Pointers
(Slightly) Smarter Smart PointersCarlo Pescio
 
Fighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitFighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitJames Fuller
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6Wim Godden
 
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...tutorialsruby
 
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...tutorialsruby
 
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source CodeA Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source CodePVS-Studio
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJSPat Cito
 
streamparse and pystorm: simple reliable parallel processing with storm
streamparse and pystorm: simple reliable parallel processing with stormstreamparse and pystorm: simple reliable parallel processing with storm
streamparse and pystorm: simple reliable parallel processing with stormDaniel Blanchard
 
Adventures in infrastructure as code
Adventures in infrastructure as codeAdventures in infrastructure as code
Adventures in infrastructure as codeJulian Simpson
 
Integrating cloud stack with puppet
Integrating cloud stack with puppetIntegrating cloud stack with puppet
Integrating cloud stack with puppetPuppet
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit TestingMike Lively
 
ooc - A hybrid language experiment
ooc - A hybrid language experimentooc - A hybrid language experiment
ooc - A hybrid language experimentAmos Wenger
 
ooc - A hybrid language experiment
ooc - A hybrid language experimentooc - A hybrid language experiment
ooc - A hybrid language experimentAmos Wenger
 
[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory Analysis[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory AnalysisMoabi.com
 

Ähnlich wie The State of PHPUnit (20)

PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best Practices
 
Making the most of 2.2
Making the most of 2.2Making the most of 2.2
Making the most of 2.2
 
Multiprocessing with python
Multiprocessing with pythonMultiprocessing with python
Multiprocessing with python
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit Testing
 
PythonBrasil[8] - CPython for dummies
PythonBrasil[8] - CPython for dummiesPythonBrasil[8] - CPython for dummies
PythonBrasil[8] - CPython for dummies
 
(Slightly) Smarter Smart Pointers
(Slightly) Smarter Smart Pointers(Slightly) Smarter Smart Pointers
(Slightly) Smarter Smart Pointers
 
Fighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitFighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnit
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
 
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
 
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
exploit-writing-tutorial-part-5-how-debugger-modules-plugins-can-speed-up-bas...
 
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source CodeA Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
PHP 7
PHP 7PHP 7
PHP 7
 
streamparse and pystorm: simple reliable parallel processing with storm
streamparse and pystorm: simple reliable parallel processing with stormstreamparse and pystorm: simple reliable parallel processing with storm
streamparse and pystorm: simple reliable parallel processing with storm
 
Adventures in infrastructure as code
Adventures in infrastructure as codeAdventures in infrastructure as code
Adventures in infrastructure as code
 
Integrating cloud stack with puppet
Integrating cloud stack with puppetIntegrating cloud stack with puppet
Integrating cloud stack with puppet
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit Testing
 
ooc - A hybrid language experiment
ooc - A hybrid language experimentooc - A hybrid language experiment
ooc - A hybrid language experiment
 
ooc - A hybrid language experiment
ooc - A hybrid language experimentooc - A hybrid language experiment
ooc - A hybrid language experiment
 
[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory Analysis[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory Analysis
 

Mehr von Edorian

Your (coding) standards matter
Your (coding) standards matterYour (coding) standards matter
Your (coding) standards matterEdorian
 
Save time by applying clean code principles
Save time by applying clean code principlesSave time by applying clean code principles
Save time by applying clean code principlesEdorian
 
Nginx - The webserver you might actually like
Nginx - The webserver you might actually likeNginx - The webserver you might actually like
Nginx - The webserver you might actually likeEdorian
 
From dev to ops and beyond - getting it done
From dev to ops and beyond - getting it doneFrom dev to ops and beyond - getting it done
From dev to ops and beyond - getting it doneEdorian
 
Code review in practice
Code review in practiceCode review in practice
Code review in practiceEdorian
 
Nginx & php fpm - the webserver you might actually like - php usergroup berlin
Nginx & php fpm - the webserver you might actually like - php usergroup berlinNginx & php fpm - the webserver you might actually like - php usergroup berlin
Nginx & php fpm - the webserver you might actually like - php usergroup berlinEdorian
 
Clean code is not the goal - working software is
Clean code is not the goal - working software isClean code is not the goal - working software is
Clean code is not the goal - working software isEdorian
 
Nginx The webserver you might actually like
Nginx   The webserver you might actually likeNginx   The webserver you might actually like
Nginx The webserver you might actually likeEdorian
 
Stop wasting-time-by-applying-clean-code-principles
Stop wasting-time-by-applying-clean-code-principlesStop wasting-time-by-applying-clean-code-principles
Stop wasting-time-by-applying-clean-code-principlesEdorian
 
php unconference Europa: Clean code - Stop wasting my time
php unconference Europa: Clean code - Stop wasting my timephp unconference Europa: Clean code - Stop wasting my time
php unconference Europa: Clean code - Stop wasting my timeEdorian
 
Clean Code: Stop wasting my time
Clean Code: Stop wasting my timeClean Code: Stop wasting my time
Clean Code: Stop wasting my timeEdorian
 

Mehr von Edorian (11)

Your (coding) standards matter
Your (coding) standards matterYour (coding) standards matter
Your (coding) standards matter
 
Save time by applying clean code principles
Save time by applying clean code principlesSave time by applying clean code principles
Save time by applying clean code principles
 
Nginx - The webserver you might actually like
Nginx - The webserver you might actually likeNginx - The webserver you might actually like
Nginx - The webserver you might actually like
 
From dev to ops and beyond - getting it done
From dev to ops and beyond - getting it doneFrom dev to ops and beyond - getting it done
From dev to ops and beyond - getting it done
 
Code review in practice
Code review in practiceCode review in practice
Code review in practice
 
Nginx & php fpm - the webserver you might actually like - php usergroup berlin
Nginx & php fpm - the webserver you might actually like - php usergroup berlinNginx & php fpm - the webserver you might actually like - php usergroup berlin
Nginx & php fpm - the webserver you might actually like - php usergroup berlin
 
Clean code is not the goal - working software is
Clean code is not the goal - working software isClean code is not the goal - working software is
Clean code is not the goal - working software is
 
Nginx The webserver you might actually like
Nginx   The webserver you might actually likeNginx   The webserver you might actually like
Nginx The webserver you might actually like
 
Stop wasting-time-by-applying-clean-code-principles
Stop wasting-time-by-applying-clean-code-principlesStop wasting-time-by-applying-clean-code-principles
Stop wasting-time-by-applying-clean-code-principles
 
php unconference Europa: Clean code - Stop wasting my time
php unconference Europa: Clean code - Stop wasting my timephp unconference Europa: Clean code - Stop wasting my time
php unconference Europa: Clean code - Stop wasting my time
 
Clean Code: Stop wasting my time
Clean Code: Stop wasting my timeClean Code: Stop wasting my time
Clean Code: Stop wasting my time
 

Kürzlich hochgeladen

AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 

Kürzlich hochgeladen (20)

AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 

The State of PHPUnit

  • 1. THE STATE OF PHPUNIT Volker Dusch / @__edorian
  • 2. ABOUT ME PHP since 10 years CI CleanCode DevOps TDD Shipping
  • 3.
  • 4. GET IN TOUCH stackoverflow: Twitter: @__edorian Xing / G+: Volker Dusch IRC: edorian Mail: php@wallbash.com
  • 6. Unit testing in PHP got mainstream
  • 7. THAT'S A GOOD THING! Unit testing got "normal" in PHP Even people that don't really know PHP or even the CLI know that they should write unit tests.
  • 8. AGENDA Current State PHPUnit.next The EcoSystem Annoying things we got rid of Features you might have missed Upcoming stuff Test suite organization Discussion
  • 9. CURRENT STATE Version: 3.6.12 Over 60 contributors since 3.6.0 Deep into the 3.6 Bugfix cycle, no new features will be added. Those go into .next French docs thanks to @poum and still current Japanese docs thanks to @m-takagi! If you want to help out: https://github.com/sebastianbergmann/phpunit/#contributing
  • 10. PHPUNIT.NEXT Next up: 3.7 15+ features 10+ issues fixed Details later
  • 11. BC Did you like upgrading to PHPUnit 3.6?
  • 12. BC FREE-ISH We are trying really hard to not introduce any BC breaks. Test listeners trigger one autoload call cwd gets restored after test case parameter cloning behavior Removed deprecated OutputTestCase and that's it
  • 14. BDD Use Behat, It's great! We're not going to remove the BDD stuff in PHPUnit but It's not being worked on.
  • 15. WEB INTERFACE? Not sure why you'd want that but someone solved that for you https://github.com/NSinopoli/VisualPHPUnit
  • 16. MOCKING IS UGLY! Real world problems and solutions: http://stackoverflow.com/search?tab=votes&q=[phpunit] mock
  • 17. MOCKERY Try it! It's great. Afraid it might be hard to set up and use? Look into https://github.com/etsy/phpunit-extensions/wiki/Mockery Works with strict mode, leaves the old API intact and is as easy as writing a comment: casMTs etnsPPntEtnin_okr_etae{ ls yet xed HUi_xesosMceyTsCs /*@okr Fo* * mcey o / poetd$o; rtce fo }
  • 18. LOTS OF LEGACY CODE? Or whatever "hard to test" is called these days. https://github.com/lapistano/proxy-object One of the main purpose of this library is to expose invisible (private or protected) methods and properties to the SUT.
  • 19. TESTING WEB SERVICES Unit and Integration test web services with the same code? Try wsUnit https://github.com/lapistano/wsunit
  • 20. IDE SUPPORT Netbeans support improved and they adopted the skeleton- generator Honestly I have no clue about eclipse PHPStorm has really beautiful coverage support by now vim user? : p p n t - c v r g - e t !hui -oeaetx
  • 22. TRAVIS CI Awesome for GitHub and collaboration Everyone has the way to run their tests documented by now No really CI but a very cool test runner Use --coverage-text if you want to show off :)
  • 23. COMPOSER Last week: When someone does the work it it will happen This week: Someone did. Current status at https://github.com/sebastianbergmann/phpunit/issues/522
  • 24.
  • 25. PHAR The PHP tool format We still have issues with process-isolation and figuring out the nicest way to maintain and build the phars. Hopefully the 3.7 alpha will also feature a 3.6 & 3.7 phar.
  • 26. PHPUNIT-SELENIUM Now maintained by @giorgiosironi Code coverage support If you ask me: Don't drive your web tests with phpunit. Use Behat or something non php.
  • 27. ANNOYING THINGS WE GOT RID OF
  • 28. @ BLOCK When using process-isolation PHPUnit won't die silently when unserializing of the test result fails.
  • 29. CLI ARGUMENT PARSING ppntTsATsAppTsBTsBpp hui et et.h et et.h This only executed TestA. Now it gives you an error message that you are doing it wrong.
  • 30. HEY, LISTEN! Test listeners now trigger one autoload call instead of being silently ignored when the class was not loaded.
  • 31. EXCEPTIONAL Improved reporting of exceptions... pbi fnto tsNseEcpin( ulc ucin etetdxetos) { $3=nwEcpin'he'; e e xeto(Tre) $2=nwIvldruetxeto(To,0 $3; e e naiAgmnEcpin'w' , e) $1=nwEcpin'n' 0 $2; e e xeto(Oe, , e) trw$1 ho e; } because it only told you... EcpintcTs:tsNseEcpin xetoSaket:etetdxetos Ecpin Oe xeto: n [rc] tae but now...
  • 32. EXCEPTIONAL ...we are printing out the previous exception names, messages and traces. EcpintcTs:tsNseEcpin xetoSaket:etetdxetos Ecpin Oe xeto: n [rc] tae Cue b asd y Ivldruetxeto:To naiAgmnEcpin w [rc] tae Cue b asd y Ecpin Tre xeto: he [rc] tae
  • 33. ????????????????? Fixed an annoying crash when using --process-isolation with PHP 5.3 and detect_unicode=on.
  • 34. EVEN MORE EXCEPTIONAL @xetdxeto xeto epceEcpin Ecpin Works again!
  • 35. ONE MORE THING Ftlerr Ucuh ecpin'HUi_rmwr_xeto'wt msae'e aa ro: nagt xeto PPntFaeokEcpin ih esg Ni te "et.h"nr"et.h"cudb oee. i .. hr tsspp o tsspp ol e pnd' n . That one is still alive. Sorry ;) It just means that PHPUnit can't find any tests.
  • 36. FEATURES YOU MIGHT HAVE MISSED
  • 37. LINE ENDINGS MISMATCH Ise0Ts:tsCmaeifrnLnEdns su53et:etoprDfeetienig Fie asrigta tosrnsaeietcl ald setn ht w tig r dnia. --Epce - xetd ++Ata + cul @ @ @ @ #ann:Srnscnandfeetln edns Wrig tig oti ifrn ie nig! fo o
  • 38. IMPROVED THE JSON LOG If tests produce output it is now properly included in the log.
  • 39. BOOTSTRAP ORDER Bootstrap script should be loaded before trying to load testSuiteLoaderClass.
  • 40. PROCESS ISOLATION FOR EVERYONE Process Isolation did not work when PHPUnit is invoked through Apache Ant, for instance, due to PHP binary detection issues.
  • 41. @EXPECTEDEXCEPTIONCODE Now can be 0 or a string. Useful for PDO
  • 42. BINARY MESS Before it broke your terminal and BEEPed at you 1 Foet:eto ) oTs:tsFo Fie asrigta tosrnsaeeul ald setn ht w tig r qa. --Epce - xetd ++Ata + cul @ @ @ @ - +☺♥☻♦ +♀ ♂ +☼◄‼§↨↓←↔▼ ♫►↕¶▬↑→∟▲ Now it shows a hex dump: Bnr Srn:0000000..... iay tig x012345....
  • 43. ONE LINE ANNOTATIONS You can use: /*@xetdxeto uaEcpin* * epceEcpin Fbrxeto /
  • 44. COUNTING ON IT Now working with Countable and Iterator Interfaces: assertCount() assertAttributeCount() assertNotCount() assertAttributeNotCount() assertSameSize() assertNotSameSize()
  • 45. FLUENT INTERFACES A little mock improvement: -wl(ti-rtrSl() >il$hs>eunef);
  • 46. @REQUIRES /* * *@eursPP54 rqie H . */ pbi fnto tsTat) ulc ucin etri( { }
  • 47. REQUIRES <ie fl ppeso=530 hVrin".." ppesoOeao=>" hVrinprtr"= > /aht/yetpp pt/oMTs.h <fl> /ie
  • 48. MAGIC SUPPORT assertEquals() now looks for (and invokes) a __toString() method when an object and string are compared.
  • 49. PERFORMANCE setUpBeforeClass() and tearDownAfterClass() are no longer invoked when all tests of the class are skipped
  • 51. LESS MAGIC NUMBERS @expectedException* now works with constants: /* * *@xetdxeto Cas epceEcpin ls *@xetdxetoCd @ls:TAO_ISN epceEcpinoe Cas:EPTMSIG *@xetdxetoMsae@ls:TAO_ISN_ESG epceEcpinesg Cas:EPTMSIGMSAE */ Reduce copy paste testing.
  • 52. *TEST.PHP IS TOO MAINSTREAM Added --test-suffix that allows specifying which filename suffixes are recognised by PHPUnit. Helps out some projects with their CI. I don't see a general use case.
  • 53. {"JSON": "YES PLEASE"} We added assertJson* functions that work like the existing assertXml* functions. asrJoFlEulJoFl( setsnieqassnie) asrJoSrnEulJoFl( setsntigqassnie) asrJoSrnEulJoSrn( setsntigqassntig)
  • 54. CALLBACK MATCHER Helps with complex assertions on mocks pbi fnto sn(msae EdonCni $ofg ulc ucin ed$esg, npitofg cni) It's not pretty but it might solve that one annoying problem: $o-epcs$hs>ne) fo>xet(ti-oc() -mto(sn' >ehd'ed) -wt( >ih $hs>qaT(sn) ti-eulo'y', $hs>alak ti-clbc( fnto (cni){ ucin $ofg $r =$ofg>eUl) ul cni-gtr(; i($r){trwnwEcpin'..) } f!ul ho e xeto(..'; rtr $r-gtot)=='tp/eapecm; eun ul>eHs( = ht:/xml.o' } ) );
  • 55. OO-ARRAYS asrAryaKy) setraHse( asrAryoHse( setraNtaKy) Now work with objects that implement ArrayAccess.
  • 56. PHPUNIT.XSD PHPUnit now provides a configuration.xsd schema file. http://schema.phpunit.de/configuration.xsd Useful to validate your phpunit.xml and phpunit.xml.dist configuration files. <xlvrin"."ecdn=UF8? ?m eso=10 noig"T-"> <hui ppnt xlsxi"tp/www.r/01XLceaisac" mn:s=ht:/w.3og20/MShm-ntne xinNmsaeceaoain s:oaepcShmLcto =ht:/ceappntd/ofgrto.s" "tp/shm.hui.ecniuainxd [.] .. >
  • 57. MORE @REQUIRES /* * *@eursPP54dv rqie H .-e *@eursPPnt37dv rqie HUi .-e *@eursfnto smFn rqie ucin oeuc *@eursfnto Cas:o rqie ucin ls:fo *@eursetninac rqie xeso p *@eursetninmsl rqie xeso yqi */ Require functions, methods and extensions Merges Class & Method doc blocks PHP & PHPUnit version get override
  • 58. .PHPT IMPROVEMENTS -TS- -ET- G-0:asrEul( Ln Edn DfeecsAeOsue H53 setqas) ie nig ifrne r bcr -FL- -IE- <pp ?h $SRE[ag'[]='-ocniuain; _EVR'rv]1 -n-ofgrto' $SRE[ag'[]='su53et; _EVR'rv]2 Ise0Ts' $SRE[ag'[]=_DR_./0/su53etpp; _EVR'rv]3 _I_)'53Ise0Ts.h' rqieoc _DR_.'./../HUi/uoodpp; eur_ne _I_ /../.PPntAtla.h' PPntTxU_omn:mi(; HUi_etICmad:an) ?>
  • 59. .PHPT IMPROVEMENTS -EPCF- -XET- PPnt% b SbsinBrmn. HUi s y eata egan F Tm:% %,Mmr:%M ie i s eoy sb Teews1fiue hr a alr: 1 Ise0Ts:tsCmaeifrnLnEdns ) su53et:etoprDfeetienig Fie asrigta tosrnsaeietcl ald setn ht w tig r dnia. --Epce - xetd ++Ata + cul @ @ @ @ #ann:Srnscnandfeetln edns Wrig tig oti ifrn ie nig! fo o %:i s% FIUE! ALRS Tss 1 Asrin:1 Fiue:1 et: , setos , alrs .
  • 60. .PHPT IMPROVEMENTS Before 3.7 diffs where really hard to read. Now the diff will be processed line by line.
  • 61. LISTS AND COLLECTIONS pbi fnto tsAsrCnanOlIsacsf) ulc ucin etsetotisnyntneO( { $irr =ary lbay ra( nwBo(, e ok) nwBo( e ok) ); $hs>setotisnyntneO( ti-asrCnanOlIsacsf 'ok, Bo' $irr lbay ); } Helper for checking Collection objects and arrays. Descriptive assertion and error message.
  • 62. FAILED @EXPECTEDEXCEPTION ANNOTATIONS Before: Fie asrigta ecpino tp "roEcpin mthsepce ecp ald setn ht xeto f ye Errxeto" ace xetd xe to "yxeto" in MEcpin. Now: Fie asrigta ecpino tp "roEcpin mthsepce ecp ald setn ht xeto f ye Errxeto" ace xetd xe to "yxeto" in MEcpin. Msaefo "roEcpin ws"neie vral $ts. esg rm Errxeto" a udfnd aibe hi"
  • 63. LESS REQUIRES, LESS CRASHES <htls adnoeeFlsrmhtls=tu" wieit dUcvrdieFoWieit"re> People seem to constantly run into issues with code coverage <htls poesnoeeFlsrmhtls=tu" wieit rcsUcvrdieFoWieit"re> When enabled, uncovered whitelisted files are processed to properly calculate the number of executable lines. If not we take a quite ok guess to get the number of ELOC.
  • 64. MORE USEFUL GROUPS $ppnt-gopFayet hui -ru lkTss <hui> ppnt <rus gop> <xld> ecue <ru>lkTss/ru> gopFayet<gop <ecue /xld> <gop> /rus <etuts../ tssie . > <ppnt /hui> Now works as expected
  • 66. FOLDER LAYOUT? poet rjc/ ppntxlds hui.m.it sc r/ tss et/ bosrppp otta.h ui/ nt itgto/ neain fntoa/(rsse/ ucinl o ytm) hles epr/
  • 68. SMALL HINTS Use the xml configuration for pretty much everything Separate unit and integration tests Your unit test folders should mirror your applications folder structure To only execute specific tests use phpunit --filter or phpunit tests/unit/module1 Use the strict mode from the get go and never turn it off. Imho: Don't have a test namespace. Nicer to read and shows production usage.
  • 69. DISCUSSION Issues? Feature requests? Anything I missed?