SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
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

Contenu connexe

Plus de SuccesSoft LTDA

Fun driven development com Ruby
Fun driven development com RubyFun driven development com Ruby
Fun driven development com RubySuccesSoft LTDA
 
Desenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoDesenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoSuccesSoft LTDA
 

Plus 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
 

Dernier

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 

Dernier (6)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

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