2

我正在尝试多次(30)次运行一个场景以获得一个很好的统计样本。但是该块只执行一次;每次后续时间都会导致场景被调用而不是执行(尽管它说场景确实在大约 5 毫秒的时间内成功完成)。

Around('@mass_benchmark') do |scenario, block|
  $seconds_taken = "SECONDS TAKEN NOT SET"
  @time_array = []
  30.times do
    before_hook(scenario)
    block.call
    after_hook(scenario)
    @time_array << $seconds_taken
  end
  write_time_array_to_file(@time_array, scenario_name)
end

标签@mass_benchmark 执行这个块,而不是~@mass_benchmark,它只是正常执行场景。before_hook 和 after_hook 方法复制了 Before ('~@mass_benchmark') 和 After ('~@mass_benchmark') 挂钩(实际上只是调用相同的方法)。

变量 $seconds_taken 围绕我正在计时的特定区域设置。我没有安排整个测试,只是其中的一个关键部分;测试的其余部分已经到了这一点,等等,这不是计时部分的一部分,所以我不能只是将计时部分移到这个之外。

问题可能与我在这些方法中所做的事情有关,但据我所知,一切正常(如放置良好的 puts 语句所示)。任何想法表示赞赏!

4

2 回答 2

4

目前 Cucumber 似乎不支持在环绕钩子中调用该块两次。这可以通过以下功能文件来证明:

Feature: This scenario will print a line

  Scenario: Print a line
    When I print a line

和步骤定义:

Around do |scenario, block|
  Kernel.puts "START AROUND, status=#{scenario.status}"
  block.call
  Kernel.puts "BETWEEN CALLS, status=#{scenario.status}"
  block.call
  Kernel.puts "END AROUND, status=#{scenario.status}"
end

When /^I print a line$/ do
  Kernel.puts "IN THE STEP DEFINITION"
end

执行此操作时,Cucumber 将打印:

  Scenario: Print line  # features/test1.feature:3
START AROUND, status=skipped
IN THE STEP DEFINITION
    When I print a line # features/test.rb:9
BETWEEN CALLS, status=passed
    When I print a line # features/test.rb:9
END AROUND, status=passed

显然,由于场景的状态已经“通过”,Cucumber 不会重新执行它,尽管输出格式化程序会接收这些步骤。我还没有找到任何方法来“重置”场景 API 中的状态以让它们重新运行。

周围的钩子还有其他问题,例如,您不能在周围的钩子中将变量设置为世界(就像您可以在钩子之前一样)。有关更多血腥细节,另请参阅 Cucumber 问题52116

于 2012-06-04T05:27:07.120 回答
0

一种可能性可能是保持传入的块原样,并在副本上调用“.call”方法?类似(未经测试):

Around do |scenario, block|
  30.times do
    duplicate = block.dup
    before_hook(scenario)
    duplicate.call
    after_hook(scenario)
  end
end

只要确保不要在块上使用“.clone”,因为克隆会创建一个具有相同 ID 的对象,导致对副本所做的每次更改也会影响原始对象。

于 2018-08-22T13:43:39.263 回答