2011-03-21 56 views
14

我想提高我的測試速度。Rspec,黃瓜:最佳速度數據庫清潔策略

  1. 我應該使用use_transactional_fixtures或與database_cleaner寶石去?
  2. 哪個database_cleaner策略最好?我注意到,從:truncation遷移到:transaction後,我的800多個示例運行速度提高了4倍!
  3. 我應該關閉use_transactional_fixtures當我使用database_cleaner :transaction
  4. 確實rack_test的最佳策略是:transaction
  5. 什麼是使用硒或akephalos當從:transaction:truncation飛改變戰略的最佳做法是什麼?

P.S. MySQL和Rails 3中,Rspec2,黃瓜

P.P.S.我知道sporkparallel_test並使用它們。但他們是不合時宜的。例如,Spork在整個套件運行中保存約15-20秒,但從:transaction更改爲:truncation將運行時間從3.5分鐘顯着增加到13.5分鐘(差異10分鐘)。

+0

有趣:[燈具v工廠 - 難道我們就不能和平共處?](http://www.metabates.com/2010/08/15/fixtures-v-factories-cant-we-all-只是相處/) – Zabba 2011-03-21 14:02:49

回答

-1

您使用過Spork嗎?它極大地提高了速度。

+1

是的,我使用spork。但是沒有主題。 Spork保存〜15秒。在開始。但改變戰略節省10分鐘。對於我的測試套件... – petRUShka 2011-03-21 17:45:54

4

使用事務燈具會更快,因爲DBMS不提交更改(因此沒有沉重的IO發生重置測試之間的數據庫),但你也知道不會永遠工作。

我們不得不使用SQLite內存數據庫的測試環境,以便運行測試超快的同時使交易燈具了一些成功。這個選項也可用於MySQL(使用:選項來設置「ENGINE = MEMORY」),但我從來沒有親自完成它,如果你搜索,你會發現一些涉及警告的線程。也許值得一瞧。根據您的測試方法,儘管使用不同的數據庫引擎可能是不可接受的。

我建議你啓用事務燈具並使用DatabaseCleaner創業板有選擇地禁用每個實驗組的事務燈具。我不能說我已經試過這個,但既然你沒有任何答案,我認爲任何事情都可能幫助你。

before(:all) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
end 

before(:each) do 
    DatabaseCleaner.start 
end 

after(:each) do 
    DatabaseCleaner.clean 
end 

如果是我,我會把這個因素伸到一個幫手,並調用它從一個需要事務燈具關閉各實驗組一行宏。

看起來好像真的應該有更好的方法,儘管......祝你好運。

+0

這並沒有解決不能用於事務的硒測試。有時你需要截斷和交易。 – 2013-08-15 20:48:36

6

1,2,4,&,你應該使用交易(或者與use_transactional_fixtures或交易從database_cleaner寶石支持),如果您使用的是水豚的默認引擎,rack_test。如您所述,使用事務比使用截斷策略要快得多。但是,當數據庫寫入可以通過不同的線程(與硒一樣),事務將不起作用。所以你需要使用截斷(或者強制所有的東西通過一個數據庫線程 - 另一個選項)。

3。是的,你應該使用database_cleaner寶石時,由於創業板原生支持交易關閉use_transactional_fixtures。如果您只需要事務處理,那麼只需use_transactional_fixtures,而不要加載database_cleaner gem。

5.以下代碼將在運行中在:transaction:truncation之間切換。 (使用RSpec,水豚,Rails3中測試這一點。)

特點這應該給你兩全其美。該速度rack_test當你不需要測試JavaScript的東西和靈活性selenium當你這樣做。

而且這個代碼需要在需要它的情況下再植種子數據(這種方法假定您使用seeds.rb來加載種子數據 - 這是當前公約)。

添加以下代碼spec_helper。

config.use_transactional_fixtures = false 
RSpec.configure do |config| 
    config.before(:suite) do 
    require "#{Rails.root}/db/seeds.rb" 
    end 

    config.before :each do 
    if Capybara.current_driver == :rack_test 
     DatabaseCleaner.strategy = :transaction 
    else 
     DatabaseCleaner.strategy = :truncation 
    end 
    DatabaseCleaner.start 
    end 
    config.after(:each) do 
    if Capybara.current_driver == :rack_test 
     DatabaseCleaner.clean 
    else 
     DatabaseCleaner.clean 
     load "#{Rails.root}/db/seeds.rb" 
    end 
    end 
end 

謝謝Jo Liss指向的方式。

PS:如何切換上飛

上述解決方案假定您已經知道如何切換在飛行駕駛司機。在某些情況下,誰到這裏來不這樣做,方法如下:

如上假設您通常會使用默認的驅動程序水豚rack_test,但需要使用Selenium測試一些東西Ajaxy。當您想要使用硒驅動程序分別使用:js => true@javascript Rspec或黃瓜。例如:

Rspec的例子:

describe "something Ajaxy", :js => true do 

黃瓜例如:

@javascript 
Scenario: do something Ajaxy 
1
RSpec.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

    config.before(:each, :js => true) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

end 

這是來自Avdi Grimm's post有關數據庫清潔器和Rspec的。文章中逐步分析了代碼。

+0

這是一個夢幻般的配置,以平衡傳統單元測試的妥協(其中:交易應該被使用,因爲它的真快)和集成測試(其中:截斷應該用來支持多步/多頁測試) – brycemcd 2014-04-25 14:37:02