Post on 06-Jul-2015
description
Workshop: Testes automatizados,
Refactoring e Desgin Patterns
#GUMA10ANOS
Maurício Andreazza Sganderla - @m_andreazza
• Desenvolvedor na uMov.me• Aficionado por Agile• No mercado de T.I. há 8 anos• Formado em Sistemas de Informação• Pós-Graduando em Métodos Ágeis Jorge Oleques - @jorgeoleques
• Desenvolvedor na uMov.me• Entusiasta XP• No mercado de T.I. há 6 anos• Formado Analise e Desenvolvimento• Pós-Graduando em Eng. Software na FGV
ANO:
2014
Ano de copa amigo...
quem testa seu
software?
Quem testa de forma
automatizada?
Já pensou no tempo que
você perde?
PIRÂMIDE DE TESTES
PIRÂMIDE DE TESTES
MAS AFINAL, O QUE É TESTE DE
UNIDADE ?
“
“
mas tenho uma equipe de teste,
por que testar?
Equipes de testes
testes caixa preta
E o teste de unidade pra que serve ?
definição de pronto
REFATORAR
REFATORAR? Do que se trata?
para refatorar preciso de patterns?
● Extrair Método (Extract Method)● Mover Método (Move Method)● Mover Atributo (Move Field')● Extrair Classe (Extract Class)● Encapsular Atributo (Encapsulate Field)● Renomear Método (Rename Method)● Subir Método (Pull Up Method)● Subir Atributo (Pull Up Field)● Descer Método (Push Down Method)● Descer Atributo (Push Down Field)● Extrair Sub-classe (Extract Subclass)● Extrair Super-classe (Extract Superclass)
Refactory
public void save() { // Verifica propriedades if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome"); } else if (this.getTipo() == "E"&& this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } this.getDatabase().save(this); }
fonte:http://pt.wikipedia.org/wiki/Refatoração
código ruim
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
código melhor
mas ta realmente bom?
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
código melhor
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
como vamos testar?
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
quantas responsabilidade?
mas o que faço então?
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
quantas responsabilidade?
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
quantas responsabilidade?
REFATORAR ENTÃO
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
quantas responsabilidade?1. extrair para uma clase2. extrair para metodo3. extrair interface4. aplicar strategy5. criar factory
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
Extrair para uma classe1. extrair para uma clase2. extrair para metodo3. extrair interface4. aplicar strategy5. criar factory
public classe checkProperties{ public void check() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }}
Extrair para uma classe
public classe checkProperties{ public void check() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }}
quantas responsabilidades?
public classe checkProperties{ public void check() { validateName(); validateDescription(); } public void validateName() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } }public void validateDescription() { if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); }
}}
Extrair para metodo
public classe checkProperties{ public void check() { validateName(); validateDescription(); } public void validateName() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } }public void validateDescription() { if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); }
}}
métodos testaveis
public interface Check(){ public void check();}
Extrair interface
public classe checkProperties{ public void check() { validateName(); validateDescription(); } public void validateName() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } }public void validateDescription() { if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); }
}}
aplicar strategy
public classe checkNome implements Check{ @Override public void check() { if (this.getName() == null) { throw new Exception("Falta nome do produto."); } }}
aplicar strategy
public classe checkDescritpion implements Check{ @Override public void check() { if (this.getDescription() == null){ throw new Exception("Falta a descrição do produto."); } }}
aplicar strategy
public classe CheckFactory{
public static Check getInstance(String type) { if (type == "E"){ return new CheckDescription(); }else if (type == "P"){ return new CheckName(); } }
aplicar factory
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } }
fonte:http://pt.wikipedia.org/wiki/Refatoração
o que tinhamos
public void save() { this.checkProperties(); this.getDatabase().save(this); }
private void checkProperties() { CheckFactory.getInstance(this.getTipo()).check(); }
e agora
e agora
vod save();void chekProperties();
Cliente
Check getInstance();
CheckFactory
void check();Check
void check();
CheckNamevoid check();
CheckDescription
vantagens
1. Código testável2. Código mais simples3. Mais fácil evoluir4. Rápida manutenção
vantagens
1. Maior complexidade nas classes
desvantagens
LET'S CODE !!!