как найти время, необходимое для каждого теста в Rspec - PullRequest
0 голосов
/ 03 декабря 2018

Я использую Rspec в своем проекте, где я хотел бы напечатать время, затрачиваемое каждым тестовым сценарием. Есть ли способ, которым Rspec предоставляет предварительно встроенную функцию?Я могу взять время начала тестового набора на example.execution_result.started_at, но я не знаю, как определить время окончания тестового набора. Если я могу взять время окончания, то я могу вычесть время окончания из времени начала, чтобы получить времяпродолжительность для каждого теста.Есть ли кто-нибудь помочь мне в этом месте?Я написал этот код

around(:each) do |example|
  startTime=Time.now
  var=example.run
  puts var
  endTime=Time.now
  duration=endTime-startTime
  puts "Time Taken->#{duration.to_f/60.to_f}"
end

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

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

RSpec имеет конфигурацию example_status_persistence_file_path, которая создает файл со временем выполнения для каждого отдельного теста.

Например, с учетом следующей конфигурации / примеров RSpec:

require 'rspec/autorun'

# Enable the reporting
RSpec.configure do |c|
  c.example_status_persistence_file_path  = 'some_file.txt'
end

# Run some tests
RSpec.describe 'some thing' do
  it 'does stuff' do
    sleep(3)
  end

  it 'does more stuff' do
    sleep(2)
  end
end

Отчет огенерируется состояние и время выполнения каждого примера:

example_id      | status | run_time     |
--------------- | ------ | ------------ |
my_spec.rb[1:1] | passed | 3.02 seconds |
my_spec.rb[1:2] | passed | 2.01 seconds |
0 голосов
/ 03 декабря 2018

Если вы хотите больше подробностей и / или хотите управлять форматированием, вы можете создать пользовательский форматер.

Например, с учетом следующих характеристик:

RSpec.describe 'some thing' do
  it 'does stuff' do
    sleep(3)
    raise('some error')
  end

  it 'does more stuff' do
    sleep(2)
  end
end

Вывод - Текст

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

class ExampleFormatter < RSpec::Core::Formatters::JsonFormatter
  RSpec::Core::Formatters.register self

  def close(_notification)
    @output_hash[:examples].map do |ex|
      output.puts [ex[:full_description], ex[:status], ex[:run_time], ex[:exception]].join(' | ')
    end
  end
end

RSpec.configure do |c|
  c.formatter = ExampleFormatter
end

Это дает нам:

some thing does stuff | failed | 3.010178 | {:class=>"RuntimeError", :message=>"some error", :backtrace=>["my_spec.rb:21:in `block... (truncated for example)
some thing does more stuff | passed | 2.019578 | 

Выходные данные могут быть изменены для добавления заголовков, лучшего форматирования и т. Д.

Выходные данные - CSV

Форматер может быть изменен для вывода в CSV:

require 'csv'

class ExampleFormatter < RSpec::Core::Formatters::JsonFormatter
  RSpec::Core::Formatters.register self

  def close(_notification)
    with_headers = {write_headers: true, headers: ['Example', 'Status', 'Run Time', 'Exception']}
    CSV.open(output.path, 'w', with_headers) do |csv|
      @output_hash[:examples].map do |ex|
        csv << [ex[:full_description], ex[:status], ex[:run_time], ex[:exception]]
      end
    end
  end
end

RSpec.configure do |c|
  c.add_formatter(ExampleFormatter, 'my_spec_log.csv')
end

Что дает:

Example,Status,Run Time,Exception
some thing does stuff,failed,3.020176,"{:class=>""RuntimeError"", :message=>""some error"", :backtrace=>[""my_spec.rb:25:in `block...(truncated example)"
some thing does more stuff,passed,2.020113,
0 голосов
/ 03 декабря 2018

Каждый пример получает объект ExecutionResult, который имеет метод run_time, поэтому example.execution_result.run_time должен дать вам то, что вы запрашиваете

...