benchmark-rspe c застрял без каких-либо уведомлений - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь проверить распределение памяти. И выберите для этого rspec-benchmark драгоценный камень. Но нашел странное поведение, которое я не понимаю. Чтобы воспроизвести его, мы можем написать spe c следующим образом:

require 'rails_helper'

describe ApplicationsManagement::Export do
  let(:applications_collection) { create_list(:application, 1 ) }

  describe '#call' do
    it 'comsumpts not more 1 MB' do
      i = 0
      expect { applications_collection.each { |app| puts i += 1 } }.to perform_allocation(1_048_576).bytes
    end
  end
end

Когда мы запускаем spe c, нам нужно подождать несколько минут !!

ApplicationsManagement::Export
  #call
1
    comsumpts not more 1 MB (FAILED - 1)

Failures:

  1) ApplicationsManagement::Export#call comsumpts not more 1 MB
     Failure/Error: expect { applications_collection.each { |app| puts i += 1 } }.to perform_allocation(1_048_576).bytes
       expected block to perform allocation of 1048576 bytes, but allocated 10694166 bytes
     # ./spec/services/applications_management/export_spec.rb:16:in `block (3 levels) in <top (required)>'
     # ./spec/rails_helper.rb:55:in `block (3 levels) in <top (required)>'
     # ./spec/rails_helper.rb:54:in `block (2 levels) in <top (required)>'

Finished in 4 minutes 8.5 seconds (files took 21.99 seconds to load)
1 example, 1 failure

Если честно, это был первый раз, когда я вижу результат, потому что я не ждал никогда. В любом случае, это слишком долгое время только для одного приложения, создающего и выделяющего 1 Мб памяти. Что я делаю не так, почему этот spe c работает так долго?

spec / rails_helper.rb

require 'rspec-benchmark'

RSpec.configure do |config|
  config.include RSpec::Benchmark::Matchers
  ...

PS:

rails 4.2.9
rspec (3.5.0)
      rspec-core (~> 3.5.0)
      rspec-expectations (~> 3.5.0)
      rspec-mocks (~> 3.5.0)
    rspec-benchmark (0.5.1)
      benchmark-malloc (~> 0.1.0)
      benchmark-perf (~> 0.5.0)
      benchmark-trend (~> 0.3.0)
      rspec (>= 3.0.0, < 4.0.0)
    rspec-core (3.5.4)
      rspec-support (~> 3.5.0)

Спасибо большое!

1 Ответ

0 голосов
/ 26 февраля 2020

Я обнаружил, что если я передам FactoryBot.create(...) блоку expect, то получу застрявшее поведение. Но если за один ряд до этого я инициализировал объекты. Тогда пример работает как положено.

require 'rails_helper'

describe ApplicationsManagement::Export do
  let(:applications_collection) { create_list(:application, 1) }

  describe '#call' do
    it 'comsumpts not more 1 MB' do
      applications_collection
      i = 0
      expect { applications_collection.each { |app| puts i += 1 } }.to perform_allocation(1_048_576).bytes
    end
  end
end
ApplicationsManagement::Export
  #call
1
    comsumpts not more 1 MB

Finished in 1.17 seconds (files took 21.71 seconds to load)
1 example, 0 failures
...