Download - Unit Testing in PHP
Unit testing in PHP
by Silviu Butnariu ([email protected])
What’s that?Unit testing = testing bunches of code, not the
whole application
PhpUnit was created by Sebastian Bergamann
It’s part of xUnit family – most used unit testers
Used for automatic tests – makes the machine do the work
What are the benefits of unit testing?
Uncover bugs easier – good tests go trough all possible program paths
Assure high code coverage – measurable code quality indicator
Faster than manual testing
Suitable for teamwork
Installing PhpUnitWith PEAR: pear config-set auto_discover 1pear install phpunit/PHPUnit
With composer (dependency manager for php); just add to composer.json:
{ "require-dev": { "phpunit/phpunit": "3.7.*" } }and update the composer
Basic test
Test result notations
. – success
F – failure
E – error
I – incomplete
S - skipped
AssertionsHelper functions that compare an expected result
with the actual one:- assertEquals()- assertFalse()- assertArrayHasKey()- assertInstanceOf()- assertNotNull()- assertRegExp()- etc.
Dependency injection
DI is a software pattern that allows the removal of hard-coded dependencies
Highly coupled dependencies – bad
Loose coupled dependencies - awesome
Improves code readability, reusability
DI guidelinesDon’t use ‘new’
Pass dependencies as method parameters
DI allows real unit testing, by separating modules
Read the DI best practices
Mocking objectsCreating fake objects that act in a
predefined and predictable way
Stubbing methodsIn close relation to mockingStubbing implies faking a method from the
mock object
Static methodsAvoid static methods
Can’t mock static calls to outside classes!
AnnotationsThese syntactic metadata are used for
specifying some special case behaviors- @covers- @test- @dataProvider- @expectedException- @group- etc.
Data ProviderAllows to bunch up more test cases into
one, thus reducing code duplicity
Testing exceptions
setUp & tearDownsetUp(), tearDown() – executed once for each test methodsetUpBeforeClass(), tearDownAfterClass() - called before
the first test of the test case and after the last test
DB testingNeed extension: pear install phpunit/DbUnitSupported dbs: mysql, postgre, oracle, sqliteThere are 4 stages of db testing:
- set up fixture- exercise SUT- verify outcome- teardown
Important methods: - getConnection() - connection data (host,db,pass)- getDataSet() – defines state of DB before each test
DB testingOnce setting up the ‘fake’ db connection tests can be
executed to check queries
The db changes that occur during the tests don’t persist
Can verify number of rows after insertion, check query results, etc.
This is the safest way of fully testing an application (versus mocking db connection)
Skeleton GeneratorAutomatically generates test classes based
on assertions in the code
IDE integrationIntegrated in most ides: Eclipse, NetBeans,
PhpStorm, etc
Code coverageGenerating statistics with naked PhpUnitphpunit -c app/ --coverage-
html={foldername}
Code coverageFFFFFFF
Documentationhttp://phpunit.de/manual/3.7/en/
Q & A
THANKS !!!