TDD - Test Driven Development (em PHP)

Preview:

DESCRIPTION

Breve introdução a TDD, expondo uma aplicação simples - visível somente via controle de versão - escrita em PHP, exercitando os ciclos propostos pela metologia. Gravação da apresentação: http://youtu.be/M5f32O-Afq0 Repositório do projeto: http://github.com/augustohp/gravata

Citation preview

Test Driven DevelopmentAugusto Pascutti / Nelson Senna

Agenda

Agenda• 1ª Palestra

Agenda• 1ª Palestra

• Os pilotos

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

• Walking Skeleton

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

• Walking Skeleton

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

• Walking Skeleton

• 2ª Palestra

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

• Walking Skeleton

• 2ª Palestra

• Buscar avatar

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

• Walking Skeleton

• 2ª Palestra

• Buscar avatar

• Download avatar

Agenda• 1ª Palestra

• Os pilotos

• O que não é TDD

• O que é TDD?

• Walking Skeleton

• 2ª Palestra

• Buscar avatar

• Download avatar

• Aplicar gravata

Os pilotos

Nelson Senna

Twitter: @nelson_senna Github: nelsonsar Slides: http://bit.ly/nelsonsar Blog: http://nelsonsar.github.io

Augusto Pascutti

Twitter: @augustohp Github: augustohp Slides: http://bit.ly/augustohp Blog: http://augustohp.com

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 não é TDD?

Teste depois de desenvolver

Teste depois do deploy

Apenas fazer testes

–Steve McConnell

“Só testar não aumenta a qualidade do software. Tentar aumentar a qualidade do

software apenas aumentando o número de testes é a mesma coisa que tentar perder peso

se pesando com mais frequência.”

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

Ciclo bacana

RED

GREEN

REFACTOR

Ciclo bacana

RED

GREEN

REFACTOR

Tempo

Ciclo bunda

RED

GREEN

REFACTOR

Ciclo bunda

RED

GREEN

REFACTOR

Ciclo bunda

RED

GREEN

REFACTOR

Ciclo bunda

RED

GREEN

REFACTOR

Ciclo BEM bunda

RED

GREEN

Ciclo BEM bunda

RED

GREEN

Cadê o 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?

Transformar “isso”

Em puro garbo e elegância

http://gravata.sexy

Iterações de desenvolvimento

Iterações

1. Walking Sekeleton

2. Buscar avatar em http://gravatar.com.

3. Fazer download do gravatar.

4. Aplicar gravata.

http://github.com/augustohp/gravata