Capybara javascript规格消耗太多内存

时间:2017-04-12 14:42:39

标签: ruby-on-rails google-chrome selenium-webdriver capybara circleci

我正在使用CircleCI进行自动化测试构建,利用Capybara在rails中编写功能规范。

问题是,似乎任何时候我们使用js: true标志编写规范,它们会消耗太多内存并导致我们在circleci容器上达到4gb限制。

我在调试版本上启用了SSH,运行了顶级程序,并检查了使用最多内存的内容。它是迄今为止的ruby进程,最终消耗超过3.5GB的内存。这只发生在启用了javascript的规范中。

我想知道是否有人之前已经看过这个或者有任何减少这些规格的内存占用的想法。

我注意到如果我在本地运行整个规范套件,它会为每个功能规范打开一个新的chrome窗口,并且在整个测试运行完成之前永远不会关闭它们。

在本地运行rspec spec --profile 10也会在前10个最慢的规格中显示我们唯一的两个js规格,其中一个是#1最慢,超过10秒。这也是一个相当简短的规范,它记录了某人并点击了几件事。

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"

  config.around(:each, :run_jobs_inline => true) do |example|
    Resque.inline = true
    example.run
    Resque.inline = false
  end

  config.before(:suite) do
    DatabaseCleaner[:active_record].strategy = :transaction
    DatabaseCleaner[:mongo_mapper].strategy = :truncation
    DatabaseCleaner.clean_with :truncation
  end

  config.before(:all) do
    DeferredGarbageCollection.start
  end

  config.after(:all) do
    DeferredGarbageCollection.reconsider
  end


  config.before(:each) do
    DatabaseCleaner.start
    Rails.cache.clear
  end

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

  config.filter_run_excluding :ignore => true

  config.infer_spec_type_from_file_location!
end

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

Capybara.javascript_driver = :chrome

Capybara.register_driver :iphone do |app|
  Capybara::Selenium::Driver.new(app, {browser: :chrome, switches: %w[--user-agent=Mozilla/5.0\ (iPhone;\ CPU\ iPhone\ OS 5_0\ like\ Mac\ OS\ X)\ AppleWebKit/534.46\ (KHTML,\ like\ Gecko)\ Version/5.1 Mobile/9A334 Safari/7534.48.3]})
end

[:iphone, :chrome].each do |capybara_driver|
  Capybara::Screenshot.register_driver(capybara_driver) do |driver, path|
    driver.browser.save_screenshot(path)
  end
end

1 个答案:

答案 0 :(得分:0)

您是否并行运行测试?这意味着,它只是启动应用程序的单独线程,如果您并行运行它,它可以在同一时间创建太多线程并使用太多内存。

https://groups.google.com/forum/#!msg/ruby-capybara/JI6JrirL9gM/R6YiXj4gi_UJ

当然是假设。