85
TDD e Refactoring André Luís Pitombeira Saturday, May 25, 13

TDD e Refactoring

Embed Size (px)

Citation preview

Page 1: TDD e Refactoring

TDD e RefactoringAndré Luís Pitombeira

Saturday, May 25, 13

Page 2: TDD e Refactoring

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

Page 3: TDD e Refactoring

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

Page 4: TDD e Refactoring

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

Page 5: TDD e Refactoring

Programação

• Primeira parte

• Test-Driven Development (TDD)

• Segunda parte

• Refactoring

Saturday, May 25, 13

Page 6: TDD e Refactoring

Test-Driven Development (Parte I)

Saturday, May 25, 13

Page 7: TDD e Refactoring

Agenda

• Motivação

• Famílias e tipos de testes

• Teste unitário

• Test-Driven Development

• Exercício de fixação

Saturday, May 25, 13

Page 8: TDD e Refactoring

O problema

Barato Rápido

Bom

Saturday, May 25, 13

Page 9: TDD e Refactoring

No silver bullet!

Saturday, May 25, 13

Page 10: TDD e Refactoring

Porém, com testes...

• Um pouco mais rápido

• Um pouco mais barato

• Um pouco melhor

Saturday, May 25, 13

Page 11: TDD e Refactoring

Rápido

0

250

500

750

1000

Projeto Implementação QA Post-release

Tempo gasto para resolver bugs

Saturday, May 25, 13

Page 12: TDD e Refactoring

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

Page 13: TDD e Refactoring

Melhor

• Desenvolvimento tradicional

• Instintivo

• Difícil de mensurar

• TDD

• Indicativo

• Mensurável

• Testável

Saturday, May 25, 13

Page 14: TDD e Refactoring

Então, a solução é testar

Saturday, May 25, 13

Page 15: TDD e Refactoring

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

Page 16: TDD e Refactoring

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

Page 17: TDD e Refactoring

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

Page 18: TDD e Refactoring

O que é um teste de software?

Saturday, May 25, 13

Page 19: TDD e Refactoring

“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

Page 20: TDD e Refactoring

O que é qualidade de software?

Saturday, May 25, 13

Page 21: TDD e Refactoring

“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

Page 22: TDD e Refactoring

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

Page 23: TDD e Refactoring

Famílias de Teste

• XUnit (JUnit, PyUnit, JsUnit)

• “assert”

• TAP (libtap)

• “ok” ou “is”

Saturday, May 25, 13

Page 24: TDD e Refactoring

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

Page 25: TDD e Refactoring

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

Page 26: TDD e Refactoring

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

Page 27: TDD e Refactoring

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

Page 28: TDD e Refactoring

hands-on!

Saturday, May 25, 13

Page 29: TDD e Refactoring

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

Page 30: TDD e Refactoring

Ciclo do desenvolvimento com TDD

Saturday, May 25, 13

Page 31: TDD e Refactoring

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

Page 32: TDD e Refactoring

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

Page 33: TDD e Refactoring

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

Page 34: TDD e Refactoring

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

Page 35: TDD e Refactoring

TDD é código que funciona

• Previsível

• Aprendizagem

• Confiança

• Documentação

• Proteção

• Teste suite automatizado

Saturday, May 25, 13

Page 36: TDD e Refactoring

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

Page 37: TDD e Refactoring

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

Page 38: TDD e Refactoring

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

Page 39: TDD e Refactoring

hands-on!

Saturday, May 25, 13

Page 40: TDD e Refactoring

Tópico para discussão

• Deveríamos testar métodos privados?

• Sempre devemos usar TDD?

Saturday, May 25, 13

Page 41: TDD e Refactoring

Perguntas?

Saturday, May 25, 13

Page 42: TDD e Refactoring

Obrigado!

Saturday, May 25, 13

Page 43: TDD e Refactoring

Test-Driven Development (Parte II)

Saturday, May 25, 13

Page 44: TDD e Refactoring

Agenda

• Revisão

• JUnit

• Mock

• Padrões de TDD

• Exercícios

Saturday, May 25, 13

Page 45: TDD e Refactoring

Cenas dos capítulos anteriores...

Saturday, May 25, 13

Page 46: TDD e Refactoring

Cenas dos capítulos anteriores...

Saturday, May 25, 13

Page 47: TDD e Refactoring

JUnit

Saturday, May 25, 13

Page 48: TDD e Refactoring

JUnit

• Annotations

• @Test

• @Before e @After

• @BeforeClass e @AfterClass

• @Test(expected = ArithmeticException.class)

• @Ignore

• @Test(timeout = 1000)

Saturday, May 25, 13

Page 50: TDD e Refactoring

Mock

Saturday, May 25, 13

Page 51: TDD e Refactoring

Exemplo de mock (Simples)

Saturday, May 25, 13

Page 52: TDD e Refactoring

Exemplo de mock (Um pouco mais complexo)

Saturday, May 25, 13

Page 53: TDD e Refactoring

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

Page 54: TDD e Refactoring

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

Page 55: TDD e Refactoring

Exercícios de TDD

• Valida RG

• Valida Chassi

• Valida CPF

Saturday, May 25, 13

Page 56: TDD e Refactoring

Saturday, May 25, 13

Page 57: TDD e Refactoring

Saturday, May 25, 13

Page 58: TDD e Refactoring

Saturday, May 25, 13

Page 59: TDD e Refactoring

Saturday, May 25, 13

Page 60: TDD e Refactoring

Test-Driven Development (Parte III)

Saturday, May 25, 13

Page 61: TDD e Refactoring

Agenda

• Exercício

Saturday, May 25, 13

Page 62: TDD e Refactoring

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 TaxaCHF USD 1,5

Saturday, May 25, 13

Page 63: TDD e Refactoring

Saturday, May 25, 13

Page 64: TDD e Refactoring

Saturday, May 25, 13

Page 65: TDD e Refactoring

Refactoring (Parte I)

Saturday, May 25, 13

Page 66: TDD e Refactoring

Agenda

• Conceitos básicos

• Exemplo

Saturday, May 25, 13

Page 67: TDD e Refactoring

O que é refactoring?

Saturday, May 25, 13

Page 68: TDD e Refactoring

Saturday, May 25, 13

Page 69: TDD e Refactoring

hands-on!

Saturday, May 25, 13

Page 70: TDD e Refactoring

Saturday, May 25, 13

Page 71: TDD e Refactoring

Saturday, May 25, 13

Page 72: TDD e Refactoring

Refactoring (Parte II)

Saturday, May 25, 13

Page 73: TDD e Refactoring

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

Page 74: TDD e Refactoring

• 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

Page 75: TDD e Refactoring

O propósito do refactoring é fazer o software fácil de entender e modificar

Saturday, May 25, 13

Page 76: TDD e Refactoring

Por que você deveria refatorar?

Saturday, May 25, 13

Page 77: TDD e Refactoring

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

Page 78: TDD e Refactoring

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

Page 79: TDD e Refactoring

“Mau cheiro” no código(Não é isso)

Saturday, May 25, 13

Page 80: TDD e Refactoring

“Mau cheiro” no código

Saturday, May 25, 13

Page 81: TDD e Refactoring

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

Page 82: TDD e Refactoring

Técnicas de Refactoring

Saturday, May 25, 13

Page 83: TDD e Refactoring

hands-on!

Saturday, May 25, 13

Page 84: TDD e Refactoring

Saturday, May 25, 13

Page 85: TDD e Refactoring

Saturday, May 25, 13