The State of PHPUnit


Published on

Slides for my FrOSCon talk:

Published in: Technology
  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

The State of PHPUnit

  1. 1. THE STATE OF PHPUNIT Volker Dusch / @__edorian
  2. 2. ABOUT MEPHP since 10 yearsCICleanCodeDevOpsTDDShipping
  3. 3. GET IN TOUCHstackoverflow:Twitter: @__edorianXing / G+: Volker DuschIRC: edorianMail:
  4. 4. LETS GO
  5. 5. Unit testing in PHP got mainstream
  6. 6. THATS A GOOD THING! Unit testing got "normal" in PHPEven people that dont really know PHP or even the CLI know that they should write unit tests.
  7. 7. AGENDACurrent StatePHPUnit.nextThe EcoSystemAnnoying things we got rid ofFeatures you might have missedUpcoming stuffTest suite organizationDiscussion
  8. 8. CURRENT STATEVersion: 3.6.12Over 60 contributors since 3.6.0Deep into the 3.6 Bugfix cycle, no new features will be added. Thosego into .nextFrench docs thanks to @poum and still current Japanese docs thanksto @m-takagi!If you want to help out:
  9. 9. PHPUNIT.NEXT Next up: 3.7 15+ features 10+ issues fixed Details later
  10. 10. BCDid you like upgrading to PHPUnit 3.6?
  11. 11. BC FREE-ISHWe 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 thats it
  12. 12. THE ECOSYSTEM & friends
  13. 13. BDD Use Behat, Its great!Were not going to remove the BDD stuff in PHPUnit but Its not being worked on.
  14. 14. WEB INTERFACE?Not sure why youd want that but someone solved that for you
  15. 15. MOCKING IS UGLY! Real world problems and solutions:[phpunit] mock
  16. 16. MOCKERY Try it! Its great. Afraid it might be hard to set up and use?Look into 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 }
  17. 17. LOTS OF LEGACY CODE? Or whatever "hard to test" is called these days. of the main purpose of this library is to expose invisible (private or protected) methods and properties to the SUT.
  18. 18. TESTING WEB SERVICESUnit and Integration test web services with the same code? Try wsUnit
  19. 19. IDE SUPPORTNetbeans support improved and they adopted the skeleton-generatorHonestly I have no clue about eclipsePHPStorm has really beautiful coverage support by nowvim user? : p p n t - c v r g - e t !hui -oeaetx
  20. 20. JENKINSJenkins template: jenkins-php.orgclover php plugin
  21. 21. TRAVIS CIAwesome for GitHub and collaborationEveryone has the way to run their tests documented by nowNo really CI but a very cool test runnerUse --coverage-text if you want to show off :)
  22. 22. COMPOSER Last week: When someone does the work it it will happen This week: Someone did. Current status at
  23. 23. PHAR The PHP tool formatWe 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.
  24. 24. PHPUNIT-SELENIUM Now maintained by @giorgiosironi Code coverage supportIf you ask me: Dont drive your web tests with phpunit. Use Behat or something non php.
  26. 26. @ BLOCKWhen using process-isolation PHPUnit wont die silently when unserializing of the test result fails.
  27. 27. CLI ARGUMENT PARSING ppntTsATsAppTsBTsBpp hui et et.h et et.hThis only executed TestA. Now it gives you an error message that you are doing it wrong.
  28. 28. HEY, LISTEN!Test listeners now trigger one autoload call instead of being silently ignored when the class was not loaded.
  29. 29. EXCEPTIONAL Improved reporting of exceptions...pbi fnto tsNseEcpin( ulc ucin etetdxetos){ $3=nwEcpinhe; e e xeto(Tre) $2=nwIvldruetxeto(To,0 $3; e e naiAgmnEcpinw , e) $1=nwEcpinn 0 $2; e e xeto(Oe, , e) trw$1 ho e;} because it only told you...EcpintcTs:tsNseEcpin xetoSaket:etetdxetosEcpin Oe xeto: n[rc] tae but now...
  30. 30. 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
  31. 31. ?????????????????Fixed an annoying crash when using --process-isolation with PHP 5.3 and detect_unicode=on.
  32. 32. EVEN MORE EXCEPTIONAL@xetdxeto xeto epceEcpin Ecpin Works again!
  33. 33. ONE MORE THINGFtlerr Ucuh ecpinHUi_rmwr_xetowt msaee aa ro: nagt xeto PPntFaeokEcpin ih esg Nite "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 cant find any tests.
  35. 35. LINE ENDINGS MISMATCHIse0Ts:tsCmaeifrnLnEdns su53et:etoprDfeetienigFie asrigta tosrnsaeietcl ald setn ht w tig r dnia.--Epce - xetd++Ata + cul@ @ @ @ #ann:Srnscnandfeetln edns Wrig tig oti ifrn ie nig! fo o
  36. 36. IMPROVED THE JSON LOGIf tests produce output it is now properly included in the log.
  37. 37. BOOTSTRAP ORDERBootstrap script should be loaded before trying to load testSuiteLoaderClass.
  38. 38. PROCESS ISOLATION FOR EVERYONEProcess Isolation did not work when PHPUnit is invoked through Apache Ant, for instance, due to PHP binary detection issues.
  39. 39. @EXPECTEDEXCEPTIONCODE Now can be 0 or a string. Useful for PDO
  40. 40. BINARY MESS Before it broke your terminal and BEEPed at you1 Foet:eto ) oTs:tsFoFie 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....
  41. 41. ONE LINE ANNOTATIONS You can use:/*@xetdxeto uaEcpin* * epceEcpin Fbrxeto /
  42. 42. COUNTING ON ITNow working with Countable and Iterator Interfaces: assertCount() assertAttributeCount() assertNotCount() assertAttributeNotCount() assertSameSize() assertNotSameSize()
  43. 43. FLUENT INTERFACES A little mock improvement:-wl(ti-rtrSl() >il$hs>eunef);
  44. 44. @REQUIRES/* * *@eursPP54 rqie H . */pbi fnto tsTat) ulc ucin etri({}
  45. 45. REQUIRES<ie fl ppeso=530 hVrin".." ppesoOeao=>" hVrinprtr"=>/aht/yetpp pt/oMTs.h<fl> /ie
  46. 46. MAGIC SUPPORTassertEquals() now looks for (and invokes) a __toString() method when an object and string are compared.
  47. 47. PERFORMANCEsetUpBeforeClass() and tearDownAfterClass() are no longer invoked when all tests of the class are skipped
  49. 49. 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.
  50. 50. *TEST.PHP IS TOO MAINSTREAMAdded --test-suffix that allows specifying which filename suffixes are recognised by PHPUnit. Helps out some projects with their CI. I dont see a general use case.
  51. 51. {"JSON": "YES PLEASE"}We added assertJson* functions that work like the existing assertXml* functions. asrJoFlEulJoFl( setsnieqassnie) asrJoSrnEulJoFl( setsntigqassnie) asrJoSrnEulJoSrn( setsntigqassntig)
  52. 52. CALLBACK MATCHER Helps with complex assertions on mockspbi fnto sn(msae EdonCni $ofg ulc ucin ed$esg, npitofg cni) Its not pretty but it might solve that one annoying problem:$o-epcs$hs>ne) fo>xet(ti-oc() -mto(sn >ehded) -wt( >ih $hs>qaT(sn) ti-euloy, $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 } ) );
  53. 53. OO-ARRAYSasrAryaKy) setraHse(asrAryoHse( setraNtaKy) Now work with objects that implement ArrayAccess.
  54. 54. PHPUNIT.XSD PHPUnit now provides a configuration.xsd schema file. 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 [.] .. >
  55. 55. 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
  56. 56. .PHPT IMPROVEMENTS-TS- -ET-G-0:asrEul( Ln Edn DfeecsAeOsue H53 setqas) ie nig ifrne r bcr-FL- -IE-<pp ?h$SRE[ag[]=-ocniuain; _EVRrv]1 -n-ofgrto$SRE[ag[]=su53et; _EVRrv]2 Ise0Ts$SRE[ag[]=_DR_./0/su53etpp; _EVRrv]3 _I_)53Ise0Ts.hrqieoc _DR_../../HUi/uoodpp; eur_ne _I_ /../.PPntAtla.hPPntTxU_omn:mi(; HUi_etICmad:an)?>
  57. 57. .PHPT IMPROVEMENTS-EPCF- -XET-PPnt% b SbsinBrmn. HUi s y eata eganFTm:% %,Mmr:%M ie i s eoy sbTeews1fiue hr a alr:1 Ise0Ts:tsCmaeifrnLnEdns ) su53et:etoprDfeetienigFie 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! ALRSTss 1 Asrin:1 Fiue:1 et: , setos , alrs .
  58. 58. .PHPT IMPROVEMENTSBefore 3.7 diffs where really hard to read.Now the diff will be processed line by line.
  59. 59. LISTS AND COLLECTIONSpbi 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.
  60. 60. FAILED @EXPECTEDEXCEPTION ANNOTATIONS Before:Fie asrigta ecpino tp "roEcpin mthsepce ecp ald setn ht xeto f ye Errxeto" ace xetd xeto "yxeto" in MEcpin. Now:Fie asrigta ecpino tp "roEcpin mthsepce ecp ald setn ht xeto f ye Errxeto" ace xetd xeto "yxeto" in MEcpin.Msaefo "roEcpin ws"neie vral $ts. esg rm Errxeto" a udfnd aibe hi"
  61. 61. 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.
  62. 62. 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
  64. 64. FOLDER LAYOUT?poet rjc/ ppntxlds sc r/ tss et/ bosrppp otta.h ui/ nt itgto/ neain fntoa/(rsse/ ucinl o ytm) hles epr/
  66. 66. SMALL HINTSUse the xml configuration for pretty much everythingSeparate unit and integration testsYour unit test folders should mirror your applications folderstructureTo only execute specific tests use phpunit --filter or phpunittests/unit/module1Use the strict mode from the get go and never turn it off.Imho: Dont have a test namespace. Nicer to read and showsproduction usage.
  67. 67. DISCUSSION Issues? Feature requests? Anything I missed?
  68. 68. THANK YOU