2011-12-13 11 views
8

Chúng tôi đang sử dụng RSpec trong một dự án đường ray để thử nghiệm đơn vị. Tôi muốn thiết lập một số kiểm tra hiệu năng trong RSpec, nhưng làm theo cách không làm gián đoạn các tính năng và đồ đạc 'thông thường'.Làm cách nào tôi có thể thiết lập RSpec để kiểm tra hiệu suất 'ở bên cạnh'

Lý tưởng nhất là tôi có thể gắn thẻ thông số hiệu suất của mình theo một cách nhất định sao cho chúng không chạy theo mặc định. Sau đó, khi tôi chỉ định chạy các thông số này một cách rõ ràng, nó sẽ tải một bộ đồ đạc khác nhau (nó có ý nghĩa để thực hiện kiểm tra hiệu suất với bộ dữ liệu lớn hơn và nhiều hơn 'sản xuất giống').

Điều này có khả thi không? Nó có vẻ như nó nên được.

Có ai đã thiết lập một cái gì đó như thế này không? bạn thây no thê nao?

Trả lời

20

tôi quản lý để có được những gì tôi đang tìm kiếm thông qua như sau:

# 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 

Nhưng tôi có xu hướng đồng ý với quan điểm của Marnen rằng điều này không thực sự là ý tưởng tốt nhất để thử nghiệm hiệu suất.

0

Nếu bạn muốn thực hiện kiểm tra hiệu suất, tại sao không chạy Relic mới hoặc thứ gì đó với ảnh chụp nhanh dữ liệu sản xuất? Bạn không thực sự cần các thông số kỹ thuật khác nhau cho điều đó, tôi nghĩ vậy.

+0

Chủ yếu là tôi đã tự hỏi làm thế nào khả thi nó sẽ là để tự động hóa thử nghiệm hiệu suất. Vì vậy, một thay đổi mã mà giới thiệu một tác động tiêu cực đáng kể hiệu suất sẽ 'chuyến đi' một thử nghiệm hơn khẳng định rằng một chức năng nhất định có thể chạy trong ví dụ ít hơn 30 giây. –

+0

Bạn có thể làm điều đó, nhưng tôi không chắc chắn nó sẽ hữu ích như thế nào, đặc biệt là vì RSpec là tốt nhất khi không thử nghiệm các công cụ hướng tới người dùng và hiệu suất là đối tượng người dùng. Tôi cho rằng bạn có thể sử dụng Cucumber thay vì RSpec để kiểm tra hiệu suất của bạn, nhưng tôi có xu hướng nghĩ rằng điều này là tốt nhất còn lại để New Relic. –

+1

Điều đó được gọi là lược tả, không phải là thử nghiệm hiệu suất. Thử nghiệm hiệu suất phải đảm bảo rằng một đoạn mã chạy trong một khoảng thời gian mong muốn, được đưa ra một ngữ cảnh nhất định, trước khi mã mới đi vào sản xuất. – aledalgrande