workshop: testes automatizados, refactoring e design patterns

Post on 06-Jul-2015

602 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

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

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

top related