sfcon: test driven development
DESCRIPTION
Uma pequena introdução a TDDTRANSCRIPT
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