2011-12-13 22 views
8

Używamy RSpec w projekcie szyn do testowania jednostkowego. Chciałbym skonfigurować testy wydajności w RSpec, ale zrobić to w taki sposób, aby nie zakłócać "normalnych" funkcji i urządzeń.Jak skonfigurować RSpec do testowania wydajności "z boku"

Idealnie byłoby móc oznaczyć moje specyfikacje wydajności w taki sposób, że nie są one domyślnie uruchamiane. Następnie, gdy określę, aby uruchomić te specyfikacje jawnie, załaduje on inny zestaw urządzeń (sensowne jest przeprowadzanie testów wydajności przy znacznie większym i bardziej "produkcyjnym" zestawie danych).

Czy to możliwe? Wygląda na to, że tak powinno być.

Czy ktoś skonfigurował coś takiego? Jak sobie z tym poradziłeś?

Odpowiedz

20

udało mi się dostać to, czego szukałem poprzez następujące:

# 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 

Ale ja raczej się zgadza z punktu Marnen, że nie jest to najlepszy pomysł dla testowania wydajności.

0

Jeśli chcesz przeprowadzić test wydajności, dlaczego nie uruchomić New Relic lub czegoś z migawką danych produkcyjnych? Tak naprawdę nie potrzebuję różnych specyfikacji.

+0

Głównie zastanawiałem się, jak wykonalne byłoby zautomatyzowanie testów wydajności. Tak więc zmiana kodu, która wprowadziła znaczący negatywny wpływ na wydajność, "wyzwoliłaby" test, niż twierdzi, że pewna funkcja może działać w czasie np. Krótszym niż 30 sekund. –

+0

Można to zrobić, ale nie jestem pewien, jak użyteczne byłoby to, zwłaszcza, że ​​RSpec jest najlepszy, gdy nie testuje rzeczy skierowanych do użytkownika, a wydajność jest skierowana do użytkownika. Przypuszczam, że można użyć Cucumber zamiast RSpec do testów wydajnościowych, ale uważam, że najlepiej jest pozostawić to w New Relic. –

+1

To się nazywa profilowanie, a nie testowanie wydajności. Testy wydajności powinny zapewnić, że fragment kodu będzie działał w pożądanym czasie, biorąc pod uwagę pewien kontekst, zanim nowy kod zostanie wprowadzony do produkcji. – aledalgrande

Powiązane problemy