在Cucumber Around Hook中调用Block多次(Ruby)

我试图运行一个场景几(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是围绕我正在计时的特定区域设置的。 我没有计时整个测试,只是它的一个关键部分; 测试的其余部分到达那一点,这不是定时部分的一部分,所以我不能只是将定时部分移到此外。

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

目前Cucumber似乎不支持在一个钩子中两次调用该块。 这可以通过以下function文件来演示:

 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中的状态,以使它们重新运行。

周围的钩子还有其他问题,例如你不能在周围的钩子中设置变量到世界(就像你可以在钩子之前)。 有关更多血腥细节,另请参阅黄瓜问题52和116 。

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

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

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