我试图运行一个场景几(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语句所示)。任何想法都表示赞赏!
答案 0 :(得分: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中的状态以重新运行它们。
围绕钩子还有其他问题,例如你不能在周围的钩子中设置变量到世界(就像你可以在钩子之前)。另请参阅黄瓜问题52和116以获取更多详细信息。
答案 1 :(得分:0)
One possibility might be to keep the passed-in block as it is, and call the ".call" method on a duplicate? Something like (untested):
Around do |scenario, block|
30.times do
duplicate = block.dup
before_hook(scenario)
duplicate.call
after_hook(scenario)
end
end
Just make sure not to use ".clone" on the block, since clone will create an object with the same Id, resulting in every change made to the duplicate also affecting the original.