+ All Categories
Home > Technology > SfCon: Test Driven Development

SfCon: Test Driven Development

Date post: 03-Dec-2014
Category:
Upload: augusto-pascutti
View: 1,602 times
Download: 3 times
Share this document with a friend
Description:
Uma pequena introdução a TDD
Popular Tags:
68
Test Driven Development Saturday, June 23, 2012
Transcript
Page 1: SfCon: Test Driven Development

Test Driven Development

Saturday, June 23, 2012

Page 2: SfCon: Test Driven Development

@AUGUSTOHP

@ALGANET

Saturday, June 23, 2012

Page 3: SfCon: Test Driven Development

AGENDA

• Evolução dos testes

• Motivações

• TDD (interativo)

Saturday, June 23, 2012

Page 4: SfCon: Test Driven Development

EVOLUÇÃO DOS TESTES

Saturday, June 23, 2012

Page 5: SfCon: Test Driven Development

var_dump($coisa);

Saturday, June 23, 2012

Page 6: SfCon: Test Driven Development

//var_dump($coisa);

Saturday, June 23, 2012

Page 7: SfCon: Test Driven Development

Breakpoints e Watchers!

Saturday, June 23, 2012

Page 8: SfCon: Test Driven Development

Breakpoints e Watchers!

Saturday, June 23, 2012

Page 9: SfCon: Test Driven Development

Testes automatizados

Saturday, June 23, 2012

Page 10: SfCon: Test Driven Development

Testes automatizados

Saturday, June 23, 2012

Page 11: SfCon: Test Driven Development

Testes automatizados

Verifica

ção

Saturday, June 23, 2012

Page 12: SfCon: Test Driven Development

Test Driven Development

Saturday, June 23, 2012

Page 13: SfCon: Test Driven Development

MOTIVAÇÃO

Saturday, June 23, 2012

Page 14: SfCon: Test Driven Development

CÓDIGO LIMPO QUE FUNCIONA

Saturday, June 23, 2012

Page 15: SfCon: Test Driven Development

CÓDIGO LIMPO QUE FUNCIONA

Esse é o código

Saturday, June 23, 2012

Page 16: SfCon: Test Driven Development

CÓDIGO LIMPO QUE FUNCIONA

Esse “somos nozes”

Saturday, June 23, 2012

Page 17: SfCon: Test Driven Development

CÓDIGO LIMPO QUE FUNCIONA

Objetivo do TDD

Saturday, June 23, 2012

Page 18: SfCon: Test Driven Development

2 REGRAS

Saturday, June 23, 2012

Page 19: SfCon: Test Driven Development

CÓDIGO NOVO = TESTE

Saturday, June 23, 2012

Page 20: SfCon: Test Driven Development

REFATORE

Saturday, June 23, 2012

Page 21: SfCon: Test Driven Development

O MANTRA DO TDD

Saturday, June 23, 2012

Page 22: SfCon: Test Driven Development

Saturday, June 23, 2012

Page 23: SfCon: Test Driven Development

• Vermelho : Escreva um teste (ele vai falhar)

Saturday, June 23, 2012

Page 24: SfCon: Test Driven Development

• Vermelho : Escreva um teste (ele vai falhar)

• Verde : Faça o teste funcionar

Saturday, June 23, 2012

Page 25: SfCon: Test Driven Development

• Vermelho : Escreva um teste (ele vai falhar)

• Verde : Faça o teste funcionar

• Refatore

Saturday, June 23, 2012

Page 26: SfCon: Test Driven Development

SESSÃO INTERATIVA DE TDD

Saturday, June 23, 2012

Page 27: SfCon: Test Driven Development

Saturday, June 23, 2012

Page 28: SfCon: Test Driven Development

O que faremos?

Saturday, June 23, 2012

Page 29: SfCon: Test Driven Development

• Lista de tarefas

Saturday, June 23, 2012

Page 30: SfCon: Test Driven Development

• Lista de tarefas

• Título

Saturday, June 23, 2012

Page 31: SfCon: Test Driven Development

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

Page 32: SfCon: Test Driven Development

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

Page 33: SfCon: Test Driven Development

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

Page 34: SfCon: Test Driven Development

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

Page 35: SfCon: Test Driven Development

• Lista de tarefas

• Título

• ID

Saturday, June 23, 2012

Page 36: SfCon: Test Driven Development

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

Page 37: SfCon: Test Driven Development

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

Page 38: SfCon: Test Driven Development

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

Page 39: SfCon: Test Driven Development

• Lista de tarefas

• Título

• ID

• Completa?

Saturday, June 23, 2012

Page 40: SfCon: Test Driven Development

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

Page 41: SfCon: Test Driven Development

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

Page 42: SfCon: Test Driven Development

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

Page 43: SfCon: Test Driven Development

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

Page 44: SfCon: Test Driven Development

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

Saturday, June 23, 2012

Page 45: SfCon: Test Driven Development

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

Page 46: SfCon: Test Driven Development

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

Page 47: SfCon: Test Driven Development

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

Page 48: SfCon: Test Driven Development

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

Page 49: SfCon: Test Driven Development

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

Page 50: SfCon: Test Driven Development

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

Page 51: SfCon: Test Driven Development

Saturday, June 23, 2012

Page 52: SfCon: Test Driven Development

Saturday, June 23, 2012

Page 53: SfCon: Test Driven Development

Saturday, June 23, 2012

Page 54: SfCon: Test Driven Development

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

• Cobrir variações

Saturday, June 23, 2012

Page 55: SfCon: Test Driven Development

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

Page 56: SfCon: Test Driven Development

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

Page 57: SfCon: Test Driven Development

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

Page 58: SfCon: Test Driven Development

Saturday, June 23, 2012

Page 59: SfCon: Test Driven Development

CUIDADO COM O 100% DE COVERAGE

Saturday, June 23, 2012

Page 60: SfCon: Test Driven Development

Linhas não testadas

Saturday, June 23, 2012

Page 61: SfCon: Test Driven Development

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

Page 62: SfCon: Test Driven Development

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

• Cobrir variações

• Mocks / Stubs

Saturday, June 23, 2012

Page 63: SfCon: Test Driven Development

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

Page 64: SfCon: Test Driven Development

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

Page 65: SfCon: Test Driven Development

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

Page 66: SfCon: Test Driven Development

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

Page 67: SfCon: Test Driven Development

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

Page 68: SfCon: Test Driven Development

• Lista de tarefas

• Título

• ID

• Completa?

• Salvar tarefa

• Cobrir variações

• Mocks / Stubs

• Bugs regressivos

perguntas?

Saturday, June 23, 2012


Recommended