2011-12-13 10 views
8

Stiamo utilizzando RSpec in un progetto di rotaie per il test dell'unità. Mi piacerebbe impostare alcuni test delle prestazioni in RSpec, ma farlo in modo tale da non interrompere le funzionalità e i dispositivi "regolari".Come configurare RSpec per i test delle prestazioni 'sul lato'

Idealmente sarei in grado di etichettare le mie specifiche di prestazione in un certo modo in modo che non vengano eseguite di default. Poi, quando specifico di eseguire queste specifiche in modo esplicito, caricherò un set di dispositivi diverso (è logico eseguire test delle prestazioni con un set di dati molto più grande e più simile alla produzione).

È possibile? Sembra che dovrebbe essere.

Qualcuno ha impostato qualcosa di simile? Come hai fatto a riguardo?

risposta

20

sono riuscito ad ottenere quello che stavo cercando tramite il seguente:

# 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 

ma io tendo a essere d'accordo con il punto di Marnen che questo non è davvero la migliore idea per valutare le prestazioni.

0

Se si desidera eseguire test delle prestazioni, perché non eseguire New Relic o qualcosa con un'istantanea dei dati di produzione? Non hai davvero bisogno di specifiche diverse per quello, penso.

+0

Principalmente mi chiedevo quanto sarebbe possibile automatizzare i test delle prestazioni. In modo che un cambio di codice che ha introdotto un impatto negativo significativo sulle prestazioni avrebbe "trip" un test piuttosto che affermare che una determinata funzione può essere eseguita in meno di 30 secondi. –

+0

Si potrebbe fare ciò, ma non sono sicuro di quanto sarebbe praticamente utile, specialmente dal momento che RSpec è il migliore quando non si testano le cose rivolte all'utente, e le prestazioni sono rivolte all'utente. Suppongo che potresti usare Cucumber invece di RSpec per i tuoi test delle prestazioni, ma tendo a pensare che sia meglio lasciarlo a New Relic. –

+1

Questo è definito profiling, non test delle prestazioni. I test delle prestazioni dovrebbero garantire che un pezzo di codice venga eseguito entro un periodo di tempo desiderato, dato un certo contesto, prima che il nuovo codice entri in produzione. – aledalgrande