Workshop: Testesautomatizados,
RefactoringeDesginPatterns
#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 clase
2. extrair para metodo
3. extrair interface
4. aplicar strategy
5. 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 classe
1. extrair para uma clase
2. extrair para metodo
3. extrair interface
4. aplicar strategy
5. 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();
CheckName
void check();
CheckDescription
vantagens
1. Código testável
2. Código mais simples
3. Mais fácil evoluir
4. Rápida manutenção
vantagens
1. Maior complexidade nas classes
desvantagens
LET'S
CODE !!!

Workshop: Testes automatizados, Refactoring e Design Patterns

  • 1.
  • 2.
    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
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    Já pensou no tempoque você perde?
  • 9.
  • 10.
  • 11.
    MAS AFINAL, O QUEÉ TESTE DE UNIDADE ?
  • 12.
  • 13.
    mas tenho uma equipede teste, por que testar?
  • 14.
  • 15.
  • 16.
    E o testede unidade pra que serve ?
  • 17.
  • 18.
  • 19.
  • 20.
  • 24.
    ● 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
  • 25.
    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
  • 26.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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
  • 27.
  • 28.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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
  • 29.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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?
  • 30.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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?
  • 31.
    mas o quefaço então?
  • 33.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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?
  • 34.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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
  • 35.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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 clase 2. extrair para metodo 3. extrair interface 4. aplicar strategy 5. criar factory
  • 37.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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 classe 1. extrair para uma clase 2. extrair para metodo 3. extrair interface 4. aplicar strategy 5. criar factory
  • 38.
    public classe checkProperties{ publicvoid 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
  • 39.
    public classe checkProperties{ publicvoid 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?
  • 40.
    public classe checkProperties{ publicvoid 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
  • 41.
    public classe checkProperties{ publicvoid 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
  • 42.
    public interface Check(){ publicvoid check(); } Extrair interface
  • 43.
    public classe checkProperties{ publicvoid 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
  • 44.
    public classe checkNomeimplements Check{ @Override public void check() { if (this.getName() == null) { throw new Exception("Falta nome do produto."); } } } aplicar strategy
  • 45.
    public classe checkDescritpionimplements Check{ @Override public void check() { if (this.getDescription() == null){ throw new Exception("Falta a descrição do produto."); } } } aplicar strategy
  • 46.
    public classe CheckFactory{ publicstatic Check getInstance(String type) { if (type == "E"){ return new CheckDescription(); }else if (type == "P"){ return new CheckName(); } } aplicar factory
  • 47.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid 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
  • 48.
    public void save() { this.checkProperties(); this.getDatabase().save(this); } privatevoid checkProperties() { CheckFactory.getInstance(this.getTipo()).check(); } e agora
  • 49.
    e agora vod save(); voidchekProperties(); Cliente Check getInstance(); CheckFactory void check(); Check void check(); CheckName void check(); CheckDescription
  • 50.
  • 51.
    1. Código testável 2.Código mais simples 3. Mais fácil evoluir 4. Rápida manutenção vantagens
  • 52.
    1. Maior complexidadenas classes desvantagens
  • 53.