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 assertions like 'assertEquals()' 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 and it digs deep into uncommon features of PHPUnit.
4. … 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
5. … on the command line (cont.)
-- strict
marks 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)
7. 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 )
9. Annotations (cont.)
Depending on other tests
public function testIsApcAvailable() {
if ( ! extension_loaded( 'apc' ) ) {
$this->markTestSkipped( 'Required APC not available' );
}
}
/**
* @depend testIsApcAvailable
*/
public function testGetFileFromAPC () {
}
11. 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)
12. 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)); // ✗
20. Test Listeners
Get called on several states of the test runner
startTest
endTest
addIncompleteTest
…
21. 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>
22. 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());
}
}
24. Special tests
Testing exceptions
@expectedException
/**
* @expectedException InvalidArgumentException
*/
public function testInvalidArgumentException() {
$obj = new myClass();
$obj->run('invalidArgument');
}
25. Special tests (cont.)
Testing exceptions
setExpectedException( 'Exception' )
for internal use only!!
don't use it directly any more.
26. 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 ) {
}
}
27. 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')
)
);
[…]
31. Slides'n contact
Please comment the talk on joind.in
http://joind.in/3518
Slides
http://slideshare.net/lapistano
Email:
lapistano@php.net
32. PHP5.3 Powerworkshop
New features of PHP5.3
Best Pratices using OOP
PHPUnit
PHPDocumentor
33. 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