tdd, a starting point

36
TDD, a starting point A PHP perspective... Francesco Fullone, Ideato.it ff AT ideato.it

Upload: francesco-fullone

Post on 17-May-2015

2.035 views

Category:

Technology


1 download

DESCRIPTION

A PHP perspective on why start using tdd in a PHP project

TRANSCRIPT

Page 1: TDD, a starting point

TDD, a starting pointA PHP perspective...

Francesco Fullone, Ideato.itff AT ideato.it

Page 2: TDD, a starting point

Who am I

Francesco Fullone aka Fullo

- PHP developer since 1999

- President

- and Open Source Evangelist

- CEO @

- Nerd and geek

Page 3: TDD, a starting point

TDD ?

Page 4: TDD, a starting point

Test Driven Development

Page 5: TDD, a starting point

Why test the code?

Page 6: TDD, a starting point

Developers are humans, Humans are error-prone.

Page 7: TDD, a starting point

Software changes and grows.

Page 8: TDD, a starting point

We need to confirm that the code is working after any changes.

Page 9: TDD, a starting point

xUNIT TDD approach.

Page 10: TDD, a starting point
Page 11: TDD, a starting point

PHPUnit.de

Page 12: TDD, a starting point

Easy to writeEasy to read

IsolatedComposable

Page 13: TDD, a starting point

An example: The bowling kata

(courtesy grabbed from Sebastian Bergmann)

Page 14: TDD, a starting point

10 frames

2 rolls to knock down the 10 pins Score for a frame is the number of pins knocked down

Bonus for a spare (all 10 pins knocked down in two tries): next roll Bonus for a strike (all 10 pins knocked down in one try): next two rolls Extra rolls for spare or strike in the 10th frame

Page 15: TDD, a starting point

<?phprequire_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase{

}?>

Page 16: TDD, a starting point

<?phprequire_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase{

public function testScoreForGutterGameIs0(){

}

}

Page 17: TDD, a starting point

<?phprequire_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase{

public function testScoreForGutterGameIs0(){

$game = new BowlingGame;for ($i = 0; $i < 20; $i++) {

$game->roll(0);}

$this->assertEquals(0, $game->score());}

}

Page 18: TDD, a starting point

fullo@teletran ~ % phpunit --skeleton-class BowlingGameTestPHPUnit 3.4.2 by Sebastian Bergmann.Wrote skeleton for "BowlingGame" to "BowlingGame.php".

<?phpclass BowlingGame{

public function roll() { // Remove the following line when you

// implement this method.

throw new RuntimeException('Not yet implemented.'); }

public function score() {

// Remove the following line when you // implement this method.

throw new RuntimeException('Not yet implemented.'); }}

Page 19: TDD, a starting point

fullo@teletran ~ % phpunit BowlingGameTestPHPUnit 3.4.2 by Sebastian Bergmann.

E

Time: 0 seconds

There was 1 error:

1) BowlingGameTest::testScoreForGutterGameIs0RuntimeException: Not yet implemented./home/fullo/BowlingGame.php:10/home/fullo/BowlingGameTest.php:11

FAILURES!Tests: 1, Assertions: 0, Errors: 1.

Page 20: TDD, a starting point

<?phpclass BowlingGame{

public function roll($pins) { }

public function score() {

return 0; }}?>

Page 21: TDD, a starting point

fullo@teletran ~ % phpunit --colors BowlingGameTestPHPUnit 3.4.2 by Sebastian Bergmann.

.

Time: 0 seconds

OK (1 test, 1 assertion)

Page 22: TDD, a starting point

We have to write the tests when the code is

fresh.

Page 23: TDD, a starting point

<?phprequire_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase{

// …

public function testScoreForAllOnesIs20(){

$game = new BowlingGame;

for ($i = 0; $i < 20; $i++) { $game->roll(1); }

$this->assertEquals(20, $game->score());}

}

Page 24: TDD, a starting point

fullo@teletran ~ % phpunit –colors BowlingGameTestPHPUnit 3.4.2 by Sebastian Bergmann.

.F

Time: 0 seconds

There was 1 failure:

1) BowlingGameTest::testScoreForAllOnesIs20Failed asserting that <integer:0> matches expected value <integer:20>./home/fullo/BowlingGameTest.php:25

FAILURES!Tests: 2, Assertions: 2, Failures: 1.

Page 25: TDD, a starting point

<?phpclass BowlingGame{

protected $rolls = array();

public function roll($pins) { $this->rolls[] = $pins; }

public function score() {

return array_sum($this->rolls); } }

Page 26: TDD, a starting point

<?phprequire_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase{

// …

public function testScoreForOneSpareAnd3Is16(){

$game = new BowlingGame;

$game->roll(5); $game->roll(5); $game->roll(3);

// a function to to roll X times $this->rollMany(17, 0); $this->assertEquals(16, $game->score());

}

}

Page 27: TDD, a starting point

fullo@teletran ~ % phpunit –colors BowlingGameTestPHPUnit 3.4.2 by Sebastian Bergmann.

..F

Time: 0 seconds

There was 1 failure:

1) BowlingGameTest::testScoreForOneSpareAnd3is16Failed asserting that <integer:13> matches expected value <integer:16>./home/fullo/BowlingGameTest.php:33

FAILURES!Tests: 2, Assertions: 2, Failures: 1.

Page 28: TDD, a starting point

Tests can serve as an executable

specification.

Page 29: TDD, a starting point

fullo@teletran ~ % phpunit --testdox BowlingGameTestPHPUnit 3.4.2 by Sebastian Bergmann.

BowlingGame [x] Score for gutter game is 0 [ ] Score for all ones is 20 [ ] Score for one spare and 3 is 16 [ ] Score for one strike and 3 and 4 is 24 [ ] Score for perfect game is 300

Page 30: TDD, a starting point

Why Unit Test.

Page 31: TDD, a starting point

To write only clean and useful code.

Page 32: TDD, a starting point

To easily iterate in development design.

Page 33: TDD, a starting point

To check for regressions.

Page 34: TDD, a starting point

?

Page 35: TDD, a starting point

For more info see Sebastian Bergmann's Bowling Kata

Workshop!

http://www.slideshare.net/sebastian_bergmann/quality-assurance-in-

php-projects-2164371

Page 36: TDD, a starting point

Francesco Fulloneff AT ideato.itskype: ffullone

via Quinto Bucci 20547023 Cesena (FC)

info AT ideato.itwww.ideato.it