workshop: testes automatizados, refactoring e design patterns

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

Upload: mauricio-sganderla

Post on 06-Jul-2015

601 views

Category:

Technology


2 download

DESCRIPTION

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.

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 !!!