SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
Advanced Live Testing
Augusto Pascutti / Nelson Senna
Advanced Live Testing
Augusto Pascutti / Nelson Senna
Nossa experiência com TDD
Augusto Pascutti / Nelson Senna
Os pilotos
Augusto Pascutti
Twitter: @augustohp
Github: augustohp
Slides: http://bit.ly/augustohp
Blog: http://augustopascutti.com
Nelson Senna
Twitter: @nelson_senna
Github: nelsonsar
Slides: http://bit.ly/nelsonsar
Blog: http://nelsonsar.github.io
O que é um teste?
1 <?php
2
3 namespace App;
4
5 class Download
6 {
7 public function fromUrl($fromUrl, $toFile)
8 {
9 $contents = file_get_contents($fromUrl);
10 // var_dump($contents);
11 $bytes = file_put_contents(
12 $toFile,
13 $contents
14 );
15 // var_dump($bytes);
16 return $bytes;
17 }
18 }
1 <?php
2
3 namespace App;
4
5 class Download
6 {
7 public function fromUrl($fromUrl, $toFile)
8 {
9 $contents = file_get_contents($fromUrl);
10 // var_dump($contents);
11 $bytes = file_put_contents(
12 $toFile,
13 $contents
14 );
15 // var_dump($bytes);
16 return $bytes;
17 }
18 }
1 <?php
2
3 namespace App;
4
5 class Download
6 {
7 public function fromUrl($fromUrl, $toFile)
8 {
9 $contents = file_get_contents($fromUrl);
10 // var_dump($contents);
11 $bytes = file_put_contents(
12 $toFile,
13 $contents
14 );
15 // var_dump($bytes);
16 return $bytes;
17 }
18 }
1 <?php
2
3 namespace App;
4
5 class DownloadTest extends PHPUnit_Framework_TestCase
6 {
7 const DESTINATION_FILE = '/tmp/test-file';
8
9 public function tearDown()
10 {
11 unlink(self::DESTINATION_FILE);
12 }
13
14 public function testDownloadCreatesTheFile()
15 {
16 $file = self::DESTINATION_FILE;
17 $this->assertFileNotExists($file);
18
19 $downloader = new Download;
20 $url = 'http://example.org';
21 $bytesWritten = $downloader->fromUrl($url, $file);
22
23 $this->assertGreaterThan(0, $bytesWritten);
24 $this->assertFileExists($file);
25 }
26 }
1 <?php
2
3 namespace App;
4
5 class DownloadTest extends PHPUnit_Framework_TestCase
6 {
7 const DESTINATION_FILE = '/tmp/test-file';
8
9 public function tearDown()
10 {
11 unlink(self::DESTINATION_FILE);
12 }
13
14 public function testDownloadCreatesTheFile()
15 {
16 $file = self::DESTINATION_FILE;
17 $this->assertFileNotExists($file);
18
19 $downloader = new Download;
20 $url = 'http://example.org';
21 $bytesWritten = $downloader->fromUrl($url, $file);
22
23 $this->assertGreaterThan(0, $bytesWritten);
24 $this->assertFileExists($file);
25 }
26 }
Diferentes níveis de teste
1. Unitário (white-box)
2. Integração (white-box, black-box)
3. Acceptance (black-box)
O que é TDD?
–Ron Jeffries
“Código limpo que funciona.”
–Wikipedia: Test-driven development
“… metodologia que se baseia na repetição de
ciclos muito curtos de desenvolvimento.”
https://en.wikipedia.org/wiki/Test-driven_development
Um ciclo
Um ciclo
1. Criar um teste (RED)
Um ciclo
1. Criar um teste (RED)
2. Fazer uma mudança pequena (GREEN)
Um ciclo
1. Criar um teste (RED)
2. Fazer uma mudança pequena (GREEN)
3. Refactor
–Kent Beck / Nat Pryce
“O TDD não garante boa arquitetura. Ele dá um
retorno imediato do que, provavelmente, é uma
má arquitetura.”
Por que usar TDD?
Por que usar TDD?
• Evitar que defeito vire falha
• Evitar o “stress loop”
• Aumenta coesão, diminui acoplamento
• É uma forma de documentação
Mão na massa?
O que iremos fazer?
Iterações
1. Falha ao salvar um e-mail na newsletter.
2. Validação de email ao salvar.
3. Salvar um e-mail.
http://github.com/PHPSP/Jarbas

Mais conteúdo relacionado

Mais procurados

Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Henrique Moody
 
Escreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoEscreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoWilson Júnior
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisFabrízio Mello
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 
Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Wilson Júnior
 
Lidando com desafios dos microserviços com a stack Spring Cloud Netflix
Lidando com desafios dos microserviços com a stack Spring Cloud NetflixLidando com desafios dos microserviços com a stack Spring Cloud Netflix
Lidando com desafios dos microserviços com a stack Spring Cloud NetflixEmmanuel Neri
 
Spock Framework
Spock FrameworkSpock Framework
Spock FrameworkIsmael
 
Criando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectCriando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectIvan Rosolen
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação WebDalton Martins
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsDiego Castro
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2Ismael
 
Inversion of control
Inversion of controlInversion of control
Inversion of controlBruno Lui
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!	TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática! tdc-globalcode
 

Mais procurados (20)

Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)
 
Escreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoEscreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornado
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)
 
Lidando com desafios dos microserviços com a stack Spring Cloud Netflix
Lidando com desafios dos microserviços com a stack Spring Cloud NetflixLidando com desafios dos microserviços com a stack Spring Cloud Netflix
Lidando com desafios dos microserviços com a stack Spring Cloud Netflix
 
Spock Framework
Spock FrameworkSpock Framework
Spock Framework
 
Criando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectCriando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework Respect
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
JasperReports
JasperReportsJasperReports
JasperReports
 
PowerShell
PowerShellPowerShell
PowerShell
 
Spring Capitulo 03
Spring Capitulo 03Spring Capitulo 03
Spring Capitulo 03
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2
 
Inversion of control
Inversion of controlInversion of control
Inversion of control
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!	TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
 

Semelhante a Nossa experiência com TDD

Advanced live testing em tempo real
Advanced live testing em tempo realAdvanced live testing em tempo real
Advanced live testing em tempo realiMasters
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - FlisolLeonn Leite
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Gerenciamento de dependências em python
Gerenciamento de dependências em pythonGerenciamento de dependências em python
Gerenciamento de dependências em pythonPatrick Porto
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Tutorial poke-tool
Tutorial poke-toolTutorial poke-tool
Tutorial poke-toolunifesptk
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 

Semelhante a Nossa experiência com TDD (20)

Advanced live testing em tempo real
Advanced live testing em tempo realAdvanced live testing em tempo real
Advanced live testing em tempo real
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Gerenciamento de dependências em python
Gerenciamento de dependências em pythonGerenciamento de dependências em python
Gerenciamento de dependências em python
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Tutorial poke-tool
Tutorial poke-toolTutorial poke-tool
Tutorial poke-tool
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 

Mais de Nelson Senna do Amaral

Mais de Nelson Senna do Amaral (9)

Veni vedi vici.
Veni vedi vici.Veni vedi vici.
Veni vedi vici.
 
Pague o aluguel
Pague o aluguelPague o aluguel
Pague o aluguel
 
Dando nome aos códigos
Dando nome aos códigosDando nome aos códigos
Dando nome aos códigos
 
Melhorando seu código com Law of Demeter e Tell don't ask
Melhorando seu código com Law of Demeter e Tell don't askMelhorando seu código com Law of Demeter e Tell don't ask
Melhorando seu código com Law of Demeter e Tell don't ask
 
OOP: Princípios e Padroes
OOP: Princípios e PadroesOOP: Princípios e Padroes
OOP: Princípios e Padroes
 
Ruby Gotchas
Ruby GotchasRuby Gotchas
Ruby Gotchas
 
Domínio: Dividir e conquistar
Domínio: Dividir e conquistarDomínio: Dividir e conquistar
Domínio: Dividir e conquistar
 
Interfaces - Como os objetos deveriam se comportar
Interfaces - Como os objetos deveriam se comportarInterfaces - Como os objetos deveriam se comportar
Interfaces - Como os objetos deveriam se comportar
 
Tirando o coelho da cartola: integrando sistemas com RabbitMQ
Tirando o coelho da cartola: integrando sistemas com RabbitMQTirando o coelho da cartola: integrando sistemas com RabbitMQ
Tirando o coelho da cartola: integrando sistemas com RabbitMQ
 

Nossa experiência com TDD

  • 1. Advanced Live Testing Augusto Pascutti / Nelson Senna
  • 2. Advanced Live Testing Augusto Pascutti / Nelson Senna
  • 3. Nossa experiência com TDD Augusto Pascutti / Nelson Senna
  • 5. Augusto Pascutti Twitter: @augustohp Github: augustohp Slides: http://bit.ly/augustohp Blog: http://augustopascutti.com
  • 6. Nelson Senna Twitter: @nelson_senna Github: nelsonsar Slides: http://bit.ly/nelsonsar Blog: http://nelsonsar.github.io
  • 7. O que é um teste?
  • 8. 1 <?php 2 3 namespace App; 4 5 class Download 6 { 7 public function fromUrl($fromUrl, $toFile) 8 { 9 $contents = file_get_contents($fromUrl); 10 // var_dump($contents); 11 $bytes = file_put_contents( 12 $toFile, 13 $contents 14 ); 15 // var_dump($bytes); 16 return $bytes; 17 } 18 }
  • 9. 1 <?php 2 3 namespace App; 4 5 class Download 6 { 7 public function fromUrl($fromUrl, $toFile) 8 { 9 $contents = file_get_contents($fromUrl); 10 // var_dump($contents); 11 $bytes = file_put_contents( 12 $toFile, 13 $contents 14 ); 15 // var_dump($bytes); 16 return $bytes; 17 } 18 }
  • 10. 1 <?php 2 3 namespace App; 4 5 class Download 6 { 7 public function fromUrl($fromUrl, $toFile) 8 { 9 $contents = file_get_contents($fromUrl); 10 // var_dump($contents); 11 $bytes = file_put_contents( 12 $toFile, 13 $contents 14 ); 15 // var_dump($bytes); 16 return $bytes; 17 } 18 }
  • 11. 1 <?php 2 3 namespace App; 4 5 class DownloadTest extends PHPUnit_Framework_TestCase 6 { 7 const DESTINATION_FILE = '/tmp/test-file'; 8 9 public function tearDown() 10 { 11 unlink(self::DESTINATION_FILE); 12 } 13 14 public function testDownloadCreatesTheFile() 15 { 16 $file = self::DESTINATION_FILE; 17 $this->assertFileNotExists($file); 18 19 $downloader = new Download; 20 $url = 'http://example.org'; 21 $bytesWritten = $downloader->fromUrl($url, $file); 22 23 $this->assertGreaterThan(0, $bytesWritten); 24 $this->assertFileExists($file); 25 } 26 }
  • 12. 1 <?php 2 3 namespace App; 4 5 class DownloadTest extends PHPUnit_Framework_TestCase 6 { 7 const DESTINATION_FILE = '/tmp/test-file'; 8 9 public function tearDown() 10 { 11 unlink(self::DESTINATION_FILE); 12 } 13 14 public function testDownloadCreatesTheFile() 15 { 16 $file = self::DESTINATION_FILE; 17 $this->assertFileNotExists($file); 18 19 $downloader = new Download; 20 $url = 'http://example.org'; 21 $bytesWritten = $downloader->fromUrl($url, $file); 22 23 $this->assertGreaterThan(0, $bytesWritten); 24 $this->assertFileExists($file); 25 } 26 }
  • 13. Diferentes níveis de teste 1. Unitário (white-box) 2. Integração (white-box, black-box) 3. Acceptance (black-box)
  • 14. O que é TDD?
  • 16. –Wikipedia: Test-driven development “… metodologia que se baseia na repetição de ciclos muito curtos de desenvolvimento.” https://en.wikipedia.org/wiki/Test-driven_development
  • 18. Um ciclo 1. Criar um teste (RED)
  • 19. Um ciclo 1. Criar um teste (RED) 2. Fazer uma mudança pequena (GREEN)
  • 20. Um ciclo 1. Criar um teste (RED) 2. Fazer uma mudança pequena (GREEN) 3. Refactor
  • 21. –Kent Beck / Nat Pryce “O TDD não garante boa arquitetura. Ele dá um retorno imediato do que, provavelmente, é uma má arquitetura.”
  • 22. Por que usar TDD?
  • 23. Por que usar TDD? • Evitar que defeito vire falha • Evitar o “stress loop” • Aumenta coesão, diminui acoplamento • É uma forma de documentação
  • 25. O que iremos fazer?
  • 26.
  • 27. Iterações 1. Falha ao salvar um e-mail na newsletter. 2. Validação de email ao salvar. 3. Salvar um e-mail.