SlideShare une entreprise Scribd logo
1  sur  84
Programação
       Orientada a Testes
          Experiências num ambiente corporativo




Gregório Enrico Linhares de Melo
@gregoriomelo
O que é POT (TDD)?
O que é POT (TDD)?
 Seria mais uma PO*?
O que é POT (TDD)?
 Seria mais uma PO*?

 Seria mais uma teoria com pouca prática?
O que é POT (TDD)?
 Seria mais uma PO*?

 Seria mais uma teoria com pouca prática?

 Alguém usa?
O que é POT (TDD)?
 Seria mais uma PO*?

 Seria mais uma teoria com pouca prática?

 Alguém usa?

 Minha vida vai melhorar?
Situação atual
Situação atual
Situação atual
Situação atual
Situação atual
Situação atual
 Quem nunca virou a noite programando?
Situação atual
 Quem nunca virou a noite programando?

 Quem nunca mudou o código antes de apresentar?
Situação atual
 Quem nunca virou a noite programando?

 Quem nunca mudou o código antes de apresentar?

 Quem nunca ficou com medo nessa hora?
Situação atual
 Quem nunca virou a noite programando?

 Quem nunca mudou o código antes de apresentar?

 Quem nunca ficou com medo nessa hora?
Caos
Caos
 Programação por coincidência
Caos
 Programação por coincidência

 Frameworks antes de funcionalidades
Caos
 Programação por coincidência

 Frameworks antes de funcionalidades

 Analysis Paralysis
Caos
 Programação por coincidência

 Frameworks antes de funcionalidades

 Analysis Paralysis

 Manutenção difícil
Sonho
Sonho
 Fim das coincidências
Sonho
 Fim das coincidências

 Apresentar funcionalidades mais rapidamente
Sonho
 Fim das coincidências

 Apresentar funcionalidades mais rapidamente

 Fim do medo
Sonho
 Fim das coincidências

 Apresentar funcionalidades mais rapidamente

 Fim do medo

 Não usar o debug :)
Sonho
 Fim das coincidências

 Apresentar funcionalidades mais rapidamente

 Fim do medo

 Não usar o debug :)

 Dormir em paz antes da apresentação :))))))))))
De onde vem o TDD?
De onde vem o TDD?




   @KentBeck
De onde vem o TDD?




   @KentBeck
TDD significa:
TDD significa:
 Código autoexplicativo
// if the guess is correct
if ([guess isEqualToString:[correctAnswer convertToDisplayName]]) {


   // make the text color a medium green

   answerLabel.textColor = [UIColor colorWithRed:0.0 green:0.7 blue:0.0 alpha:1.0];



         TDD significa:
    answerLabel.text = @"Correct!"; // set the text in the label

    // get the correct answer from the correct file name

   NSString *correct = [correctAnswer convertToDisplayName];


            Código autoexplicativo
    // loop through each bar

   for (UISegmentedControl *bar in bars) {

   
   bar.enabled = NO; // don't let the user choose another answer

   

   
   // loop through the bar segments

   
   for (int i = 0; i < 3; i++) {

   
   
    // get the segment's title

   
   
    NSString *title = [bar titleForSegmentAtIndex:i];

   
   
    // if this segment does not have the correct choice
             // disable segment

   
   
    if (![title isEqualToString:correct]) [bar setEnabled:NO forSegmentAtIndex:i];

     
 } // end for

   } // end for


   ++numCorrect;


   .

   .

   .
TDD significa:
 Código autoexplicativo

 Código reutilizável
TDD significa:
 Código autoexplicativo

 Código reutilizável

 Saber o que se faz e quando está pronto
TDD significa:
 Código autoexplicativo

 Código reutilizável

 Saber o que se faz e quando está pronto

 Facilidade na integração (colaboração)
TDD significa:
 Segurança no desenvolvimento
TDD significa:
 Segurança no desenvolvimento

 Mitigação de bugs
if   (countAttr != null && countAttr.length() > 0) {



           TDD significa:
     Object countObj = findValue(countAttr);

     if (countObj instanceof Integer) {



               Segurança no desenvolvimento
     
 count = ((Integer)countObj).intValue();
     

    }
 else if (countObj instanceof Float) {


               Mitigação de bugs
     
 count = ((Float)countObj).intValue();

    

    }
 else if (countObj instanceof Long) {


    
 count = ((Long)countObj).intValue();

    

    }
 else if (countObj instanceof Double) {


    
 count = ((Long)countObj).intValue();


    }
}
if   (countAttr != null && countAttr.length() > 0) {



           TDD significa:
     Object countObj = findValue(countAttr);

     if (countObj instanceof Integer) {



               Segurança no desenvolvimento
     
 count = ((Integer)countObj).intValue();
     

    }
 else if (countObj instanceof Float) {


               Mitigação de bugs
     
 count = ((Float)countObj).intValue();

    

    }
 else if (countObj instanceof Long) {


    
 count = ((Long)countObj).intValue();

    

    }
 else if (countObj instanceof Double) {


    
 count = ((Long)countObj).intValue();


    }
}
TDD significa:
 Segurança no desenvolvimento

 Mitigação de bugs

 Arquitetura flexível
TDD significa:
 Segurança no desenvolvimento

 Mitigação de bugs

 Arquitetura flexível
Mitos
Mitos
 Só funciona para equipes pequenas
Mitos
 Só funciona para equipes pequenas

 Só funciona para projetos pequenos
Mitos
 Só funciona para equipes pequenas

 Só funciona para projetos pequenos

 “Não temos tempo para criar testes”
Caso de sucesso
Caso de sucesso
Caso de sucesso - WebCNIS
Caso de sucesso - WebCNIS
 13 pessoas
Caso de sucesso - WebCNIS
 13 pessoas

 2300 pontos de função
Caso de sucesso - WebCNIS
 13 pessoas

 2300 pontos de função

 2 anos
Caso de sucesso - WebCNIS
 13 pessoas

 2300 pontos de função

 2 anos

 Integração com diversos sistemas legados
Caso de sucesso - WebCNIS
 13 pessoas

 2300 pontos de função

 2 anos

 Integração com diversos sistemas legados

 Módulo para outros projetos do CNIS
Caso de sucesso - WebCNIS
Caso de sucesso - WebCNIS
 Documentação compilável
Caso de sucesso - WebCNIS
 Documentação compilável

 Código autoexplicativo
Caso de sucesso - WebCNIS
 Documentação compilável

 Código autoexplicativo

 Integração contínua
Caso de sucesso - WebCNIS
 Documentação compilável

 Código autoexplicativo

 Integração contínua

 Sistema compreensível para novos integrantes
Caso de sucesso - WebCNIS
 Fácil adaptação às mudanças de requisitos
Caso de sucesso - WebCNIS
 Fácil adaptação às mudanças de requisitos

 Fácil adaptação às mudanças de serviços
Caso de sucesso - WebCNIS
 Fácil adaptação às mudanças de requisitos

 Fácil adaptação às mudanças de serviços

 PD baseado nas experiências do WebCNIS
Caso de sucesso - WebCNIS
 Fácil adaptação às mudanças de requisitos

 Fácil adaptação às mudanças de serviços

 PD baseado nas experiências do WebCNIS

 Adoção de TDD por outros projetos
Caso de sucesso - WebCNIS
 Fácil adaptação às mudanças de requisitos

 Fácil adaptação às mudanças de serviços

 PD baseado nas experiências do WebCNIS

 Adoção de TDD por outros projetos

 Tempo de manutenção reduzido
Mitos?
#ComoFaz?
#ComoFaz?
#ComoFaz?
#ComoFaz?

 - Metodologia, + Filosofia
#ComoFaz?

 - Metodologia, + Filosofia

 Testes Unitários + Testes de Integração
#ComoFaz?

 - Metodologia, + Filosofia

 Testes Unitários + Testes de Integração

 Ferramentas (xUnit, RSpec...)
#ComoFaz?

 - Metodologia, + Filosofia

 Testes Unitários + Testes de Integração

 Ferramentas (xUnit, RSpec...) não bastam
#ComoFaz?

 - Metodologia, + Filosofia

 Testes Unitários + Testes de Integração

 Ferramentas (xUnit, RSpec...) não bastam

 Nada é tão simples que não mereça ser testado
#ComoFaz?

 Testes devem ser:

 
 Decisivos,Válidos, Completos,

 
 Repetíveis, Isolados, Automáticos
describe "failure" do



      #ComoFaz?
  before(:each) do
    @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" }
  end

  it "should not create a user" do
    lambda do
      post :create, :user => @attr
    end.should_not change(User, :count)
  end

  it "should have the right title" do
    post :create, :user => @attr
    response.should have_selector("title", :content => "Sign up")
  end

  it "should have the 'new' page" do
    post :create, :user => @attr
    response.should render_template('new')
  end

end
describe "success" do

      before(:each) do
        @attr = { :name => "New User",
                  :email => "user@example.com",
                  :password => "foobar",
                  :password_confirmation => "foobar" }
      end
         #ComoFaz?
      it "should create a user" do
        lambda do
          post :create, :user => @attr
        end.should change(User, :count).by(1)
      end

      it "should redirect to the user show page" do
        post :create, :user => @attr
        response.should redirect_to(user_path(assigns(:user)))
      end

      it "should have a welcome message" do
        post :create, :user => @attr
        flash[:success].should =~ /welcome/i
      end

      it "should sign the user in" do
        post :create, :user => @attr
        controller.should be_signed_in
      end

  end

end
#ComoFaz?
def create
  @user = User.new(params[:user])
  if @user.save
    sign_in @user
    flash[:success] = "Welcome!"
    redirect_to @user
  else
    @title = 'Sign up'
    @user.password = nil
    @user.password_confirmation = nil
    render 'new'
  end
end
#ComoFaz?
#ComoFaz?
#ComoFaz?


        Pratique!
?
Obrigado!
Programação
       Orientada a Testes
          Experiências num ambiente corporativo




Gregório Enrico Linhares de Melo
@gregoriomelo

Contenu connexe

Tendances

DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIsDevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIsJúnior Porfirio
 
Uaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - IntroduçãoUaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - IntroduçãoRogerio Fontes
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimentoDevops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimentoThiago Ferreira
 
9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometemFernando Henriques
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.jsDenis Velrino
 
ASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureGiovanni Bassi
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014Giovanni Bassi
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!Isaac de Souza
 
Developer Experience no Nubank
Developer Experience no NubankDeveloper Experience no Nubank
Developer Experience no NubankLetticia Nicoli
 
Comparando as Hypes - React & Vue
Comparando as Hypes - React & VueComparando as Hypes - React & Vue
Comparando as Hypes - React & VueHerbert Henrique
 
Monitoramento de containers Docker
Monitoramento de containers DockerMonitoramento de containers Docker
Monitoramento de containers DockerJosé Barbosa
 
Integração contínua em PHP com Jenkins
Integração contínua em PHP com JenkinsIntegração contínua em PHP com Jenkins
Integração contínua em PHP com JenkinsGilmar Pupo
 
Jenkins - livre-se da parte chata do Java
Jenkins - livre-se da parte chata do JavaJenkins - livre-se da parte chata do Java
Jenkins - livre-se da parte chata do JavaFernando Boaglio
 
Botando o Jenkins para rodar seus testes
Botando o Jenkins para rodar seus testesBotando o Jenkins para rodar seus testes
Botando o Jenkins para rodar seus testeskinow
 
Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.
Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.
Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.Letticia Nicoli
 
Docker como super comando
Docker como super comandoDocker como super comando
Docker como super comandoRafael Gomes
 

Tendances (20)

DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIsDevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
 
Uaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - IntroduçãoUaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - Introdução
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimentoDevops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
 
9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.js
 
ASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e Azure
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!
 
Developer Experience no Nubank
Developer Experience no NubankDeveloper Experience no Nubank
Developer Experience no Nubank
 
Comparando as Hypes - React & Vue
Comparando as Hypes - React & VueComparando as Hypes - React & Vue
Comparando as Hypes - React & Vue
 
Jenkins
JenkinsJenkins
Jenkins
 
Monitoramento de containers Docker
Monitoramento de containers DockerMonitoramento de containers Docker
Monitoramento de containers Docker
 
Integração contínua em PHP com Jenkins
Integração contínua em PHP com JenkinsIntegração contínua em PHP com Jenkins
Integração contínua em PHP com Jenkins
 
Jenkins - livre-se da parte chata do Java
Jenkins - livre-se da parte chata do JavaJenkins - livre-se da parte chata do Java
Jenkins - livre-se da parte chata do Java
 
Seminário: Delphi
Seminário: DelphiSeminário: Delphi
Seminário: Delphi
 
Botando o Jenkins para rodar seus testes
Botando o Jenkins para rodar seus testesBotando o Jenkins para rodar seus testes
Botando o Jenkins para rodar seus testes
 
Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.
Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.
Mobile DevOps: O caminho do sucesso para desenvolvimento de aplicativos.
 
Docker como super comando
Docker como super comandoDocker como super comando
Docker como super comando
 
Integração Continua - Jenkins
Integração Continua - JenkinsIntegração Continua - Jenkins
Integração Continua - Jenkins
 

En vedette

Entendendo Xamarin.Forms
Entendendo Xamarin.FormsEntendendo Xamarin.Forms
Entendendo Xamarin.FormsLetticia Nicoli
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 
Desenvolvimento Cross-Mobile com Xamarin
Desenvolvimento Cross-Mobile com Xamarin Desenvolvimento Cross-Mobile com Xamarin
Desenvolvimento Cross-Mobile com Xamarin Letticia Nicoli
 
Entendendo Xamarin.Forms V2
Entendendo Xamarin.Forms V2Entendendo Xamarin.Forms V2
Entendendo Xamarin.Forms V2Letticia Nicoli
 

En vedette (6)

Entendendo Xamarin.Forms
Entendendo Xamarin.FormsEntendendo Xamarin.Forms
Entendendo Xamarin.Forms
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
Desenvolvimento Cross-Mobile com Xamarin
Desenvolvimento Cross-Mobile com Xamarin Desenvolvimento Cross-Mobile com Xamarin
Desenvolvimento Cross-Mobile com Xamarin
 
C# 7 em 7 minutos
C# 7 em 7 minutosC# 7 em 7 minutos
C# 7 em 7 minutos
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Entendendo Xamarin.Forms V2
Entendendo Xamarin.Forms V2Entendendo Xamarin.Forms V2
Entendendo Xamarin.Forms V2
 

Similaire à Programação Orientada Testes Experiências

Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoMarcius Brandão
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaGiovanni Bassi
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptLoiane Groner
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
Desenvolvimento orientado a Testes
Desenvolvimento orientado a TestesDesenvolvimento orientado a Testes
Desenvolvimento orientado a TestesDenis Ferrari
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaElaine Naomi
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDDomingos Teruel
 
Encontro Locaweb
Encontro  LocawebEncontro  Locaweb
Encontro LocawebFabio Akita
 
Encontro Locaweb Curitiba
Encontro  Locaweb CuritibaEncontro  Locaweb Curitiba
Encontro Locaweb CuritibaFabio Akita
 

Similaire à Programação Orientada Testes Experiências (20)

Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da Dissertacao
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScript
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Desenvolvimento orientado a Testes
Desenvolvimento orientado a TestesDesenvolvimento orientado a Testes
Desenvolvimento orientado a Testes
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
 
Encontro Locaweb
Encontro  LocawebEncontro  Locaweb
Encontro Locaweb
 
Encontro Locaweb Curitiba
Encontro  Locaweb CuritibaEncontro  Locaweb Curitiba
Encontro Locaweb Curitiba
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Comecando tensorflow
Comecando tensorflowComecando tensorflow
Comecando tensorflow
 

Programação Orientada Testes Experiências

  • 1. Programação Orientada a Testes Experiências num ambiente corporativo Gregório Enrico Linhares de Melo @gregoriomelo
  • 2. O que é POT (TDD)?
  • 3. O que é POT (TDD)? Seria mais uma PO*?
  • 4. O que é POT (TDD)? Seria mais uma PO*? Seria mais uma teoria com pouca prática?
  • 5. O que é POT (TDD)? Seria mais uma PO*? Seria mais uma teoria com pouca prática? Alguém usa?
  • 6. O que é POT (TDD)? Seria mais uma PO*? Seria mais uma teoria com pouca prática? Alguém usa? Minha vida vai melhorar?
  • 12. Situação atual Quem nunca virou a noite programando?
  • 13. Situação atual Quem nunca virou a noite programando? Quem nunca mudou o código antes de apresentar?
  • 14. Situação atual Quem nunca virou a noite programando? Quem nunca mudou o código antes de apresentar? Quem nunca ficou com medo nessa hora?
  • 15. Situação atual Quem nunca virou a noite programando? Quem nunca mudou o código antes de apresentar? Quem nunca ficou com medo nessa hora?
  • 16. Caos
  • 17. Caos Programação por coincidência
  • 18. Caos Programação por coincidência Frameworks antes de funcionalidades
  • 19. Caos Programação por coincidência Frameworks antes de funcionalidades Analysis Paralysis
  • 20. Caos Programação por coincidência Frameworks antes de funcionalidades Analysis Paralysis Manutenção difícil
  • 21. Sonho
  • 22. Sonho Fim das coincidências
  • 23. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente
  • 24. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente Fim do medo
  • 25. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente Fim do medo Não usar o debug :)
  • 26. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente Fim do medo Não usar o debug :) Dormir em paz antes da apresentação :))))))))))
  • 27. De onde vem o TDD?
  • 28. De onde vem o TDD? @KentBeck
  • 29. De onde vem o TDD? @KentBeck
  • 31. TDD significa: Código autoexplicativo
  • 32. // if the guess is correct if ([guess isEqualToString:[correctAnswer convertToDisplayName]]) { // make the text color a medium green answerLabel.textColor = [UIColor colorWithRed:0.0 green:0.7 blue:0.0 alpha:1.0]; TDD significa: answerLabel.text = @"Correct!"; // set the text in the label // get the correct answer from the correct file name NSString *correct = [correctAnswer convertToDisplayName]; Código autoexplicativo // loop through each bar for (UISegmentedControl *bar in bars) { bar.enabled = NO; // don't let the user choose another answer // loop through the bar segments for (int i = 0; i < 3; i++) { // get the segment's title NSString *title = [bar titleForSegmentAtIndex:i]; // if this segment does not have the correct choice // disable segment if (![title isEqualToString:correct]) [bar setEnabled:NO forSegmentAtIndex:i]; } // end for } // end for ++numCorrect; . . .
  • 33. TDD significa: Código autoexplicativo Código reutilizável
  • 34. TDD significa: Código autoexplicativo Código reutilizável Saber o que se faz e quando está pronto
  • 35. TDD significa: Código autoexplicativo Código reutilizável Saber o que se faz e quando está pronto Facilidade na integração (colaboração)
  • 36. TDD significa: Segurança no desenvolvimento
  • 37. TDD significa: Segurança no desenvolvimento Mitigação de bugs
  • 38. if (countAttr != null && countAttr.length() > 0) { TDD significa: Object countObj = findValue(countAttr); if (countObj instanceof Integer) { Segurança no desenvolvimento count = ((Integer)countObj).intValue(); } else if (countObj instanceof Float) { Mitigação de bugs count = ((Float)countObj).intValue(); } else if (countObj instanceof Long) { count = ((Long)countObj).intValue(); } else if (countObj instanceof Double) { count = ((Long)countObj).intValue(); } }
  • 39. if (countAttr != null && countAttr.length() > 0) { TDD significa: Object countObj = findValue(countAttr); if (countObj instanceof Integer) { Segurança no desenvolvimento count = ((Integer)countObj).intValue(); } else if (countObj instanceof Float) { Mitigação de bugs count = ((Float)countObj).intValue(); } else if (countObj instanceof Long) { count = ((Long)countObj).intValue(); } else if (countObj instanceof Double) { count = ((Long)countObj).intValue(); } }
  • 40. TDD significa: Segurança no desenvolvimento Mitigação de bugs Arquitetura flexível
  • 41. TDD significa: Segurança no desenvolvimento Mitigação de bugs Arquitetura flexível
  • 42. Mitos
  • 43. Mitos Só funciona para equipes pequenas
  • 44. Mitos Só funciona para equipes pequenas Só funciona para projetos pequenos
  • 45. Mitos Só funciona para equipes pequenas Só funciona para projetos pequenos “Não temos tempo para criar testes”
  • 48. Caso de sucesso - WebCNIS
  • 49. Caso de sucesso - WebCNIS 13 pessoas
  • 50. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função
  • 51. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função 2 anos
  • 52. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função 2 anos Integração com diversos sistemas legados
  • 53. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função 2 anos Integração com diversos sistemas legados Módulo para outros projetos do CNIS
  • 54. Caso de sucesso - WebCNIS
  • 55. Caso de sucesso - WebCNIS Documentação compilável
  • 56. Caso de sucesso - WebCNIS Documentação compilável Código autoexplicativo
  • 57. Caso de sucesso - WebCNIS Documentação compilável Código autoexplicativo Integração contínua
  • 58. Caso de sucesso - WebCNIS Documentação compilável Código autoexplicativo Integração contínua Sistema compreensível para novos integrantes
  • 59. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos
  • 60. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços
  • 61. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços PD baseado nas experiências do WebCNIS
  • 62. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços PD baseado nas experiências do WebCNIS Adoção de TDD por outros projetos
  • 63. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços PD baseado nas experiências do WebCNIS Adoção de TDD por outros projetos Tempo de manutenção reduzido
  • 68. #ComoFaz? - Metodologia, + Filosofia
  • 69. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração
  • 70. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração Ferramentas (xUnit, RSpec...)
  • 71. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração Ferramentas (xUnit, RSpec...) não bastam
  • 72. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração Ferramentas (xUnit, RSpec...) não bastam Nada é tão simples que não mereça ser testado
  • 73.
  • 74.
  • 75. #ComoFaz? Testes devem ser: Decisivos,Válidos, Completos, Repetíveis, Isolados, Automáticos
  • 76. describe "failure" do #ComoFaz? before(:each) do @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" } end it "should not create a user" do lambda do post :create, :user => @attr end.should_not change(User, :count) end it "should have the right title" do post :create, :user => @attr response.should have_selector("title", :content => "Sign up") end it "should have the 'new' page" do post :create, :user => @attr response.should render_template('new') end end
  • 77. describe "success" do before(:each) do @attr = { :name => "New User", :email => "user@example.com", :password => "foobar", :password_confirmation => "foobar" } end #ComoFaz? it "should create a user" do lambda do post :create, :user => @attr end.should change(User, :count).by(1) end it "should redirect to the user show page" do post :create, :user => @attr response.should redirect_to(user_path(assigns(:user))) end it "should have a welcome message" do post :create, :user => @attr flash[:success].should =~ /welcome/i end it "should sign the user in" do post :create, :user => @attr controller.should be_signed_in end end end
  • 78. #ComoFaz? def create @user = User.new(params[:user]) if @user.save sign_in @user flash[:success] = "Welcome!" redirect_to @user else @title = 'Sign up' @user.password = nil @user.password_confirmation = nil render 'new' end end
  • 81. #ComoFaz? Pratique!
  • 82. ?
  • 84. Programação Orientada a Testes Experiências num ambiente corporativo Gregório Enrico Linhares de Melo @gregoriomelo

Notes de l'éditeur