SlideShare a Scribd company logo
THE STATE OF PHPUNIT
     Volker Dusch / @__edorian
ABOUT ME
PHP since 10 years
CI
CleanCode
DevOps
TDD
Shipping
The State of PHPUnit
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
The State of PHPUnit
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

More Related Content

PDF
The State of PHPUnit
PDF
The state of PHPUnit
PDF
JavaFX, because you're worth it
PDF
Introduction to JavaFX 2
PDF
Test your code like a pro - PHPUnit in practice
PDF
Voxxed Days Vilnius 2015 - Having fun with Javassist
PPT
Unit Testing using PHPUnit
PDF
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
The State of PHPUnit
The state of PHPUnit
JavaFX, because you're worth it
Introduction to JavaFX 2
Test your code like a pro - PHPUnit in practice
Voxxed Days Vilnius 2015 - Having fun with Javassist
Unit Testing using PHPUnit
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices

What's hot (20)

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

Viewers also liked (14)

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

Similar to The State of PHPUnit (20)

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

More from Edorian (11)

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

Recently uploaded (20)

PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPT
Teaching material agriculture food technology
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Machine learning based COVID-19 study performance prediction
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
cuic standard and advanced reporting.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Cloud computing and distributed systems.
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Encapsulation theory and applications.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Reach Out and Touch Someone: Haptics and Empathic Computing
Teaching material agriculture food technology
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
MYSQL Presentation for SQL database connectivity
Machine learning based COVID-19 study performance prediction
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
The Rise and Fall of 3GPP – Time for a Sabbatical?
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
cuic standard and advanced reporting.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Building Integrated photovoltaic BIPV_UPV.pdf
Cloud computing and distributed systems.
Encapsulation_ Review paper, used for researhc scholars
Review of recent advances in non-invasive hemoglobin estimation
Encapsulation theory and applications.pdf
Chapter 3 Spatial Domain Image Processing.pdf

The State of PHPUnit

  • 1. THE STATE OF PHPUNIT Volker Dusch / @__edorian
  • 2. ABOUT ME PHP since 10 years CI CleanCode DevOps TDD Shipping
  • 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
  • 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?