unit testing in php

Post on 17-May-2015

952 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

PHP Unit Presentation by Silviu Butnariu held at Pentalog's headquarters in Cluj-Napoca on 26th September 2013.

TRANSCRIPT

Unit testing in PHP

by Silviu Butnariu (sbutnariu@pentalog.fr)

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

top related