SlideShare ist ein Scribd-Unternehmen logo
1 von 85
Downloaden Sie, um offline zu lesen
TDD e Refactoring
André Luís Pitombeira
Saturday, May 25, 13
Quem sou eu?
• Bacharel em Sistemas de Informação (UFC/
Quixadá)
• Bacharel em Administração de Empresas (FCRS)
• Desenvolvedor de Software do lsbd
Saturday, May 25, 13
Quem são vocês?
• Respondam estas três perguntas
• Qual o seu nome?
• O que você faz da vida?
• O que você espera deste curso?
Saturday, May 25, 13
Objetivos
• Definir os principais conceitos relacionados ao
TDD e Refactoring
• Mostrar boas práticas de programação e design de
sistemas
• Demonstrar o uso de algumas ferramentas
Saturday, May 25, 13
Programação
• Primeira parte
• Test-Driven Development (TDD)
• Segunda parte
• Refactoring
Saturday, May 25, 13
Test-Driven Development (Parte I)
Saturday, May 25, 13
Agenda
• Motivação
• Famílias e tipos de testes
• Teste unitário
• Test-Driven Development
• Exercício de fixação
Saturday, May 25, 13
O problema
Barato Rápido
Bom
Saturday, May 25, 13
No silver bullet!
Saturday, May 25, 13
Porém, com testes...
• Um pouco mais rápido
• Um pouco mais barato
• Um pouco melhor
Saturday, May 25, 13
Rápido
0
250
500
750
1000
Projeto Implementação QA Post-release
Tempo gasto para resolver bugs
Saturday, May 25, 13
Barato
• Bugs são descobertos nas fases iniciais do
desenvolvimento
• Custo para resolver bug = Número de bugs /
Custo por bug resolvido
• Custo dos testes = Número de features /
Complexidade das features
Saturday, May 25, 13
Melhor
• Desenvolvimento tradicional
• Instintivo
• Difícil de mensurar
• TDD
• Indicativo
• Mensurável
• Testável
Saturday, May 25, 13
Então, a solução é testar
Saturday, May 25, 13
Mas por que os desenvolvedores
deveriam escrever testes?
• Respostas comuns
• Deixa os testes para o QA
• Desenvolvedores são muito ocupados
• Desenvolvedores não sabem como testar
• Nós não temos bugs
• Desenvolvedores não são adequados para testar
o código
Saturday, May 25, 13
Os desenvolvedores deveriam
considerar isto...
• Como os desenvolvedores vão saber que estão
fazendo software de qualidade sem os testes?
• Testes são uma ferramenta para ajudar os
desenvolvedores a contribuírem para qualidade
• Testes ajudam a dar perquenos passos e receber
feedback constante
• Testes ajudam a manter o foco sobre
mensuráveis resultados de desenvolvimento
Saturday, May 25, 13
Panorama da indústria
• Principais problemas relatados na adoção de
testes pela indústria
• Aumenta o tempo de desenvolvimento
• Experiência ou habilidade insuficiente
• Insuficiente design
• Insuficiente aderência ao TDD
• Falta de ferramentas
Saturday, May 25, 13
O que é um teste de software?
Saturday, May 25, 13
“O teste de software é a
investigação do software a fim
de fornecer informações sobre
sua qualidade em relação ao
contexto em que ele deve
operar. Isto inclui o processo de
utilizar o produto para
encontrar seus defeitos.”
Wikipedia
Saturday, May 25, 13
O que é qualidade de software?
Saturday, May 25, 13
“A qualidade de software é uma
área de conhecimento da
engenharia de software que
objetiva garantir a qualidade do
software através da definição e
normatização de processos de
desenvolvimento.” Wikipedia
Saturday, May 25, 13
Tipos de teste (Alguns)
• Teste funcional
• Teste de usabilidade
• Teste de stress
• Teste de aceitação
• Teste de regressão
• Teste de configuração
• Teste unitário
Saturday, May 25, 13
Famílias de Teste
• XUnit (JUnit, PyUnit, JsUnit)
• “assert”
• TAP (libtap)
• “ok” ou “is”
Saturday, May 25, 13
Teste unitário
“Teste unitário é o método pelo qual unidades de
código são testadas para verificar se estas estão aptas
para o uso. Uma unidade é a menor parte testável de
uma aplicação.” Wikepedia
Saturday, May 25, 13
Por que teste unitário?
• Debugar é um processo que consume tempo
• Quando novas funcionalidades são adicionadas,
como assegurar que as antigas não quebraram?
• Ver a classe em ação
• Medida de qualidade de software
Saturday, May 25, 13
Teste unitário é bom se...
• É realmente automático
• Testa tudo que é provável quebrar
• Deve ser independente de ambiente e de outros
testes
• Deve ser repetitivo e mostrar sempre o mesmo
resultado toda vez que executar
• O teste deve ser claro
Saturday, May 25, 13
Exemplo de teste unitário
public void marriageIsSimmetric(){
Customer alice = new Customer();
Customer bob = new Customer();
bob.marry(alice);
assertTrue(bob.ismariedTo(alice));
assertTrue(alice.ismariedTo(bob));
}
Saturday, May 25, 13
hands-on!
Saturday, May 25, 13
O que é TDD?
• Uma técnica iterativa para desenvolver software
• Escreva primeiro um teste que falha(ou até mesmo
não compile), antes de escrever uma nova
funcionalidade
• O objetivo do TDD é especificação e não validação
• Uma prática para evoluir o código eficientemente
Saturday, May 25, 13
Ciclo do desenvolvimento com TDD
Saturday, May 25, 13
Regras fundamentais do TDD
• Escreva somente o código suficiente para o teste
passar
• Escreva testes pequenos
• Escreva testes muito rápidos
Saturday, May 25, 13
Motivações para o uso do TDD
• Design pouco testável
• Baixa cobertura de testes unitários
• Necessidade de levantar todo o ambiente para
poder testar
• Necessidade de manter compatibilidade retroativa
• Insegurança ao modificar a base de código
Saturday, May 25, 13
Benefícios em usar TDD
• Suíte de regressão
• Testes são feitos na IDE
• Bugs comprovados por testes unitários
• Código mais testável
• Facilita o refactoring
• Evita o “overdesign”
• Colabora com a documentação
Saturday, May 25, 13
Ponderações sobre o uso do TDD
• Demora mais?
• No início é necessário escrever muitos testes
• Suite de regressão
• Certeza de que a implementação está rodando
• Maioria dos bugs encontrados em tempo de
desenvolvimento
• Bugs corrigidos mais rápidos
Saturday, May 25, 13
TDD é código que funciona
• Previsível
• Aprendizagem
• Confiança
• Documentação
• Proteção
• Teste suite automatizado
Saturday, May 25, 13
Quando devo parar?
• O sistema funciona
• O código comunica o que está fazendo
• Não existe código duplicado
• O sistema deveria ter a menor quantidade possível
de classes e métodos
Saturday, May 25, 13
TDD é sobre design, não sobre testes
• Use TDD para produzir algo simples que funcione
(KISS)
• Guie o design do software através dos testes
• Foque sobre escrever soluções simples para os
requisitos
• Escreva somente código para o teste passar
• Remova código duplicado (DRY)
Saturday, May 25, 13
TDD vs UML
• Análise prévia do problema
• Reutilização de código
• Linguagem unificada para especificação de
sistemas
• Aumento na qualidade
• Ferramenta de aprendizado
• Facilidade de manutenção
Saturday, May 25, 13
hands-on!
Saturday, May 25, 13
Tópico para discussão
• Deveríamos testar métodos privados?
• Sempre devemos usar TDD?
Saturday, May 25, 13
Perguntas?
Saturday, May 25, 13
Obrigado!
Saturday, May 25, 13
Test-Driven Development (Parte II)
Saturday, May 25, 13
Agenda
• Revisão
• JUnit
• Mock
• Padrões de TDD
• Exercícios
Saturday, May 25, 13
Cenas dos capítulos anteriores...
Saturday, May 25, 13
Cenas dos capítulos anteriores...
Saturday, May 25, 13
JUnit
Saturday, May 25, 13
JUnit
• Annotations
• @Test
• @Before e @After
• @BeforeClass e @AfterClass
• @Test(expected = ArithmeticException.class)
• @Ignore
• @Test(timeout = 1000)
Saturday, May 25, 13
JUnit
Assertions do JUnit
Saturday, May 25, 13
Mock
Saturday, May 25, 13
Exemplo de mock (Simples)
Saturday, May 25, 13
Exemplo de mock (Um pouco mais
complexo)
Saturday, May 25, 13
Padrões de TDD
• O que queremos testar?
• Quando testamos?
• Como escolhemos que lógica testar?
• Como escolhemos quais dados testar?
Saturday, May 25, 13
Padrões de TDD
• Teste (substantivo)
• Teste isolado
• Lista de testes
• Teste primeiro
• Defina uma asserção primeiro
• Dados de teste
• Dados evidentes
Saturday, May 25, 13
Exercícios de TDD
• Valida RG
• Valida Chassi
• Valida CPF
Saturday, May 25, 13
Saturday, May 25, 13
Saturday, May 25, 13
Saturday, May 25, 13
Saturday, May 25, 13
Test-Driven Development (Parte III)
Saturday, May 25, 13
Agenda
• Exercício
Saturday, May 25, 13
Dinheiro Multi-Moeda
Instrumento Ações Preço Total
Apple 1000 25 USD 25000 USD
Google 400 150 CHF 60000 CHF
TotalTotalTotal 65000 USD
De Para Taxa
CHF USD 1,5
Saturday, May 25, 13
Saturday, May 25, 13
Saturday, May 25, 13
Refactoring (Parte I)
Saturday, May 25, 13
Agenda
• Conceitos básicos
• Exemplo
Saturday, May 25, 13
O que é refactoring?
Saturday, May 25, 13
Saturday, May 25, 13
hands-on!
Saturday, May 25, 13
Saturday, May 25, 13
Saturday, May 25, 13
Refactoring (Parte II)
Saturday, May 25, 13
Agenda
• Conceitos básicos
• Motivos para refatorar
• Princípios de design de software
• “Mau cheiro”
• Ciclo do refactoring
• Técnicas de refactoring
• Exercício
Saturday, May 25, 13
• Refactoring(substantivo) - Mudança feita na
estrutura interna do software para fazê-lo fácil de
ler e barato de mudar sem alterar seu
comportamento
• Refactor(verbo) - Reestruturar o software através
de uma série de refactorings sem alterar seu
compotamento
Saturday, May 25, 13
O propósito do refactoring é fazer o
software fácil de entender e modificar
Saturday, May 25, 13
Por que você deveria refatorar?
Saturday, May 25, 13
Alguns porquês...
• Melhorar o design do software
• Fazer o software mais fácil de entender
• Encontrar bugs
• Escrever código mais rapidamente
Saturday, May 25, 13
Princípios de design de software
• Princípio da responsabilidade única
• Princípio aberto fechado
• Princípio da substituição de Liskov
• Princípio da injeção de dependência
• Princípio de segregação de interface
Saturday, May 25, 13
“Mau cheiro” no código(Não é isso)
Saturday, May 25, 13
“Mau cheiro” no código
Saturday, May 25, 13
O ciclo do refactoring
• O escolha o “mau cheiro”
• Selecione uma refatoração
• Aplique a refatoração
• Execute todos os testes
Saturday, May 25, 13
Técnicas de Refactoring
Saturday, May 25, 13
hands-on!
Saturday, May 25, 13
Saturday, May 25, 13
Saturday, May 25, 13

Weitere ähnliche Inhalte

Was ist angesagt?

Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de SoftwareAdilmar Dantas
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisAna Paula Gomes
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código LegadoCesar Romero
 
Pesquisa em Métodos Ágeis para o Desenvolvimento de Software
Pesquisa em Métodos Ágeis para o Desenvolvimento de SoftwarePesquisa em Métodos Ágeis para o Desenvolvimento de Software
Pesquisa em Métodos Ágeis para o Desenvolvimento de SoftwareAdolfo Neto
 
At Ma Qualidade Molinari V11 Final Version
At Ma Qualidade Molinari V11 Final VersionAt Ma Qualidade Molinari V11 Final Version
At Ma Qualidade Molinari V11 Final VersionLeonardo Molinari
 
Scrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tourScrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tourEduardo Bregaida
 
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
 
Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)Rennan Martini
 
Cafe agil em Recife - Agile and Design
Cafe agil em Recife - Agile and DesignCafe agil em Recife - Agile and Design
Cafe agil em Recife - Agile and DesignThoughtworks
 
IBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesIBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesFelipe Freire
 
Test Driven Development - Conceitos básicos
Test Driven Development - Conceitos básicosTest Driven Development - Conceitos básicos
Test Driven Development - Conceitos básicosMateus Parente
 
ALM - Testes Exploratórios
ALM - Testes ExploratóriosALM - Testes Exploratórios
ALM - Testes ExploratóriosAlan Carlos
 

Was ist angesagt? (18)

Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de Software
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e mais
 
Testes de unidade - Conhecendo e aplicando
Testes de unidade - Conhecendo e aplicandoTestes de unidade - Conhecendo e aplicando
Testes de unidade - Conhecendo e aplicando
 
Pensando TDD
Pensando TDDPensando TDD
Pensando TDD
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código Legado
 
Pesquisa em Métodos Ágeis para o Desenvolvimento de Software
Pesquisa em Métodos Ágeis para o Desenvolvimento de SoftwarePesquisa em Métodos Ágeis para o Desenvolvimento de Software
Pesquisa em Métodos Ágeis para o Desenvolvimento de Software
 
Php com código limpo
Php com código limpoPhp com código limpo
Php com código limpo
 
At Ma Qualidade Molinari V11 Final Version
At Ma Qualidade Molinari V11 Final VersionAt Ma Qualidade Molinari V11 Final Version
At Ma Qualidade Molinari V11 Final Version
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Scrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tourScrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tour
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)
 
Cafe agil em Recife - Agile and Design
Cafe agil em Recife - Agile and DesignCafe agil em Recife - Agile and Design
Cafe agil em Recife - Agile and Design
 
IBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesIBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em Testes
 
Test Driven Development - Conceitos básicos
Test Driven Development - Conceitos básicosTest Driven Development - Conceitos básicos
Test Driven Development - Conceitos básicos
 
ALM - Testes Exploratórios
ALM - Testes ExploratóriosALM - Testes Exploratórios
ALM - Testes Exploratórios
 
Scrum treinamento
Scrum   treinamentoScrum   treinamento
Scrum treinamento
 

Ähnlich wie TDD e Refactoring

Tente desenvolver diferente com TDD
Tente desenvolver diferente com TDDTente desenvolver diferente com TDD
Tente desenvolver diferente com TDDWebgoal
 
introxp-180413013250.pdf
introxp-180413013250.pdfintroxp-180413013250.pdf
introxp-180413013250.pdfPedroLuis216164
 
Modelagem Ágil - UaiJug TechDays 2013 - Uberlândia MG
Modelagem Ágil - UaiJug TechDays 2013 - Uberlândia MGModelagem Ágil - UaiJug TechDays 2013 - Uberlândia MG
Modelagem Ágil - UaiJug TechDays 2013 - Uberlândia MGNeubio Ferreira
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareDextra Sistemas / Etec Itu
 
Extreme programming
Extreme programmingExtreme programming
Extreme programmingVitor Castro
 
UnP Eng. Software - Aula 27
UnP Eng. Software - Aula 27UnP Eng. Software - Aula 27
UnP Eng. Software - Aula 27Hélio Medeiros
 
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
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaRogerio Fontes
 
Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...
Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...
Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...Igor Abade
 
TDD: A Essência do Mantra
TDD: A Essência do MantraTDD: A Essência do Mantra
TDD: A Essência do MantraDionatan default
 
Introdução ao Test Driven Development (TDD)
Introdução ao Test Driven Development (TDD)Introdução ao Test Driven Development (TDD)
Introdução ao Test Driven Development (TDD)Lucas Nery
 
Introdução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosIntrodução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosDionatan default
 

Ähnlich wie TDD e Refactoring (20)

Tente desenvolver diferente com TDD
Tente desenvolver diferente com TDDTente desenvolver diferente com TDD
Tente desenvolver diferente com TDD
 
Testes
TestesTestes
Testes
 
introxp-180413013250.pdf
introxp-180413013250.pdfintroxp-180413013250.pdf
introxp-180413013250.pdf
 
Teste automatizados e tdd
Teste automatizados e tddTeste automatizados e tdd
Teste automatizados e tdd
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Modelagem Ágil - UaiJug TechDays 2013 - Uberlândia MG
Modelagem Ágil - UaiJug TechDays 2013 - Uberlândia MGModelagem Ágil - UaiJug TechDays 2013 - Uberlândia MG
Modelagem Ágil - UaiJug TechDays 2013 - Uberlândia MG
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de software
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
UnP Eng. Software - Aula 27
UnP Eng. Software - Aula 27UnP Eng. Software - Aula 27
UnP Eng. Software - Aula 27
 
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
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 
Criando uma Arquitetura Testável
Criando uma Arquitetura TestávelCriando uma Arquitetura Testável
Criando uma Arquitetura Testável
 
Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...
Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...
Scrum e Team Foundation Server - Qualidade ao longo de todo o ciclo de vida d...
 
RealDay: Introduction to TDD
RealDay: Introduction to TDDRealDay: Introduction to TDD
RealDay: Introduction to TDD
 
TDD: A Essência do Mantra
TDD: A Essência do MantraTDD: A Essência do Mantra
TDD: A Essência do Mantra
 
Introdução ao Test Driven Development (TDD)
Introdução ao Test Driven Development (TDD)Introdução ao Test Driven Development (TDD)
Introdução ao Test Driven Development (TDD)
 
Introdução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosIntrodução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anos
 
TDD
TDDTDD
TDD
 
Seu código fede e você nem sabia
Seu código fede e você nem sabiaSeu código fede e você nem sabia
Seu código fede e você nem sabia
 

Mehr von André Pitombeira

Increasing productivity with continuous delivery
Increasing productivity with continuous deliveryIncreasing productivity with continuous delivery
Increasing productivity with continuous deliveryAndré Pitombeira
 
Software estimation techniques
Software estimation techniquesSoftware estimation techniques
Software estimation techniquesAndré Pitombeira
 
Best Practices in Software Development
Best Practices in Software DevelopmentBest Practices in Software Development
Best Practices in Software DevelopmentAndré Pitombeira
 

Mehr von André Pitombeira (6)

Increasing productivity with continuous delivery
Increasing productivity with continuous deliveryIncreasing productivity with continuous delivery
Increasing productivity with continuous delivery
 
Software estimation techniques
Software estimation techniquesSoftware estimation techniques
Software estimation techniques
 
Best Practices in Software Development
Best Practices in Software DevelopmentBest Practices in Software Development
Best Practices in Software Development
 
Introduction to TypeScript
Introduction to TypeScriptIntroduction to TypeScript
Introduction to TypeScript
 
Clustering
ClusteringClustering
Clustering
 
Computação Ubíqua
Computação UbíquaComputação Ubíqua
Computação Ubíqua
 

TDD e Refactoring

  • 1. TDD e Refactoring André Luís Pitombeira Saturday, May 25, 13
  • 2. Quem sou eu? • Bacharel em Sistemas de Informação (UFC/ Quixadá) • Bacharel em Administração de Empresas (FCRS) • Desenvolvedor de Software do lsbd Saturday, May 25, 13
  • 3. Quem são vocês? • Respondam estas três perguntas • Qual o seu nome? • O que você faz da vida? • O que você espera deste curso? Saturday, May 25, 13
  • 4. Objetivos • Definir os principais conceitos relacionados ao TDD e Refactoring • Mostrar boas práticas de programação e design de sistemas • Demonstrar o uso de algumas ferramentas Saturday, May 25, 13
  • 5. Programação • Primeira parte • Test-Driven Development (TDD) • Segunda parte • Refactoring Saturday, May 25, 13
  • 6. Test-Driven Development (Parte I) Saturday, May 25, 13
  • 7. Agenda • Motivação • Famílias e tipos de testes • Teste unitário • Test-Driven Development • Exercício de fixação Saturday, May 25, 13
  • 10. Porém, com testes... • Um pouco mais rápido • Um pouco mais barato • Um pouco melhor Saturday, May 25, 13
  • 11. Rápido 0 250 500 750 1000 Projeto Implementação QA Post-release Tempo gasto para resolver bugs Saturday, May 25, 13
  • 12. Barato • Bugs são descobertos nas fases iniciais do desenvolvimento • Custo para resolver bug = Número de bugs / Custo por bug resolvido • Custo dos testes = Número de features / Complexidade das features Saturday, May 25, 13
  • 13. Melhor • Desenvolvimento tradicional • Instintivo • Difícil de mensurar • TDD • Indicativo • Mensurável • Testável Saturday, May 25, 13
  • 14. Então, a solução é testar Saturday, May 25, 13
  • 15. Mas por que os desenvolvedores deveriam escrever testes? • Respostas comuns • Deixa os testes para o QA • Desenvolvedores são muito ocupados • Desenvolvedores não sabem como testar • Nós não temos bugs • Desenvolvedores não são adequados para testar o código Saturday, May 25, 13
  • 16. Os desenvolvedores deveriam considerar isto... • Como os desenvolvedores vão saber que estão fazendo software de qualidade sem os testes? • Testes são uma ferramenta para ajudar os desenvolvedores a contribuírem para qualidade • Testes ajudam a dar perquenos passos e receber feedback constante • Testes ajudam a manter o foco sobre mensuráveis resultados de desenvolvimento Saturday, May 25, 13
  • 17. Panorama da indústria • Principais problemas relatados na adoção de testes pela indústria • Aumenta o tempo de desenvolvimento • Experiência ou habilidade insuficiente • Insuficiente design • Insuficiente aderência ao TDD • Falta de ferramentas Saturday, May 25, 13
  • 18. O que é um teste de software? Saturday, May 25, 13
  • 19. “O teste de software é a investigação do software a fim de fornecer informações sobre sua qualidade em relação ao contexto em que ele deve operar. Isto inclui o processo de utilizar o produto para encontrar seus defeitos.” Wikipedia Saturday, May 25, 13
  • 20. O que é qualidade de software? Saturday, May 25, 13
  • 21. “A qualidade de software é uma área de conhecimento da engenharia de software que objetiva garantir a qualidade do software através da definição e normatização de processos de desenvolvimento.” Wikipedia Saturday, May 25, 13
  • 22. Tipos de teste (Alguns) • Teste funcional • Teste de usabilidade • Teste de stress • Teste de aceitação • Teste de regressão • Teste de configuração • Teste unitário Saturday, May 25, 13
  • 23. Famílias de Teste • XUnit (JUnit, PyUnit, JsUnit) • “assert” • TAP (libtap) • “ok” ou “is” Saturday, May 25, 13
  • 24. Teste unitário “Teste unitário é o método pelo qual unidades de código são testadas para verificar se estas estão aptas para o uso. Uma unidade é a menor parte testável de uma aplicação.” Wikepedia Saturday, May 25, 13
  • 25. Por que teste unitário? • Debugar é um processo que consume tempo • Quando novas funcionalidades são adicionadas, como assegurar que as antigas não quebraram? • Ver a classe em ação • Medida de qualidade de software Saturday, May 25, 13
  • 26. Teste unitário é bom se... • É realmente automático • Testa tudo que é provável quebrar • Deve ser independente de ambiente e de outros testes • Deve ser repetitivo e mostrar sempre o mesmo resultado toda vez que executar • O teste deve ser claro Saturday, May 25, 13
  • 27. Exemplo de teste unitário public void marriageIsSimmetric(){ Customer alice = new Customer(); Customer bob = new Customer(); bob.marry(alice); assertTrue(bob.ismariedTo(alice)); assertTrue(alice.ismariedTo(bob)); } Saturday, May 25, 13
  • 29. O que é TDD? • Uma técnica iterativa para desenvolver software • Escreva primeiro um teste que falha(ou até mesmo não compile), antes de escrever uma nova funcionalidade • O objetivo do TDD é especificação e não validação • Uma prática para evoluir o código eficientemente Saturday, May 25, 13
  • 30. Ciclo do desenvolvimento com TDD Saturday, May 25, 13
  • 31. Regras fundamentais do TDD • Escreva somente o código suficiente para o teste passar • Escreva testes pequenos • Escreva testes muito rápidos Saturday, May 25, 13
  • 32. Motivações para o uso do TDD • Design pouco testável • Baixa cobertura de testes unitários • Necessidade de levantar todo o ambiente para poder testar • Necessidade de manter compatibilidade retroativa • Insegurança ao modificar a base de código Saturday, May 25, 13
  • 33. Benefícios em usar TDD • Suíte de regressão • Testes são feitos na IDE • Bugs comprovados por testes unitários • Código mais testável • Facilita o refactoring • Evita o “overdesign” • Colabora com a documentação Saturday, May 25, 13
  • 34. Ponderações sobre o uso do TDD • Demora mais? • No início é necessário escrever muitos testes • Suite de regressão • Certeza de que a implementação está rodando • Maioria dos bugs encontrados em tempo de desenvolvimento • Bugs corrigidos mais rápidos Saturday, May 25, 13
  • 35. TDD é código que funciona • Previsível • Aprendizagem • Confiança • Documentação • Proteção • Teste suite automatizado Saturday, May 25, 13
  • 36. Quando devo parar? • O sistema funciona • O código comunica o que está fazendo • Não existe código duplicado • O sistema deveria ter a menor quantidade possível de classes e métodos Saturday, May 25, 13
  • 37. TDD é sobre design, não sobre testes • Use TDD para produzir algo simples que funcione (KISS) • Guie o design do software através dos testes • Foque sobre escrever soluções simples para os requisitos • Escreva somente código para o teste passar • Remova código duplicado (DRY) Saturday, May 25, 13
  • 38. TDD vs UML • Análise prévia do problema • Reutilização de código • Linguagem unificada para especificação de sistemas • Aumento na qualidade • Ferramenta de aprendizado • Facilidade de manutenção Saturday, May 25, 13
  • 40. Tópico para discussão • Deveríamos testar métodos privados? • Sempre devemos usar TDD? Saturday, May 25, 13
  • 43. Test-Driven Development (Parte II) Saturday, May 25, 13
  • 44. Agenda • Revisão • JUnit • Mock • Padrões de TDD • Exercícios Saturday, May 25, 13
  • 45. Cenas dos capítulos anteriores... Saturday, May 25, 13
  • 46. Cenas dos capítulos anteriores... Saturday, May 25, 13
  • 48. JUnit • Annotations • @Test • @Before e @After • @BeforeClass e @AfterClass • @Test(expected = ArithmeticException.class) • @Ignore • @Test(timeout = 1000) Saturday, May 25, 13
  • 51. Exemplo de mock (Simples) Saturday, May 25, 13
  • 52. Exemplo de mock (Um pouco mais complexo) Saturday, May 25, 13
  • 53. Padrões de TDD • O que queremos testar? • Quando testamos? • Como escolhemos que lógica testar? • Como escolhemos quais dados testar? Saturday, May 25, 13
  • 54. Padrões de TDD • Teste (substantivo) • Teste isolado • Lista de testes • Teste primeiro • Defina uma asserção primeiro • Dados de teste • Dados evidentes Saturday, May 25, 13
  • 55. Exercícios de TDD • Valida RG • Valida Chassi • Valida CPF Saturday, May 25, 13
  • 60. Test-Driven Development (Parte III) Saturday, May 25, 13
  • 62. Dinheiro Multi-Moeda Instrumento Ações Preço Total Apple 1000 25 USD 25000 USD Google 400 150 CHF 60000 CHF TotalTotalTotal 65000 USD De Para Taxa CHF USD 1,5 Saturday, May 25, 13
  • 66. Agenda • Conceitos básicos • Exemplo Saturday, May 25, 13
  • 67. O que é refactoring? Saturday, May 25, 13
  • 73. Agenda • Conceitos básicos • Motivos para refatorar • Princípios de design de software • “Mau cheiro” • Ciclo do refactoring • Técnicas de refactoring • Exercício Saturday, May 25, 13
  • 74. • Refactoring(substantivo) - Mudança feita na estrutura interna do software para fazê-lo fácil de ler e barato de mudar sem alterar seu comportamento • Refactor(verbo) - Reestruturar o software através de uma série de refactorings sem alterar seu compotamento Saturday, May 25, 13
  • 75. O propósito do refactoring é fazer o software fácil de entender e modificar Saturday, May 25, 13
  • 76. Por que você deveria refatorar? Saturday, May 25, 13
  • 77. Alguns porquês... • Melhorar o design do software • Fazer o software mais fácil de entender • Encontrar bugs • Escrever código mais rapidamente Saturday, May 25, 13
  • 78. Princípios de design de software • Princípio da responsabilidade única • Princípio aberto fechado • Princípio da substituição de Liskov • Princípio da injeção de dependência • Princípio de segregação de interface Saturday, May 25, 13
  • 79. “Mau cheiro” no código(Não é isso) Saturday, May 25, 13
  • 80. “Mau cheiro” no código Saturday, May 25, 13
  • 81. O ciclo do refactoring • O escolha o “mau cheiro” • Selecione uma refatoração • Aplique a refatoração • Execute todos os testes Saturday, May 25, 13