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

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 RubyObjects) 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 RubyObject) 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
  • 15.
  • 16.
    Execução - Cadacaso é diferente. Mas evite bater no Banco de Dados. quinta-feira, 3 de maio de 2012
  • 17.
    Execução - MinhaDica: 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 - Exemplodo 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 - Exemplodo 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.