2011-12-13 6 views
8

Estamos utilizando RSpec en un proyecto de rieles para pruebas unitarias. Me gustaría configurar algunas pruebas de rendimiento en RSpec, pero hacerlo de una manera que no interrumpa las características y accesorios 'regulares'.¿Cómo puedo configurar RSpec para las pruebas de rendimiento 'en el lateral'

Idealmente, podría etiquetar mis especificaciones de rendimiento de una determinada manera, de modo que no se ejecuten por defecto. Luego, cuando especifico ejecutar estas especificaciones explícitamente, cargará un conjunto diferente de dispositivos (tiene sentido hacer pruebas de rendimiento con un conjunto de datos mucho más grande y más 'similar a la producción').

¿Esto es posible? Parece que debería ser.

¿Alguien ha configurado algo como esto? ¿Cómo lo hiciste?

Respuesta

20

me las arreglé para conseguir lo que estaba buscando a través de los siguientes:

# Exclude :performance tagged specs by default 
config.filter_run_excluding :performance => true 

# When we're running a performance test load the test fixures: 
config.before(:all, :performance => true) do 
    # load performance fixtures 
    require 'active_record/fixtures' 
    ActiveRecord::Fixtures.reset_cache 
    ActiveRecord::Fixtures.create_fixtures('spec/perf_fixtures', File.basename("products.yml", '.*')) 
    ActiveRecord::Fixtures.create_fixtures('spec/perf_fixtures', File.basename("ingredients.yml", '.*')) 
end 

# define an rspec helper for takes_less_than 
require 'benchmark' 
RSpec::Matchers.define :take_less_than do |n| 
    chain :seconds do; end 
    match do |block| 
    @elapsed = Benchmark.realtime do 
     block.call 
    end 
    @elapsed <= n 
    end 
end 

# example of a performance test 
describe Api::ProductsController, "API Products controller", :performance do 
    it "should fetch all the products reasonably quickly" do 
    expect do 
     get :index, :format => :json 
    end.to take_less_than(60).seconds 
    end 
end 

Pero estoy de acuerdo con el punto de Marnen que esto no es realmente la mejor idea para las pruebas de rendimiento.

0

Si desea realizar pruebas de rendimiento, ¿por qué no ejecutar New Relic o algo así con una instantánea de los datos de producción? Realmente no necesitas especificaciones diferentes para eso, creo.

+0

Principalmente me preguntaba qué tan factible sería automatizar las pruebas de rendimiento. De modo que un cambio de código que introdujo un impacto negativo significativo en el rendimiento podría "disparar" una prueba que afirmar que una determinada función puede ejecutarse, por ejemplo, en menos de 30 segundos. –

+0

Podrías hacerlo, pero no estoy seguro de cuán útil sería, especialmente porque RSpec es mejor cuando no pruebas las funciones del usuario, y el rendimiento se orienta al usuario. Supongo que podrías usar Cucumber en lugar de RSpec para tus pruebas de rendimiento, pero tiendo a pensar que es mejor dejarlo a New Relic. –

+1

Eso se llama creación de perfiles, no prueba de rendimiento. Las pruebas de rendimiento deben garantizar que una parte del código se ejecute dentro de un período de tiempo deseado, dado un cierto contexto, antes de que el nuevo código entre en producción. – aledalgrande

Cuestiones relacionadas