我可以获取黄瓜每一步的时间戳吗?

时间:2017-01-06 14:50:32

标签: ruby cucumber

在过去的黄瓜中,我似乎记得一个选项,可以让每个步骤完成所需的时间

    And I navigate to a widget with widget form
    #features/step_definitions/common_sd.rb:26
  ### STEP COMPLETED   9.634963s

认为这个功能远离黄瓜,我的工作是为每个感觉笨重的片段添加时间戳功能

 st = Time.now
 ...
 step_end(st)

 def step_end(st)
   puts "### STEP COMPLETED   #{(Time.now - st)}s"
 end

如果我想在每个场景的开头和结尾都使用通用挂钩,我可以使用env.rb,但据我所知,这不是步骤。

我可以制作某种全局步骤包装器,它可以添加时间指标并调用每一步。

有关最优雅方式的任何想法,以便有时间完成一步吗?

1 个答案:

答案 0 :(得分:1)

这是我的功能/ support / env.rb 的复制粘贴。几年前我放弃使用黄瓜,因此我无法提供复杂的答案,因为我几乎忘记了所有事情,但我希望这个片段可能会引导您走向正确的方向:

# encoding: utf-8

require 'bundler/setup'
require 'rspec/expectations'

MAX_SCENARIOS = 10
scenario_times = {}

Around() do |scenario, block|
  start = Time.now
  block.call
  sc = if scenario.respond_to?(:scenario_outline)
         scenario.scenario_outline
       else
         scenario
       end
  t = scenario_times["#{sc.feature.file}::#{scenario.name}"] = Time.now - start
  # puts "### STEP COMPLETED #{t}s"
end

# print top 10 sorted by execution time
at_exit do
  max_scenarios = if scenario_times.size > MAX_SCENARIOS
                    MAX_SCENARIOS
                  else
                    scenario_times.size
                  end

  puts '—'*20 + "  top #{max_scenarios} slowest  " + '—'*20
  sorted_times = scenario_times.sort { |a, b| b[1] <=> a[1] }
  sorted_times[0..max_scenarios - 1].each do |key, value|
    puts "#{value.round(5)}  #{key}"
  end 
end