我正在使用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
答案 0 :(得分:0)
您是否并行运行测试?这意味着,它只是启动应用程序的单独线程,如果您并行运行它,它可以在同一时间创建太多线程并使用太多内存。
https://groups.google.com/forum/#!msg/ruby-capybara/JI6JrirL9gM/R6YiXj4gi_UJ
当然是假设。