首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rspec,Cucumber:最佳速度数据库清理策略

Rspec,Cucumber:最佳速度数据库清理策略
EN

Stack Overflow用户
提问于 2011-03-21 13:54:02
回答 4查看 4.2K关注 0票数 15

我想提高我的测试速度。

  1. 我应该使用use_transactional_fixtures还是使用database_cleaner宝石?
  2. 哪种database_cleaner策略是最好的?我注意到,在从:truncation迁移到:transaction之后,我的800多个示例运行速度快了4倍!
  3. 当我使用use_transactional_fixtures database_cleaner :transaction时,是否应该关闭:transaction
  4. rack_test的最佳策略是:transaction吗?
  5. 在使用selenium或:transaction时,动态地将策略从:truncation更改为:truncation的最佳实践是什么

P.S.mysql,Rails 3,Rspec2,Cucumber

我了解猪肉测试并使用它们。但它们都是离题的。例如,斯波克在整个套件运行时节省了大约15-20秒,但从:transaction:truncation的转换大大增加了运行时间,从3.5分钟增加到13.5分钟(相差10分钟)。

EN

回答 4

Stack Overflow用户

发布于 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中。

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
describe "something Ajaxy", :js => true do

黄瓜例子:

代码语言:javascript
复制
@javascript
Scenario: do something Ajaxy
票数 6
EN

Stack Overflow用户

发布于 2011-04-23 19:56:26

由于DBMS不提交更改(因此不会在测试之间重置数据库),使用事务性固定将更快,但正如您所知,它并不总是有效的。

我们已经在测试环境中成功地使用了SQLite内存中的数据库,因此测试运行得非常快,同时也不需要事务固定装置。这个选项也适用于MySQL (使用:options来设置"ENGINE=MEMORY"),但是我从来没有亲自这么做过,如果您搜索,您会发现一些关于所涉及的注意事项的线程。也许值得一看。但是,根据您的测试方法,使用不同的DB引擎可能是不可接受的。

我建议您启用事务性固定装置,并使用DatabaseCleaner gem来选择性地禁用每个示例组的事务性固定。我不能说我试过这个,但既然你没有任何答案,我想任何东西都可能帮你解决问题。

代码语言:javascript
复制
before(:all) do
  DatabaseCleaner.strategy = :transaction
  DatabaseCleaner.clean_with(:truncation)
end

before(:each) do
  DatabaseCleaner.start
end

after(:each) do
  DatabaseCleaner.clean
end

如果是我,我会将其分解到一个助手中,并将其作为一个单行宏从每个需要关闭事务性固定装置的示例组调用。

似乎真的应该有更好的方法,不过.祝你好运。

票数 5
EN

Stack Overflow用户

发布于 2013-08-15 20:48:50

代码语言:javascript
复制
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的文章。本文对代码进行了逐步分析.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5378568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档