Top Banner
Workshop: Testes automatizados, Refactoring e Desgin Patterns #GUMA10ANOS
53

Workshop: Testes automatizados, Refactoring e Design Patterns

Jul 06, 2015

Download

Technology

Palestra realizada junto com @jorgeoleques‎ no evento de comemoração dos 10 anos do Grupo de Usuários de Metodologias Ágeis do Rio Grande do Sul sobre qualidade de código.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Workshop: Testes automatizados, Refactoring e Design Patterns

Workshop: Testes automatizados,

Refactoring e Desgin Patterns

#GUMA10ANOS

Page 2: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 3: Workshop: Testes automatizados, Refactoring e Design Patterns

ANO:

Page 4: Workshop: Testes automatizados, Refactoring e Design Patterns

2014

Page 5: Workshop: Testes automatizados, Refactoring e Design Patterns

Ano de copa amigo...

Page 6: Workshop: Testes automatizados, Refactoring e Design Patterns

quem testa seu

software?

Page 7: Workshop: Testes automatizados, Refactoring e Design Patterns

Quem testa de forma

automatizada?

Page 8: Workshop: Testes automatizados, Refactoring e Design Patterns

Já pensou no tempo que

você perde?

Page 9: Workshop: Testes automatizados, Refactoring e Design Patterns

PIRÂMIDE DE TESTES

Page 10: Workshop: Testes automatizados, Refactoring e Design Patterns

PIRÂMIDE DE TESTES

Page 11: Workshop: Testes automatizados, Refactoring e Design Patterns

MAS AFINAL, O QUE É TESTE DE

UNIDADE ?

Page 12: Workshop: Testes automatizados, Refactoring e Design Patterns

Page 13: Workshop: Testes automatizados, Refactoring e Design Patterns

mas tenho uma equipe de teste,

por que testar?

Page 14: Workshop: Testes automatizados, Refactoring e Design Patterns

Equipes de testes

Page 15: Workshop: Testes automatizados, Refactoring e Design Patterns

testes caixa preta

Page 16: Workshop: Testes automatizados, Refactoring e Design Patterns

E o teste de unidade pra que serve ?

Page 17: Workshop: Testes automatizados, Refactoring e Design Patterns

definição de pronto

Page 18: Workshop: Testes automatizados, Refactoring e Design Patterns

REFATORAR

Page 19: Workshop: Testes automatizados, Refactoring e Design Patterns

REFATORAR? Do que se trata?

Page 20: Workshop: Testes automatizados, Refactoring e Design Patterns

para refatorar preciso de patterns?

Page 21: Workshop: Testes automatizados, Refactoring e Design Patterns
Page 22: Workshop: Testes automatizados, Refactoring e Design Patterns
Page 23: Workshop: Testes automatizados, Refactoring e Design Patterns
Page 24: Workshop: Testes automatizados, Refactoring e Design 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

Page 25: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 26: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 27: Workshop: Testes automatizados, Refactoring e Design Patterns

mas ta realmente bom?

Page 28: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 29: Workshop: Testes automatizados, Refactoring e Design Patterns

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?

Page 30: Workshop: Testes automatizados, Refactoring e Design Patterns

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?

Page 31: Workshop: Testes automatizados, Refactoring e Design Patterns

mas o que faço então?

Page 32: Workshop: Testes automatizados, Refactoring e Design Patterns
Page 33: Workshop: Testes automatizados, Refactoring e Design Patterns

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?

Page 34: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 35: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 36: Workshop: Testes automatizados, Refactoring e Design Patterns
Page 37: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 38: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 39: Workshop: Testes automatizados, Refactoring e Design Patterns

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?

Page 40: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 41: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 42: Workshop: Testes automatizados, Refactoring e Design Patterns

public interface Check(){ public void check();}

Extrair interface

Page 43: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 44: Workshop: Testes automatizados, Refactoring e Design Patterns

public classe checkNome implements Check{ @Override public void check() { if (this.getName() == null) { throw new Exception("Falta nome do produto."); } }}

aplicar strategy

Page 45: Workshop: Testes automatizados, Refactoring e Design Patterns

public classe checkDescritpion implements Check{ @Override public void check() { if (this.getDescription() == null){ throw new Exception("Falta a descrição do produto."); } }}

aplicar strategy

Page 46: Workshop: Testes automatizados, Refactoring e Design Patterns

public classe CheckFactory{

public static Check getInstance(String type) { if (type == "E"){ return new CheckDescription(); }else if (type == "P"){ return new CheckName(); } }

aplicar factory

Page 47: Workshop: Testes automatizados, Refactoring e Design Patterns

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

Page 48: Workshop: Testes automatizados, Refactoring e Design Patterns

public void save() { this.checkProperties(); this.getDatabase().save(this); }

private void checkProperties() { CheckFactory.getInstance(this.getTipo()).check(); }

e agora

Page 49: Workshop: Testes automatizados, Refactoring e Design Patterns

e agora

vod save();void chekProperties();

Cliente

Check getInstance();

CheckFactory

void check();Check

void check();

CheckNamevoid check();

CheckDescription

Page 50: Workshop: Testes automatizados, Refactoring e Design Patterns

vantagens

Page 51: Workshop: Testes automatizados, Refactoring e Design Patterns

1. Código testável2. Código mais simples3. Mais fácil evoluir4. Rápida manutenção

vantagens

Page 52: Workshop: Testes automatizados, Refactoring e Design Patterns

1. Maior complexidade nas classes

desvantagens

Page 53: Workshop: Testes automatizados, Refactoring e Design Patterns

LET'S CODE !!!