Что заставляет Rspec занимать 4 ГБ памяти для запуска 500 спецификаций? - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над приложением, которое имеет более 500 спецификаций, когда я запускаю эти спецификации на своей локальной машине, оно успешно проходит.Но когда эти спецификации работают на CircleCI, процесс прекращается.Я попытался исследовать проблему, отслеживая память на моей локальной машине.Я был удивлен, когда увидел, что процесс ruby ​​занимает более 4 ГБ памяти, и именно это вызывает CircleCI, чтобы убить процесс.

Я не уверен, почему мои спецификации занимают всю эту память.Я уже искал конфигурацию, которая очищает память после каждой спецификации, но безрезультатно.

Вот мои rails_helper.rb

require "mongoid-rspec"

require "spec_helper"
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)
if Rails.env.production?
  abort("The Rails environment is running in production mode!")
end

require "database_cleaner"

require "rspec/rails"

#
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

RSpec.configure do |config|
  config.infer_spec_type_from_file_location!

  # FactoryGirl
  config.include FactoryGirl::Syntax::Methods

  # Render
  config.render_views

  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
  # arbitrary gems may also be filtered via:
  # config.filter_gems_from_backtrace("gem name")
  config.include Mongoid::Matchers, type: :model

  config.include Requests::JSONHelpers, type: :request
  config.include Requests::AuthHelpers, type: :request

  config.include Requests::JSONHelpers, type: :controller
  config.include Requests::AuthHelpers, type: :controller

  config.before(:suite) do
    DatabaseCleaner.orm = "mongoid"
    DatabaseCleaner.strategy = :truncation, { except: %w[roles] }
    DatabaseCleaner.clean_with(:truncation)
    Rails.application.load_seed # loading seeds
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end

  config.after(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.clean
  end
end

И вот мои spec_helper.rb

require "mongoid-rspec"
require "webmock/rspec"
require "pundit/rspec"
require "excon"

WebMock.disable_net_connect!(allow_localhost: true)

RSpec::Matchers.define :match_response_schema do |schema|
  match do
    schema_directory = "#{Dir.pwd}/spec/schemas"
    schema_path = "#{schema_directory}/#{schema}.json"
    JSON::Validator.validate!(schema_path, parsed_json, strict: true)
  end
end
RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups

  config.include Mongoid::Matchers

  config.before(:all) do
    Excon.defaults[:mock] = true
    Excon.stub({}, body: "{}", status: 200)
  end
end

Обновление: после каждого примера я исправил запуск сборщика мусора

в rails_helper.rb

config.after(:each) do |example|
    GC.start
end

Но я надеюсь найти решение лучше, чем это

...