international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit

Post on 11-May-2015

770 views 0 download

Tags:

Transcript of international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit

The most unknown parts of PHPUnit

Bastian Federlapistano@php.net

IPC Spring 2011 Berlinl1st June 2011

Me, myself & I

JavaScript since 2002

PHP since 2001

Trainer & coach

Opensource addict

PHP manual translations

FluentDOM

...

CLI

… on the command line

-- testdox[-(html|text)]generates a especially styled 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

-- filter <pattern>filters which testsuite to run.

… on the command line (cont.)

-- strictmarks test without an assertion as incomplete. Use in combination with –verbose to get the name of the test.

-- 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)

Annotations

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 )

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 ) { }}

Annotations (cont.)

Depending on other tests

public function testIsApcAvailable() {

if ( ! extension_loaded( 'apc' ) ) { $this->markTestSkipped( 'Required APC not available' ); } }

/** * @depend testIsApcAvailable */public function testGetFileFromAPC () {

}

Assertions

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)

Assertions (cont.)

assertContains(), assertContainsOnly()

Cameleon within the asserts, handles

Strings ( like strpos() )

Arrays ( like in_array() )

$this->assertContains('bar', 'foobar'); // ✓

$this->assertContainsOnly('string', array('1', '2', 3)); // ✗

Assertions (cont.)

assertXMLFileEqualsXMLFile()

assertXMLStringEqualsXMLFile()

assertXMLStringEqualsXMLString()

$this->assertXMLFileEqualsXMLFile( '/path/to/Expected.xml', '/path/to/Fixture.xml');

Assertions (cont.)

$ phpunit XmlFileEqualsXmlFileTest.phpPHPUnit 3.4.15 by Sebastian Bergmann.…

1) XmlFileEqualsXmlFileTest::testFailureFailed 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

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 myClass );

$this->assertAttributeContains( 'ko', 'name', new myClass );

Assertions (cont.)

assertType()

// TYPE_OBJECT$this->assertType( 'FluentDOM', new FluentDOM );

$this->assertInstanceOf( 'FluentDOM', new FluentDOM );

// TYPE_STRING$this->assertInternalType( 'string', '4221' );

// TYPE_INTEGER$this->assertInternalType( 'integer', 4221 );

// TYPE_RESSOURCE$this->assertInternalType( 'resource', fopen('/file.txt', 'r' );

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);

Assertions (cont.)

assertThat()

Evaluates constraints to build complex assertions.

$this->assertThat( $expected, $ths->logicalAnd( $this->isInstanceOf('tire'), $this->logicalNot( $this->identicalTo($myFrontTire) ) ));

Weaving in

Test Listeners

Get called on several states of the test runner

startTest

endTest

addIncompleteTest

Test Listeners (cont.)

Configuration

Add to your phpunit.xml

<listeners> <listener class="myListener" file="PATH/TO/YOUR/CODE"> <arguments> <string>build/log</string> </arguments> </listener></listeners>

Test Listeners (cont.)

Implementation example

class ListenerLog implements PHPUnit_Framework_TestListener{ public function __construct($path) { $this->path = $path; }

public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { $this->log("Test suite '%s' precesed.\n", $test->getName()); }

}

Specialities

Special tests

Testing exceptions

@expectedException

/** * @expectedException InvalidArgumentException */public function testInvalidArgumentException() {

$obj = new myClass(); $obj->run('invalidArgument');

}

Special tests (cont.)

Testing exceptions

setExpectedException( 'Exception' )

for internal use only!!

don't use it directly any more.

Special tests (cont.)

Testing exceptions

try/catch

Does not work when using --strict switch

public function testInvalidArgumentException() {

$obj = new myClass(); try{ $obj->run( 'invalidArgument' ); $this->fail('Expected exception not thrown.'); } catch ( InvalidArgumentException $e ) { }}

Special tests (cont.)

public function callbackGetObject($name, $className = '') { retrun strtolower($name) == 'Jakob';}

[…]

$application = $this->getMock('FluentDOM');$application ->expects($this->any()) ->method('getObject') ->will( $this->returnCallback( array($this, 'callbackGetObject') ) );[…]

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) ) );

[…]

Special tests (cont.)

implicit integration tests

public function testGet() {

$mock = $this->getMock( 'myAbstraction' ); $mock ->expected( $this->once() ) ->method( 'method' ) ->will( $this->returnValue( 'return' );}

Questions@lapistano

lapistano@php.net

Slides'n contact

Please comment the talk on joind.in

http://joind.in/3518Slides

http://slideshare.net/lapistano Email:

lapistano@php.net

License

This set of slides and the source code included in the download package is licensed under the

Creative Commons Attribution-Noncommercial-Share Alike 2.0 Generic License

http://creativecommons.org/licenses/by-nc-sa/2.0/deed.en