我想提高我的测试速度。
use_transactional_fixtures还是使用database_cleaner宝石?:truncation迁移到:transaction之后,我的800多个示例运行速度快了4倍!use_transactional_fixtures database_cleaner :transaction时,是否应该关闭:transaction?:transaction吗?:transaction时,动态地将策略从:truncation更改为:truncation的最佳实践是什么P.S.mysql,Rails 3,Rspec2,Cucumber
我了解猪肉和测试并使用它们。但它们都是离题的。例如,斯波克在整个套件运行时节省了大约15-20秒,但从:transaction到:truncation的转换大大增加了运行时间,从3.5分钟增加到13.5分钟(相差10分钟)。
发布于 2012-07-20 07:06:55
1.、2. & 4.、 --如果您使用的是use_transactional_fixtures的默认引擎rack_test,则应该使用事务(use_transactional_fixtures或来自database_cleaner gem的事务支持)。正如您注意到的,使用事务要比使用截断策略快得多。但是,当数据库写入可以通过不同的线程(如selenium)时,事务将无法工作。因此,您将需要使用截断(或强制通过一个db线程--另一个选项)。
3.是的,在使用database_cleaner gem时,应该关闭use_transactional_fixtures,因为gem本机支持事务。如果您只需要事务,那么只需要use_transactional_fixtures,并且永远不会加载database_cleaner gem。
5.下面的代码将动态地在:transaction和:truncation之间切换。(用rspec、capybara、rails3进行了测试。)
特性--这将给您提供这两个世界中最好的特性。当您不需要测试javascript时,rack_test的速度和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谢谢乔·利斯指路。
PS:如何在上切换驱动程序
以上解决方案假设您已经知道如何动态切换驱动程序。如果有些人不来这里,下面是如何:
如前所述,让我们假设您通常使用默认的capybara驱动程序rack_test,但是需要使用selenium来测试一些Ajaxy。当您想要使用selenium驱动程序时,分别对Rspec或@javascript使用@javascript或Rspec。例如:
Rspec示例:
describe "something Ajaxy", :js => true do黄瓜例子:
@javascript
Scenario: do something Ajaxy发布于 2011-04-23 19:56:26
由于DBMS不提交更改(因此不会在测试之间重置数据库),使用事务性固定将更快,但正如您所知,它并不总是有效的。
我们已经在测试环境中成功地使用了SQLite内存中的数据库,因此测试运行得非常快,同时也不需要事务固定装置。这个选项也适用于MySQL (使用:options来设置"ENGINE=MEMORY"),但是我从来没有亲自这么做过,如果您搜索,您会发现一些关于所涉及的注意事项的线程。也许值得一看。但是,根据您的测试方法,使用不同的DB引擎可能是不可接受的。
我建议您启用事务性固定装置,并使用DatabaseCleaner gem来选择性地禁用每个示例组的事务性固定。我不能说我试过这个,但既然你没有任何答案,我想任何东西都可能帮你解决问题。
before(:all) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
before(:each) do
DatabaseCleaner.start
end
after(:each) do
DatabaseCleaner.clean
end如果是我,我会将其分解到一个助手中,并将其作为一个单行宏从每个需要关闭事务性固定装置的示例组调用。
似乎真的应该有更好的方法,不过.祝你好运。
发布于 2013-08-15 20:48:50
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这是阿夫迪·格里姆职位关于数据库清洁器和Rspec的文章。本文对代码进行了逐步分析.
https://stackoverflow.com/questions/5378568
复制相似问题