The most unknown parts ofPHPUnitBastian Feder           Confoo 2011 Montrealbastian.feder@liip.ch        11th March 2011
… on the command line -- testdox[-(html|text)]         -- filter <pattern> generates a especially styled    filters which ...
… on the command line                                 (cont.) -- stop-on-failure stops the testrun on the first recognized...
Assertions „In computer programming, an assertion is a predicate (for example a true–false statement) placed in a program ...
Assertions         (cont.) assertContains(), assertContainsOnly() Cameleon within the asserts, handles   Strings ( like st...
Assertions         (cont.) assertXMLFileEqualsXMLFile() assertXMLStringEqualsXMLFile() assertXMLStringEqualsXMLString() $t...
Assertions      (cont.)     $ phpunit XmlFileEqualsXmlFileTest.php     PHPUnit 3.4.15 by Sebastian Bergmann.     …     1) ...
Assertions         (cont.) assertObjectHasAttribute(), assertClassHasAttribute() Overcomes visibilty by using Reflection-A...
Assertions           (cont.) assertAttribute*() Asserts the content of a class attribute regardless its visibility […]    ...
Assertions         (cont.) assertType() // TYPE_OBJECT $this->assertType( FluentDOM, new FluentDOM ); $this->assertInstanc...
Assertions         (cont.) assertSelectEquals(), assertSelectCount() Assert the presence, absence, or count of elements in...
Assertions         (cont.) assertSelectRegExp() $xml = =       <items version="1.0">        <persons>          <person cla...
Assertions         (cont.) assertThat() Evaluates constraints to build complex assertions. $this->assertThat(     $expecte...
Inverted Assertions Mostly every assertion has an inverted sibling. assertNotContains() assertNotThat() assertAttributeNot...
Annotations „In software programming, annotations are used mainly for the purpose of expanding code documentation and comm...
Annotations              (cont.)/** @covers, @group * @covers myClass::run * @group exceptions * @group Trac-123 */public ...
Annotations              (cont.)    @dependspublic function testIsApcAvailable() {     if ( ! extension_loaded( apc ) ) { ...
Special tests Testing exceptions     @expectedException /**  * @expectedException InvalidArgumentException  */ public func...
Special tests              (cont.)    Testing exceptions      setExpectedException( Exception )public function testInvalid...
Special tests              (cont.)    Testing exceptions      try/catchpublic function testInvalidArgumentException() {   ...
Special tests            (cont.) public function callbackGetObject($name, $className = ) {     retrun (strtolower($name) =...
Special tests             (cont.)[…]$application = $this->getMock(FluentDOM);$application    ->expects($this->any())    ->...
Special tests              (cont.)    implicit integration testspublic function testGet() {      $mock = $this->getMock(  ...
Questions@lapistanolapistano@php.net
Slidesn contact Please comment the talk on joind.in   http://joind.in/2879   http://joind.in/2848 Slides   http://slidesha...
PHP5.3 Powerworkshop               New features of PHP5.3               Best Pratices using OOP               PHPUnit     ...
License            This set of slides and the source code included        in the download package is licensed under theCr...
Upcoming SlideShare
Loading in...5
×

PhpUnit - The most unknown Parts

5,289

Published on

A lot of people using PHPunit for testing their source code. While I was observing my team
I recognized most of them are only using the standard ssertions like 'assertEquals()' or
'assertTrue()' and are complaining about how hard it is to test the code even when the tests are written first. This talk is about all the stuff not used on a daily basis. It shows you some nice features of PHPUnit and how to use them for your benefit.

Published in: Education

PhpUnit - The most unknown Parts

  1. 1. The most unknown parts ofPHPUnitBastian Feder Confoo 2011 Montrealbastian.feder@liip.ch 11th March 2011
  2. 2. … on the command line -- testdox[-(html|text)] -- filter <pattern> generates a especially styled filters which testsuite to run. test report. $ phpunit --filter Handler --testdox ./ PHPUnit 3.4.15 by Sebastian Bergmann. FluentDOMCore [x] Get handler FluentDOMHandler [x] Insert nodes after [x] Insert nodes before
  3. 3. … on the command line (cont.) -- stop-on-failure stops the testrun on the first recognized failure. -- coverage-(html|source|clover) <(dir|file)> generates a report on how many lines of the code has how often been executed. -- group <groupname [, groupname]> runs only the named group(s). -- d key[=value] alter ini-settings (e.g. memory_limit, max_execution_time)
  4. 4. Assertions „In computer programming, an assertion is a predicate (for example a true–false statement) placed in a program to indicate that the developer thinks that the predicate is always true at that place. [...] It may be used to verify that an assumption made by the programmer during the implementation of the program remains valid when the program is executed.. [...]“ (Wikipedia, http://en.wikipedia.org/w/index.php?title=Assertion_(computing)&oldid=382473744)
  5. 5. Assertions (cont.) assertContains(), assertContainsOnly() Cameleon within the asserts, handles Strings ( like strpos() ) Arrays ( like in_array() ) $this->assertContains(baz, foobar); $this->assertContainsOnly(string, array(1, 2, 3));
  6. 6. Assertions (cont.) assertXMLFileEqualsXMLFile() assertXMLStringEqualsXMLFile() assertXMLStringEqualsXMLString() $this->assertXMLFileEqualsXMLFile( /path/to/Expected.xml, /path/to/Fixture.xml );
  7. 7. Assertions (cont.) $ phpunit XmlFileEqualsXmlFileTest.php PHPUnit 3.4.15 by Sebastian Bergmann. … 1) XmlFileEqualsXmlFileTest::testFailure Failed asserting that two strings are equal. --- Expected +++ Actual @@ -1,4 +1,4 @@ <?xml version="1.0"?> <foo> - <bar/> + <baz/> </foo> /dev/tests/XmlFileEqualsXmlFileTest.php:7
  8. 8. Assertions (cont.) assertObjectHasAttribute(), assertClassHasAttribute() Overcomes visibilty by using Reflection-API Testifies the existance of a property, not its content $this->assertObjectHasAttribute( myPrivateAttribute, new stdClass() ); $this->assertObjectHasAttribute( myPrivateAttribute, stdClass );
  9. 9. Assertions (cont.) assertAttribute*() Asserts the content of a class attribute regardless its visibility […] private $collection = array( 1, 2, 3 ); private $name = Jakob; […] $this->assertAttributeContainsOnly( integer, collection, new FluentDOM ); $this->assertAttributeContains( ko, name, new FluentDOM );
  10. 10. Assertions (cont.) assertType() // TYPE_OBJECT $this->assertType( FluentDOM, new FluentDOM ); $this->assertInstanceOf( FluentDOM, new FluentDOM ); // TYPE_STRING $this->assertType( string, 4221 ); // TYPE_INTEGER $this->assertType( integer, 4221 ); // TYPE_RESSOURCE $this->assertType( resource, fopen(/file.txt, r );
  11. 11. Assertions (cont.) assertSelectEquals(), assertSelectCount() Assert the presence, absence, or count of elements in a document. Uses CSS selectors to select DOMNodes Handles XML and HTML $this->assertSelectEquals( #myElement, myContent, 3, $xml ); $this->assertSelectCount( #myElement, false, $xml );
  12. 12. Assertions (cont.) assertSelectRegExp() $xml = = <items version="1.0"> <persons> <person class="firstname">Thomas</person> <person class="firstname">Jakob</person> <person class="firstname">Bastian</person> </persons> </items> ; $this->assertSelectRegExp( person[class*="name"],(Jakob|Bastian), 2, $xml);
  13. 13. Assertions (cont.) assertThat() Evaluates constraints to build complex assertions. $this->assertThat( $expected, $ths->logicalAnd( $this->isInstanceOf(tire), $this->logicalNot( $this->identicalTo($myFrontTire) ) ) );
  14. 14. Inverted Assertions Mostly every assertion has an inverted sibling. assertNotContains() assertNotThat() assertAttributeNotSame() …
  15. 15. Annotations „In software programming, annotations are used mainly for the purpose of expanding code documentation and comments. They are typically ignored when the code is compiled or executed.“ ( Wikipedia: http://en.wikipedia.org/w/index.php?title=Annotation&oldid=385076084 )
  16. 16. Annotations (cont.)/** @covers, @group * @covers myClass::run * @group exceptions * @group Trac-123 */public function testInvalidArgumentException() { $obj = new myClass(); try{ $obj->run( invalidArgument ); $this->fail(Expected exception not thrown.); } catch ( InvalidArgumentException $e ) { }}
  17. 17. Annotations (cont.) @dependspublic function testIsApcAvailable() { if ( ! extension_loaded( apc ) ) { $this->markTestSkipped( Required APC not available ); }}/** * @depend testIsApcAvailable */public function testGetFileFromAPC () {}
  18. 18. Special tests Testing exceptions @expectedException /** * @expectedException InvalidArgumentException */ public function testInvalidArgumentException() { $obj = new myClass(); $obj->run(invalidArgument); }
  19. 19. Special tests (cont.) Testing exceptions setExpectedException( Exception )public function testInvalidArgumentException() { $this->setExpectedException(InvalidArgumentException ) $obj = new myClass(); $obj->run(invalidArgument);}
  20. 20. Special tests (cont.) Testing exceptions try/catchpublic function testInvalidArgumentException() { $obj = new myClass(); try{ $obj->run( invalidArgument ); $this->fail(Expected exception not thrown.); } catch ( InvalidArgumentException $e ) { }}
  21. 21. Special tests (cont.) public function callbackGetObject($name, $className = ) { retrun (strtolower($name) == Jakob)?: false; } […] $application = $this->getMock(FluentDOM); $application ->expects($this->any()) ->method(getObject) ->will( $this->returnCallback( array($this, callbackGetObject) ) ); […]
  22. 22. Special tests (cont.)[…]$application = $this->getMock(FluentDOM);$application ->expects($this->any()) ->method(getObject) ->will( $this->onConsecutiveCalls( array($this, callbackGetObject, $this->returnValue(true), $this->returnValue(false), $this->equalTo($expected) ) );[…]
  23. 23. Special tests (cont.) implicit integration testspublic function testGet() { $mock = $this->getMock( myAbstraction, array( method ) ); $mock ->expected( $this->once() ) ->method( methoSd ) ->will( $this->returnValue( return );}
  24. 24. Questions@lapistanolapistano@php.net
  25. 25. Slidesn contact Please comment the talk on joind.in http://joind.in/2879 http://joind.in/2848 Slides http://slideshare.net/lapistano Email: bastian.feder@liip.ch
  26. 26. PHP5.3 Powerworkshop New features of PHP5.3 Best Pratices using OOP PHPUnit PHPDocumentor
  27. 27. License  This set of slides and the source code included in the download package is licensed under theCreative Commons Attribution-Noncommercial-Share Alike 2.0 Generic License http://creativecommons.org/licenses/by-nc-sa/2.0/deed.en

×