SlideShare uma empresa Scribd logo
Tomás D’Stefano
                                  Testes Rápidos   @tomas_stefano

quinta-feira, 3 de maio de 2012
Discussão
                                  Boot e Execução




quinta-feira, 3 de maio de 2012
Boot da app




quinta-feira, 3 de maio de 2012
Single Responsability Principle




                          Nunca deve existir mais de uma razão para que uma classe mude.




quinta-feira, 3 de maio de 2012
Gemfile

       gem ‘rails’
       gem ‘airbrake’
       gem ‘cancan’
       gem ‘carrierwave’
       gem ‘devise’
       gem ‘enumerate_it’
       gem ‘foreigner’
       gem ‘omniauth’
       gem ‘pg’
       # ... 21 gems -> Total
quinta-feira, 3 de maio de 2012
PORO(Plain Old Ruby Objects)

       class OmniAuthUser
         def initialize(user)
          @user = user
         end

         def create(omni_auth_data={})
          # ...
         end
       end


quinta-feira, 3 de maio de 2012
PORO(Plain Old Ruby Object)



       require ‘spec_helper’
       describe OmniAuthUser do
         let(:data) { stub(:provider => :facebook, ‘...’) }
         describe ‘#create’ do
           # ...
         end
       end


quinta-feira, 3 de maio de 2012
Necessário?




       ⤷ time rspec spec/spec_helper.rb
       real	 0m8.194s
       user	0m7.802s
       sys	 0m1.391s




quinta-feira, 3 de maio de 2012
1º Solução - Trivial -> Require




       $:.unshift File.expand_path(’../../’, __FILE__)
       require_model :omni_auth_user
       require ‘app/services/cielo’




quinta-feira, 3 de maio de 2012
Tempo da 1º Solução




       ⤷ time rspec spec/unit_test.rb
       real	 0m0.681s
       user	0m0.544s
       sys	 0m0.138s




quinta-feira, 3 de maio de 2012
Desvantagem




                                   require na mão! :




quinta-feira, 3 de maio de 2012
2º Solução - ActiveSupport::Dependencies




quinta-feira, 3 de maio de 2012
2º Solução - ActiveSupport::Dependencies




       require ‘active_support/dependencies’
       %w(app/business app/models).each do |path|
        ActiveSupport::Dependencies.autoload_paths.push(path)
       end




quinta-feira, 3 de maio de 2012
Tempo da 2º Solução




       ⤷ time rspec spec/unit_test.rb
       real	 0m0.476s
       user	0m0.352s
       sys	 0m0.121s




quinta-feira, 3 de maio de 2012
Execução




quinta-feira, 3 de maio de 2012
Execução - Cada caso é diferente. Mas evite bater
                     no Banco de Dados.




quinta-feira, 3 de maio de 2012
Execução - Minha Dica: Se não precisa, não crie
           registros no Banco de Dados. Pense em cada
                               caso.




quinta-feira, 3 de maio de 2012
Execução - Exemplo do Gateway



       class Account < ActiveRecord::Base
        def disable_show_first_steps
          update_attributes!(:show_first_steps => false)
        end
       end




quinta-feira, 3 de maio de 2012
Execução - Exemplo do Gateway



       require ‘model_test’
       describe Account do
         describe ‘#disable_show_first_steps’ do
           it ‘#should disable first steps on database’ do
             subject.stub(:update_attributes!).with(:show_first_steps => false)
             subject.disable_show_first_steps
           end
         end
       end




quinta-feira, 3 de maio de 2012
Testes de Integração


       # encoding: utf-8
       require ‘integration_test’
       describe ‘Interface Accounts’ do
         it ‘should not show first steps if click Dont show first steps again’ do
            sign_in
            visit root_path
            page.should have_content(‘Primeiros Passos ... ... ...’)
            click ‘Não exibir novamente’
            page.should have_content(‘Caso queira ver de novo ... ... ...’)
            page.should_not have_content(‘Primeiros Passos ... ... ...’)
         end
       end


quinta-feira, 3 de maio de 2012
Testes de Integração - Lentos :




quinta-feira, 3 de maio de 2012
Obrigado :)




quinta-feira, 3 de maio de 2012

Mais conteúdo relacionado

Mais de SuccesSoft LTDA

Machinist-caching
Machinist-cachingMachinist-caching
Machinist-caching
SuccesSoft LTDA
 
Fun driven development com Ruby
Fun driven development com RubyFun driven development com Ruby
Fun driven development com Ruby
SuccesSoft LTDA
 
Relational Algebra
Relational AlgebraRelational Algebra
Relational Algebra
SuccesSoft LTDA
 
Infinity test and RVM
Infinity test and RVMInfinity test and RVM
Infinity test and RVM
SuccesSoft LTDA
 
Cucumber and BDD
Cucumber and BDDCucumber and BDD
Cucumber and BDD
SuccesSoft LTDA
 
Desenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoDesenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecção
SuccesSoft LTDA
 

Mais de SuccesSoft LTDA (6)

Machinist-caching
Machinist-cachingMachinist-caching
Machinist-caching
 
Fun driven development com Ruby
Fun driven development com RubyFun driven development com Ruby
Fun driven development com Ruby
 
Relational Algebra
Relational AlgebraRelational Algebra
Relational Algebra
 
Infinity test and RVM
Infinity test and RVMInfinity test and RVM
Infinity test and RVM
 
Cucumber and BDD
Cucumber and BDDCucumber and BDD
Cucumber and BDD
 
Desenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoDesenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecção
 

Último

ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
2m Assessoria
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Gabriel de Mattos Faustino
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 

Último (10)

ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 

Testes Rápidos

  • 1. Tomás D’Stefano Testes Rápidos @tomas_stefano quinta-feira, 3 de maio de 2012
  • 2. Discussão Boot e Execução quinta-feira, 3 de maio de 2012
  • 3. Boot da app quinta-feira, 3 de maio de 2012
  • 4. Single Responsability Principle Nunca deve existir mais de uma razão para que uma classe mude. quinta-feira, 3 de maio de 2012
  • 5. Gemfile gem ‘rails’ gem ‘airbrake’ gem ‘cancan’ gem ‘carrierwave’ gem ‘devise’ gem ‘enumerate_it’ gem ‘foreigner’ gem ‘omniauth’ gem ‘pg’ # ... 21 gems -> Total quinta-feira, 3 de maio de 2012
  • 6. PORO(Plain Old Ruby Objects) class OmniAuthUser def initialize(user) @user = user end def create(omni_auth_data={}) # ... end end quinta-feira, 3 de maio de 2012
  • 7. PORO(Plain Old Ruby Object) require ‘spec_helper’ describe OmniAuthUser do let(:data) { stub(:provider => :facebook, ‘...’) } describe ‘#create’ do # ... end end quinta-feira, 3 de maio de 2012
  • 8. Necessário? ⤷ time rspec spec/spec_helper.rb real 0m8.194s user 0m7.802s sys 0m1.391s quinta-feira, 3 de maio de 2012
  • 9. 1º Solução - Trivial -> Require $:.unshift File.expand_path(’../../’, __FILE__) require_model :omni_auth_user require ‘app/services/cielo’ quinta-feira, 3 de maio de 2012
  • 10. Tempo da 1º Solução ⤷ time rspec spec/unit_test.rb real 0m0.681s user 0m0.544s sys 0m0.138s quinta-feira, 3 de maio de 2012
  • 11. Desvantagem require na mão! : quinta-feira, 3 de maio de 2012
  • 12. 2º Solução - ActiveSupport::Dependencies quinta-feira, 3 de maio de 2012
  • 13. 2º Solução - ActiveSupport::Dependencies require ‘active_support/dependencies’ %w(app/business app/models).each do |path| ActiveSupport::Dependencies.autoload_paths.push(path) end quinta-feira, 3 de maio de 2012
  • 14. Tempo da 2º Solução ⤷ time rspec spec/unit_test.rb real 0m0.476s user 0m0.352s sys 0m0.121s quinta-feira, 3 de maio de 2012
  • 16. Execução - Cada caso é diferente. Mas evite bater no Banco de Dados. quinta-feira, 3 de maio de 2012
  • 17. Execução - Minha Dica: Se não precisa, não crie registros no Banco de Dados. Pense em cada caso. quinta-feira, 3 de maio de 2012
  • 18. Execução - Exemplo do Gateway class Account < ActiveRecord::Base def disable_show_first_steps update_attributes!(:show_first_steps => false) end end quinta-feira, 3 de maio de 2012
  • 19. Execução - Exemplo do Gateway require ‘model_test’ describe Account do describe ‘#disable_show_first_steps’ do it ‘#should disable first steps on database’ do subject.stub(:update_attributes!).with(:show_first_steps => false) subject.disable_show_first_steps end end end quinta-feira, 3 de maio de 2012
  • 20. Testes de Integração # encoding: utf-8 require ‘integration_test’ describe ‘Interface Accounts’ do it ‘should not show first steps if click Dont show first steps again’ do sign_in visit root_path page.should have_content(‘Primeiros Passos ... ... ...’) click ‘Não exibir novamente’ page.should have_content(‘Caso queira ver de novo ... ... ...’) page.should_not have_content(‘Primeiros Passos ... ... ...’) end end quinta-feira, 3 de maio de 2012
  • 21. Testes de Integração - Lentos : quinta-feira, 3 de maio de 2012
  • 22. Obrigado :) quinta-feira, 3 de maio de 2012