SfCon: Test Driven Development

Post on 03-Dec-2014

1,602 views 3 download

Tags:

description

Uma pequena introdução a TDD

transcript

Test Driven Development

Saturday, June 23, 2012

@AUGUSTOHP

@ALGANET

Saturday, June 23, 2012

AGENDA

• Evolução dos testes

• Motivações

• TDD (interativo)

Saturday, June 23, 2012

EVOLUÇÃO DOS TESTES

Saturday, June 23, 2012

var_dump($coisa);

Saturday, June 23, 2012

//var_dump($coisa);

Saturday, June 23, 2012

Breakpoints e Watchers!

Saturday, June 23, 2012

Breakpoints e Watchers!

Saturday, June 23, 2012

Testes automatizados

Saturday, June 23, 2012

Testes automatizados

Saturday, June 23, 2012

Testes automatizados

Verifica

ção

Saturday, June 23, 2012

Test Driven Development

Saturday, June 23, 2012

MOTIVAÇÃO

Saturday, June 23, 2012

CÓDIGO LIMPO QUE FUNCIONA

Saturday, June 23, 2012

CÓDIGO LIMPO QUE FUNCIONA

Esse é o código

Saturday, June 23, 2012

CÓDIGO LIMPO QUE FUNCIONA

Esse “somos nozes”

Saturday, June 23, 2012

CÓDIGO LIMPO QUE FUNCIONA

Objetivo do TDD

Saturday, June 23, 2012

2 REGRAS

Saturday, June 23, 2012

CÓDIGO NOVO = TESTE

Saturday, June 23, 2012

REFATORE

Saturday, June 23, 2012

O MANTRA DO TDD

Saturday, June 23, 2012

Saturday, June 23, 2012

• Vermelho : Escreva um teste (ele vai falhar)

Saturday, June 23, 2012

• Vermelho : Escreva um teste (ele vai falhar)

• Verde : Faça o teste funcionar

Saturday, June 23, 2012

• Vermelho : Escreva um teste (ele vai falhar)

• Verde : Faça o teste funcionar

• Refatore

Saturday, June 23, 2012

SESSÃO INTERATIVA DE TDD

Saturday, June 23, 2012

Saturday, June 23, 2012

O que faremos?

Saturday, June 23, 2012

• Lista de tarefas

Saturday, June 23, 2012

• Lista de tarefas

• Título

Saturday, June 23, 2012

1 <?php 2 class TaskTest extends PHPUnit_Framework_TestCase 3 { 4 public function testTitle() 5 { 6 $task = new SfCon\Task; 7 $title = 'Teste'; 8 $task->setTitle($title); 9 $this->assertEquals($title, $task->getTitle()); 10 $this->assertEquals($title, (string) $task); 11 } 12 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 4 Fatal error: Class 'SfCon\Task' not found in /Users/augustopascutti/Desktop/tdd/TaskTest.php on line 6

Saturday, June 23, 2012

1 <?php 2 namespace SfCon; 3 4 class Task 5 { 6 protected $title; 7 8 public function setTitle($string) 9 { 10 $this->title = $string; 11 return $this; 12 } 13 14 public function getTitle() 15 { 16 return $this->title; 17 } 18 19 public function __toString() 20 { 21 return (string) $this->getTitle(); 22 } 23 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 . 4 5 Time: 0 seconds, Memory: 2.75Mb 6 7 OK (1 test, 2 assertions)

Saturday, June 23, 2012

• Lista de tarefas

• Título

• ID

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 // ... 7 public function testId() 8 { 9 $task = new SfCon\Task(); 10 $id = 1; 11 $task->setId($id); 12 $this->assertEquals($id, $task->getId()); 13 } 14 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 . 4 Fatal error: Call to undefined method SfCon\Task::setId() in /Users/augustopascutti/Desktop/tdd/TaskTest.php on line 19

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 // ... 7 public function testId() 8 { 9 $task = new SfCon\Task(); 10 $id = 1; 11 $task->setId($id); 12 $this->assertEquals($id, $task->getId()); 13 } 14 }

Saturday, June 23, 2012

• Lista de tarefas

• Título

• ID

• Completa?

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 // ... 7 public function testDone() 8 { 9 $task = new SfCon\Task(); 10 $this->assertFalse($task->isDone()); 11 $task->setDone(); // Default: true 12 $this->assertTrue($task->isDone()); 13 $task->setDone(false); 14 $this->assertFalse($task->isDone()); 15 } 16 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 .. 4 Fatal error: Call to undefined method SfCon\Task::isDone() in /Users/augustopascutti/Desktop/tdd/TaskTest.php on line 26

Saturday, June 23, 2012

1 <?php 2 namespace SfCon; 3 4 class Task 5 { 6 // ... 7 protected $done = false; 8 9 // ... 10 public function setDone($bool=true) 11 { 12 $this->done = (boolean) $bool; 13 return $this; 14 } 15 16 public function isDone() 17 { 18 return $this->done; 19 } 20 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 ... 4 5 Time: 0 seconds, Memory: 2.75Mb 6 7 OK (3 tests, 6 assertions)

Saturday, June 23, 2012

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 // ... 7 public function testInsert() 8 { 9 $pdo = new Pdo('sqlite::memory:'); 10 $pdo->exec('CREATE TABLE tasks ( 11 id INTEGER PRIMARY KEY, 12 title TEXT, 13 done INTEGER 14 )'); 15 $task = new SfCon\Task($pdo); 16 $expectId = 1; 17 $task->setTitle('Test'); 18 $task->insert(); // Insert defines ID 19 $this->assertEquals($expectId, $task->getId()); 20 } 21 }

Saturday, June 23, 2012

1 <?php 2 namespace SfCon; 3 4 class Task 5 { 6 // ... 7 protected $pdo; 8 9 public function __construct(\Pdo $pdo=null) 10 { 11 if (!is_null($pdo)) 12 $this->pdo = $pdo; 13 } 14 // ... 15 public function insert() 16 { 17 $sql = 'INSERT INTO tasks (id, title, done) VALUES (?, ?, ?)'; 18 $st = $this->pdo->prepare($sql); 19 $st->bindValue(1, $this->getId()); 20 $st->bindValue(2, $this->getTitle()); 21 $st->bindValue(3, $this->isDone()); 22 $result = $st->execute(); 23 $this->setId($this->pdo->lastInsertId()); 24 return $result; 25 } 26 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 .... 4 5 Time: 0 seconds, Memory: 2.75Mb 6 7 OK (4 tests, 9 assertions)

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 Task 4 [x] Title 5 [x] Id 6 [x] Done 7 [x] Insert

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 public function testSetterGetterForTitle() 7 { 8 // ... 9 } 10 11 public function testSetterGetterForId() 12 { 13 // ... 14 } 15 16 public function testSetterGetterForDone() 17 { 18 // ... 19 } 20 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 Task 4 [x] Setter getter for title 5 [x] Setter getter for id 6 [x] Setter getter for done 7 [x] Insert

Saturday, June 23, 2012

Saturday, June 23, 2012

Saturday, June 23, 2012

Saturday, June 23, 2012

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

• Cobrir variações

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 // ... 7 public function provideValidTitles() 8 { 9 return array( 10 array('This is a valid title'), 11 array('This is also a valid title ...'), 12 array('Hello World'), 13 array('Hakuna Matata'), 14 array('Do some more tests') 15 ); 16 } 17 18 /** 19 * @dataProvider provideValidTitles 20 */ 21 public function testSetterGetterForTitle($title) 22 { 23 $this->fixture->setTitle($title); 24 $this->assertEquals($title, $this->fixture->getTitle()); 25 $this->assertEquals($title, (string) $this->fixture); 26 } 27 // ...Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 protected $fixture; 7 protected $pdo; 8 9 public function setUp() 10 { 11 $this->pdo = new Pdo('sqlite::memory:'); 12 $this->fixture = new SfCon\Task($this->pdo); 13 $this->pdo->exec('CREATE TABLE IF NOT EXISTS tasks ( 14 id INTEGER PRIMARY KEY, 15 title TEXT, 16 done INTEGER 17 )'); 18 } 19 20 public function tearDown() 21 { 22 $this->pdo->exec('DROP TABLE tasks'); 23 } 24 // ... 25 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 .............. 4 5 Time: 0 seconds, Memory: 2.75Mb 6 7 OK (14 tests, 45 assertions)

Saturday, June 23, 2012

Saturday, June 23, 2012

CUIDADO COM O 100% DE COVERAGE

Saturday, June 23, 2012

Linhas não testadas

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 /** 7 * @dataProvider provideValidTitles 8 */ 9 public function testSetterGetterForTitle($title) 10 { 11 $instance = $task->setTitle($title); 12 $this->assertEquals($task, $instance); 13 $this->assertEquals($title, $task->getTitle()); 14 $this->assertEquals($title, (string) $task); 15 } 16 }

Saturday, June 23, 2012

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

• Cobrir variações

• Mocks / Stubs

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 public function testInsert() 7 { 8 $con = array('sqlite::memory:'); 9 $met = array('prepare', 'lastInsertId'); 10 // ... 11 $this->pdo = $this->getMock('Pdo', $met, $con); 12 $this->pdo->expects($this->once()) 13 ->method('prepare') 14 ->with($this->equalTo(SfCon\Task::SQL_INSERT)) 15 ->will($this->returnValue($mockIns)); 16 } 17 }

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 public function testInsert() 7 { 8 // ... 9 $met = array('bindValue', 'execute'); 10 $mockIns = $this->getMock('PdoStatement', $met); 11 $mockIns->expects($this->exactly(3)) 12 ->method('bindValue') 13 ->with($this->greaterThan(0), 14 $this->anything()); 15 // ... 16 } 17 }

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 public function testInsert() 7 { 8 // ... 9 $mockIns->expects($this->once()) 10 ->method('execute') 11 ->will($this->returnValue(true)); 12 // ... 13 } 14 }

Saturday, June 23, 2012

1 <?php 2 require 'SfCon/Task.php'; 3 4 class TaskTest extends PHPUnit_Framework_TestCase 5 { 6 public function testInsert() 7 { 8 // ... 9 $this->pdo->expects($this->once()) 10 ->method('lastInsertId') 11 ->will($this->returnValue(1)); 12 13 $task = new SfCon\Task($this->pdo); 14 $task->setTitle($title); 15 $task->insert(); 16 $this->assertEquals($expectId, $task->getId()); 17 } 18 }

Saturday, June 23, 2012

1 PHPUnit 3.6.10 by Sebastian Bergmann. 2 3 ............... 4 5 Time: 0 seconds, Memory: 3.25Mb 6 7 OK (15 tests, 45 assertions)

Saturday, June 23, 2012

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

• Cobrir variações

• Mocks / Stubs

• Bugs regressivos

perguntas?

Saturday, June 23, 2012