Точно сроки RSpe c Характеристики - PullRequest
0 голосов
/ 09 апреля 2020

У меня 2 теста. Один с вызовом базы данных и тот, который использует двойной. Я хотел бы понять разницу в производительности между ними. Я понимаю, что это, вероятно, будет довольно мало, но я просто пытаюсь лучше понять аспект латентности компромисса, когда решаю использовать заглушку или реальный вызов БД.

Первоначально я думал, что это будет так же просто, как запустить что-то вроде

time rspec spec_with_db_spec.rb

и

time rspec spec_with_double_spec.rb

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

  1. Кажется, что time может быть не лучшим способом, так как он может совпасть с особенно дорогим процессом происходит на моем компьютере в то же время. Я полагаю, что запускать его снова и снова может помочь с этим, но я не уверен.
  2. Я понял, что мог бы использовать вывод времени RSpe c, но, основываясь на (хотя и старых) сообщениях, кажется, что это может быть ненадежно.

У кого-нибудь есть идеи для этого? Это не обязательно должно быть идеально, но я мог бы запустить что-нибудь и увидеть разницу и насколько примерно эта разница примерно равна (порядок величины в порядке).

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Вы можете использовать встроенный в Rubys инструмент для тестирования производительности :

require 'rails_helper'
require 'benchmark' # from the stdlib

RSpec.describe 'Benchmark' do
  let(:create_bm) do
    Benchmark.bm { FactoryBot.create_list(:user, 100) } 
  end

  let(:build_bm) do
    Benchmark.bm { FactoryBot.build_list(:user, 100) } 
  end

  it 'can give you the total time' do
    pending "Creating the list took #{create_bm.total} seconds"
  end

  specify 'you do not need two separate spec files' do
    pending "Building the list took #{build_bm.total} seconds"
  end

  specify 'stubbing is faster' do
    expect(build_bm.total).to be < create_bm.total
  end
end
2 голосов
/ 09 апреля 2020

Использование time в тесте rspe c не даст точных результатов. Время будет включать в себя все остальное, что должен делать тест: загрузка Ruby, загрузка гемов и фреймворк rspe c. Это может затормозить время, которое занимает тестируемый код.

Вам нужно будет выполнить тест только один раз, он должен быть запущен много раз, чтобы получить точный результат. А выполнение разных тестов в разных процессах в разное время может означать, что они подвержены различным обстоятельствам на машине. Например, что делать, если он запускается так же, как запускается ваш антивирус?

Вместо этого используйте встроенный модуль Benchmark . Они будут считать только время, затраченное на проверенный код.

...