SlideShare uma empresa Scribd logo
1 de 43
TDD NA PRÁTICA
Desenvolvimento Orientado a Testes

Rafael Fuchs
agenda
•
•
•
•
•
•
•
•
•
•
•

introdução a TDD
design emergente
tipos de testes
mais sobre TDD
exemplos
dificuldades
acoplamento/coesão
mocks/stubs
ferramentas
revisão
referências
introdução a TDD
•
•
•
•
•
•
•
•

Test Driven Development
Desenvolvimento Orientado a Testes
1999 – Kent Beck + XP
princípio de test first
2003 – TDD: by Example
técnica de desenvolvimento
não é sobre escrever testes
mas por que TDD???
red > green > refactor
adicione
UM teste
que FALHE

TDD
refatore!

adicione
código
para teste
PASSAR
tipos de teste - escopo
unit testing
integration testing
system testing
system integration testing
tipos de teste - objetivo
smoke
regressão
aceitação
alpha
beta
tipos de teste – não funcional
performance
carga
usabilidade
segurança
...
automatizado vs. unitário
unitário
• direcionado: testa uma condição específica em um
métodos específico
• isolado: o código sendo testado não pode ter
dependência externa
• repetível e previsível: deve ser capaz de ser roda várias
vezes e produzir sempre o mesmo resultado
• independente: não podemos garantir a ordem dos
testes – seus testes devem funcionar e ter o mesmo
comportamento se rodados em qualquer ordem

automatizado
• …
TDD
• Escreva um teste que falhe antes de escrever
qualquer outro codigo (red)
• Escreve o mínimo de código possível para
fazer esse teste passar
• Refatore...
• Repita o processo
adicione
UM
teste
que
FALHE

TDD
refatore!

adicione
código
para
teste
PASSAR
TDD
• objetivo simples:
– programar algo que satisfaça uma condição

• baby steps
• primeiro teste: chama algo que não existe
• rascunho do seu código
TDD
•
•
•
•
•

design/arquitetura emergente
mais coesão, menos acoplamento
isolamento de erros
modularização
não é solução para todos os problemas do
mundo
red > green > refactor
adicione
UM teste
que FALHE

TDD
refatore!

adicione
código
para teste
PASSAR
as 3 leis do TDD
1. Você não pode escrever código de produção a menos
que ele tenha um teste que falhe.
2. Você não pode escrever mais teste que o suficiente
para falhar – erros de compilação são falhas.
3. Você não pode escrever mais código que o suficiente
para o código de produção passar em um teste.

(Martin Fowler, 2011)
TDD - vantagens
•
•
•
•
•
•
•
•
•

melhor entendimento dos requisitos
garantir testes
maior qualidade de código
maior simplicidade
menos código
melhor uso OOP
menos defeitos
gera exemplos de uso
menos debug
Página 1/329
TDD - vantagens
•
•
•
•
•
•
•
•

maior confiança
manutenção mais fácil
menor custo de mudança
eliminar dead code/código parasita
evitar erros de regressão
maior cobertura
acaba quando termina
feedback constante
Página 2/329
TDD - vantagens

Página 3/329
TDD - vantagens

Página 4/329
TDD - estudos
•
•
•
•
•
•
•
•
•
•

Redução de 40-50% na quantidade de defeitos
87% - facilitou o entendimentos dos requisitos
96% - reduziu o tempo gasto com debug
78% - aumentou a produtividade
50% - ajuda a diminuir o tempo de desenvolvimento
92% - ajuda a manter um código de maior qualidade
79% - promove um design mais simples
104% - menos acoplamento
43% - métodos menos complexos
cobertura entre 92% - 98%
Página 5/329
TDD - desvantagens
•
•
•
•
•
•
•
•

testes viciados
falsa sensação de segurança
suporte gerencial / alta administração
mau uso
muita integração externa
curva de aprendizagem
atrapalha linha de pensamento
banco de dados
TDD - dificuldades
onde começar?
o que testar?
quando parar?
CUIDADO!!!
getters/setters
delegação

acesso a sistemas externos
(banco, file system, ws, etc)
pode-se garatir qualidade de outra formas
exemplo 01 - soma
Classe com método simples para somar 2 inteiros.
Adicionar um teste
public class TesteSoma extends TestCase {
@Test
public void testSomaUmMaisUm() {
assertEquals(2, Calc.soma(1,1));
}
}

FALHA! Não compila!
Escrever código para teste passar
public class Calc {
static public int soma(int a, int b) {
return 2;
}
}
public class TesteSoma extends TestCase {
@Test
public void testSomaUmMaisUm() {
assertEquals(2, Calc.soma(1,1));
}
}

Compila e o teste passa!
Adicionar um teste – código já é simples e claro
public class Calc {
static public int soma(int a, int b) {
return 2;
}
}
public class TesteSoma extends TestCase {
[...]
@Test
public void testSomaDoisMaisTres() {
assertEquals(5, Calc.soma(2,3);
}
}

FALHA!
Escrever código para teste passar
public class Calc {
static public int soma(int a, int b) {
if (a==2 && b==3) return 5;
return 2;
}
}
public class TesteSoma extends TestCase {
@Test
public void testSomaUmMaisUm() {
assertEquals(2, Calc.soma(1,1));
}
@Test
public void testSomaDoisMaisTres() {
assertEquals(5, Calc.soma(2,3);
}
}

Teste passa!
Agora sim: Refatorar!
public class Calc {
static public int soma(int a, int b) {
return a + b;
}
}
public class TesteSoma extends TestCase {
@Test
public void testSomaUmMaisUm() {
assertEquals(2, Calc.soma(1,1));
}
@Test
public void testSomaDoisMaisTres() {
assertEquals(5, Calc.soma(2,3);
}
}

Teste continua passando… tudo certo!
exemplo 02 – Crivo de Eratóstenes
Crivo de Eratóstenes: algoritmo para gerar números primos

0-1-2-3-4-5-6-7-8-9-10
Em seguida o algoritmo elimina os números 0 e 1 por não serem primos:
2-3-4-5-6-7-8-9-10
Começando pelo número 2, elimina-se cada um dos seus múltiplos, com exceção dele próprio
(que é primo).
2-3-5-7-9
Avançando para o próximo número ainda não eliminado, que é 3, o algoritmo elimina cada um de
seus múltiplos com exceção dele próprio.
2-3-5-7
O processo é repetido até se alcançar o número máximo informado. No caso do exemplo
acima, os passos executados já foram suficientes para identificar todos os primos até 10.
Fonte:
http://desenvolvimentoagil.com.br/xp/praticas/tdd/
Iniciamos pelo teste...

E rodamos o teste sem código.
Obviamente vai falhar...
Nosso teste:

Escrevemos um código mínimo
Para fazer o teste passar.
Código mínimo mesmo.
Adicionamos um teste... Que falha.

E escrevemos código para o teste passar...
Então refatoramos nosso código... Testes e código de produção
Mais um pouco de refatoração,
sempre rodando os testes para garantir o bom funcionamento.
Após algumas rodadas de refatoração... O algoritmo completo.
Mais alguns testes – e agora todos devem passar...
design/arquitetura emergente
(evolutivo, orgânico)
pequenos pedaços de software
evitar trabalho antecipado
último momento responsável
modelo tradicional:
preguiça de mudar mais tarde
mocks e stubs
•
•
•
•

simular estado/comportamento
sistemas/bibliotecas externos
banco de dados
stubs: nos preocupamos em testar o estado dos
objetos após a execução do método. Neste caso
incluimos os asserts para ver se o método nos levou ao
estado que esperamos.
• mocks: testar a interação entre objetos e o
comportamento do objeto durante a execução do
método. Neste caso, os asserts servem para ver se os
métodos se relacionaram como o esperado.
exemplo de jMockit
setup e testando exceção
exemplo de jMockit
teste simples
coesão e acoplamento
coesão
• responsabilidade unica
uma classe deve ter uma unica responsabilidade
• maior modularização e reuso
• muitos testes para um metodo/classe

acomplamento
• dependência de outras classes
• inversão de controle e injeção de dependência
• muitos mocks/stubs
ferramentas
• testes unitários
– jUnit (http://junit.org/)
– xUnit (http://xunit.codeplex.com/)

• mocks
–
–
–
–
–

Mockito (https://code.google.com/p/mockito/)
jMockit (https://code.google.com/p/jmockit/)
jMock (http://jmock.org/)
EasyMock (http://easymock.org/)
moq (https://code.google.com/p/moq/)

• cobertura
– Cobertura (http://cobertura.github.io/cobertura/)
– EMMA (http://emma.sourceforge.net/)
retomando...
•
•
•
•
•
•
•
•
•

red > green > refactor
tipos de testes
testes automatizados vs. unitários
baby steps
design emergente
mocks/stubs
coesão/acomplamento
ferramentas
refatore!
cobertura

adicione
UM
teste que
FALHE

TDD

adicione
código
para teste
PASSAR
livros
• Refactoring: Improving the Design of Existing Code
(Martin Fowler)
http://www.amazon.com/exec/obidos/ASIN/0201485672

• Test Driven Development: By Example (Kent Beck)
http://www.amazon.com/exec/obidos/asin/0321146530/

• Extreme Programming Explained: Embrace Change (Kent
Beck)
http://www.amazon.com/Extreme-Programming-Explained-Embrace-Edition/dp/0321278658/ref=pd_sim_b_3
obrigado!
perguntas?

Rafael Fuchs
rafael.fuchs@adp.com
@rafaelfuchs

Mais conteúdo relacionado

Mais procurados

Unit testing with NUnit
Unit testing with NUnitUnit testing with NUnit
Unit testing with NUnitkleinron
 
Test driven development
Test driven developmentTest driven development
Test driven developmentNascenia IT
 
Ferramentas para testes de software
Ferramentas para testes de softwareFerramentas para testes de software
Ferramentas para testes de softwareNorton Guimarães
 
Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade Camilo Ribeiro
 
Modelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane Fidelix
Modelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane FidelixModelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane Fidelix
Modelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane FidelixCris Fidelix
 
Modelo Incremental - Engenharia de Software
Modelo Incremental - Engenharia de SoftwareModelo Incremental - Engenharia de Software
Modelo Incremental - Engenharia de SoftwareDaniela Franciosi
 
Qualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normasQualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normasAlex Camargo
 
Agile Testing and Test Automation
Agile Testing and Test AutomationAgile Testing and Test Automation
Agile Testing and Test AutomationNaveen Kumar Singh
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOpsAhmed Adel
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Thiago Faria de Andrade
 
Modelos de Processo de Software Parte 2
Modelos de Processo de Software Parte 2Modelos de Processo de Software Parte 2
Modelos de Processo de Software Parte 2Elaine Cecília Gatto
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de SoftwareCapgemini
 
Agile Testing in the Cloud
Agile Testing in the CloudAgile Testing in the Cloud
Agile Testing in the CloudCygnet Infotech
 
Chapter 5 Software Quality Assurance-Finalised_BW.ppt
Chapter 5 Software Quality Assurance-Finalised_BW.pptChapter 5 Software Quality Assurance-Finalised_BW.ppt
Chapter 5 Software Quality Assurance-Finalised_BW.pptBule Hora University
 

Mais procurados (20)

Unit testing with NUnit
Unit testing with NUnitUnit testing with NUnit
Unit testing with NUnit
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Software/Yazılım Test
Software/Yazılım TestSoftware/Yazılım Test
Software/Yazılım Test
 
Ferramentas para testes de software
Ferramentas para testes de softwareFerramentas para testes de software
Ferramentas para testes de software
 
Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade
 
Modelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane Fidelix
Modelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane FidelixModelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane Fidelix
Modelos de Processo e Desenvolvimento de Software 1 - Prof.ª Cristiane Fidelix
 
50 Soruda Yazılım Testi
50 Soruda Yazılım Testi50 Soruda Yazılım Testi
50 Soruda Yazılım Testi
 
Modelo Incremental - Engenharia de Software
Modelo Incremental - Engenharia de SoftwareModelo Incremental - Engenharia de Software
Modelo Incremental - Engenharia de Software
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
AAA Automated Testing
AAA Automated TestingAAA Automated Testing
AAA Automated Testing
 
Qualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normasQualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normas
 
Agile Testing and Test Automation
Agile Testing and Test AutomationAgile Testing and Test Automation
Agile Testing and Test Automation
 
Unit Testing (C#)
Unit Testing (C#)Unit Testing (C#)
Unit Testing (C#)
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Modelos de Processo de Software Parte 2
Modelos de Processo de Software Parte 2Modelos de Processo de Software Parte 2
Modelos de Processo de Software Parte 2
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de Software
 
Agile Testing in the Cloud
Agile Testing in the CloudAgile Testing in the Cloud
Agile Testing in the Cloud
 
Chapter 5 Software Quality Assurance-Finalised_BW.ppt
Chapter 5 Software Quality Assurance-Finalised_BW.pptChapter 5 Software Quality Assurance-Finalised_BW.ppt
Chapter 5 Software Quality Assurance-Finalised_BW.ppt
 

Semelhante a TDD na Prática

Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesCamilo Ribeiro
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 
Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por TestesDesenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testeselliando dias
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"Cesar Romero
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código LegadoCesar Romero
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Renato Groff
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes AutomatizadosSamanta Cicilia
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 

Semelhante a TDD na Prática (20)

TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por Testes
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 
Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por TestesDesenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testes
 
TDD
TDDTDD
TDD
 
Desenvolvimento Guiado Por Testes
Desenvolvimento Guiado Por TestesDesenvolvimento Guiado Por Testes
Desenvolvimento Guiado Por Testes
 
JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código Legado
 
1° Madrugada de Testes
1° Madrugada de Testes1° Madrugada de Testes
1° Madrugada de Testes
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
Teste automatizados e tdd
Teste automatizados e tddTeste automatizados e tdd
Teste automatizados e tdd
 

TDD na Prática

  • 1. TDD NA PRÁTICA Desenvolvimento Orientado a Testes Rafael Fuchs
  • 2. agenda • • • • • • • • • • • introdução a TDD design emergente tipos de testes mais sobre TDD exemplos dificuldades acoplamento/coesão mocks/stubs ferramentas revisão referências
  • 3. introdução a TDD • • • • • • • • Test Driven Development Desenvolvimento Orientado a Testes 1999 – Kent Beck + XP princípio de test first 2003 – TDD: by Example técnica de desenvolvimento não é sobre escrever testes mas por que TDD???
  • 4. red > green > refactor adicione UM teste que FALHE TDD refatore! adicione código para teste PASSAR
  • 5. tipos de teste - escopo unit testing integration testing system testing system integration testing
  • 6. tipos de teste - objetivo smoke regressão aceitação alpha beta
  • 7. tipos de teste – não funcional performance carga usabilidade segurança ...
  • 8. automatizado vs. unitário unitário • direcionado: testa uma condição específica em um métodos específico • isolado: o código sendo testado não pode ter dependência externa • repetível e previsível: deve ser capaz de ser roda várias vezes e produzir sempre o mesmo resultado • independente: não podemos garantir a ordem dos testes – seus testes devem funcionar e ter o mesmo comportamento se rodados em qualquer ordem automatizado • …
  • 9. TDD • Escreva um teste que falhe antes de escrever qualquer outro codigo (red) • Escreve o mínimo de código possível para fazer esse teste passar • Refatore... • Repita o processo adicione UM teste que FALHE TDD refatore! adicione código para teste PASSAR
  • 10. TDD • objetivo simples: – programar algo que satisfaça uma condição • baby steps • primeiro teste: chama algo que não existe • rascunho do seu código
  • 11. TDD • • • • • design/arquitetura emergente mais coesão, menos acoplamento isolamento de erros modularização não é solução para todos os problemas do mundo
  • 12. red > green > refactor adicione UM teste que FALHE TDD refatore! adicione código para teste PASSAR
  • 13. as 3 leis do TDD 1. Você não pode escrever código de produção a menos que ele tenha um teste que falhe. 2. Você não pode escrever mais teste que o suficiente para falhar – erros de compilação são falhas. 3. Você não pode escrever mais código que o suficiente para o código de produção passar em um teste. (Martin Fowler, 2011)
  • 14. TDD - vantagens • • • • • • • • • melhor entendimento dos requisitos garantir testes maior qualidade de código maior simplicidade menos código melhor uso OOP menos defeitos gera exemplos de uso menos debug Página 1/329
  • 15. TDD - vantagens • • • • • • • • maior confiança manutenção mais fácil menor custo de mudança eliminar dead code/código parasita evitar erros de regressão maior cobertura acaba quando termina feedback constante Página 2/329
  • 18. TDD - estudos • • • • • • • • • • Redução de 40-50% na quantidade de defeitos 87% - facilitou o entendimentos dos requisitos 96% - reduziu o tempo gasto com debug 78% - aumentou a produtividade 50% - ajuda a diminuir o tempo de desenvolvimento 92% - ajuda a manter um código de maior qualidade 79% - promove um design mais simples 104% - menos acoplamento 43% - métodos menos complexos cobertura entre 92% - 98% Página 5/329
  • 19. TDD - desvantagens • • • • • • • • testes viciados falsa sensação de segurança suporte gerencial / alta administração mau uso muita integração externa curva de aprendizagem atrapalha linha de pensamento banco de dados
  • 20. TDD - dificuldades onde começar? o que testar? quando parar?
  • 21. CUIDADO!!! getters/setters delegação acesso a sistemas externos (banco, file system, ws, etc) pode-se garatir qualidade de outra formas
  • 22. exemplo 01 - soma Classe com método simples para somar 2 inteiros. Adicionar um teste public class TesteSoma extends TestCase { @Test public void testSomaUmMaisUm() { assertEquals(2, Calc.soma(1,1)); } } FALHA! Não compila!
  • 23. Escrever código para teste passar public class Calc { static public int soma(int a, int b) { return 2; } } public class TesteSoma extends TestCase { @Test public void testSomaUmMaisUm() { assertEquals(2, Calc.soma(1,1)); } } Compila e o teste passa!
  • 24. Adicionar um teste – código já é simples e claro public class Calc { static public int soma(int a, int b) { return 2; } } public class TesteSoma extends TestCase { [...] @Test public void testSomaDoisMaisTres() { assertEquals(5, Calc.soma(2,3); } } FALHA!
  • 25. Escrever código para teste passar public class Calc { static public int soma(int a, int b) { if (a==2 && b==3) return 5; return 2; } } public class TesteSoma extends TestCase { @Test public void testSomaUmMaisUm() { assertEquals(2, Calc.soma(1,1)); } @Test public void testSomaDoisMaisTres() { assertEquals(5, Calc.soma(2,3); } } Teste passa!
  • 26. Agora sim: Refatorar! public class Calc { static public int soma(int a, int b) { return a + b; } } public class TesteSoma extends TestCase { @Test public void testSomaUmMaisUm() { assertEquals(2, Calc.soma(1,1)); } @Test public void testSomaDoisMaisTres() { assertEquals(5, Calc.soma(2,3); } } Teste continua passando… tudo certo!
  • 27. exemplo 02 – Crivo de Eratóstenes Crivo de Eratóstenes: algoritmo para gerar números primos 0-1-2-3-4-5-6-7-8-9-10 Em seguida o algoritmo elimina os números 0 e 1 por não serem primos: 2-3-4-5-6-7-8-9-10 Começando pelo número 2, elimina-se cada um dos seus múltiplos, com exceção dele próprio (que é primo). 2-3-5-7-9 Avançando para o próximo número ainda não eliminado, que é 3, o algoritmo elimina cada um de seus múltiplos com exceção dele próprio. 2-3-5-7 O processo é repetido até se alcançar o número máximo informado. No caso do exemplo acima, os passos executados já foram suficientes para identificar todos os primos até 10. Fonte: http://desenvolvimentoagil.com.br/xp/praticas/tdd/
  • 28. Iniciamos pelo teste... E rodamos o teste sem código. Obviamente vai falhar...
  • 29. Nosso teste: Escrevemos um código mínimo Para fazer o teste passar. Código mínimo mesmo.
  • 30. Adicionamos um teste... Que falha. E escrevemos código para o teste passar...
  • 31. Então refatoramos nosso código... Testes e código de produção
  • 32. Mais um pouco de refatoração, sempre rodando os testes para garantir o bom funcionamento.
  • 33. Após algumas rodadas de refatoração... O algoritmo completo.
  • 34. Mais alguns testes – e agora todos devem passar...
  • 35. design/arquitetura emergente (evolutivo, orgânico) pequenos pedaços de software evitar trabalho antecipado último momento responsável modelo tradicional: preguiça de mudar mais tarde
  • 36. mocks e stubs • • • • simular estado/comportamento sistemas/bibliotecas externos banco de dados stubs: nos preocupamos em testar o estado dos objetos após a execução do método. Neste caso incluimos os asserts para ver se o método nos levou ao estado que esperamos. • mocks: testar a interação entre objetos e o comportamento do objeto durante a execução do método. Neste caso, os asserts servem para ver se os métodos se relacionaram como o esperado.
  • 37. exemplo de jMockit setup e testando exceção
  • 39. coesão e acoplamento coesão • responsabilidade unica uma classe deve ter uma unica responsabilidade • maior modularização e reuso • muitos testes para um metodo/classe acomplamento • dependência de outras classes • inversão de controle e injeção de dependência • muitos mocks/stubs
  • 40. ferramentas • testes unitários – jUnit (http://junit.org/) – xUnit (http://xunit.codeplex.com/) • mocks – – – – – Mockito (https://code.google.com/p/mockito/) jMockit (https://code.google.com/p/jmockit/) jMock (http://jmock.org/) EasyMock (http://easymock.org/) moq (https://code.google.com/p/moq/) • cobertura – Cobertura (http://cobertura.github.io/cobertura/) – EMMA (http://emma.sourceforge.net/)
  • 41. retomando... • • • • • • • • • red > green > refactor tipos de testes testes automatizados vs. unitários baby steps design emergente mocks/stubs coesão/acomplamento ferramentas refatore! cobertura adicione UM teste que FALHE TDD adicione código para teste PASSAR
  • 42. livros • Refactoring: Improving the Design of Existing Code (Martin Fowler) http://www.amazon.com/exec/obidos/ASIN/0201485672 • Test Driven Development: By Example (Kent Beck) http://www.amazon.com/exec/obidos/asin/0321146530/ • Extreme Programming Explained: Embrace Change (Kent Beck) http://www.amazon.com/Extreme-Programming-Explained-Embrace-Edition/dp/0321278658/ref=pd_sim_b_3