2012-04-19 30 views
2

我試圖運行一個場景幾(30)次,以獲得一個很好的統計樣本。但是該塊只能執行一次;隨後的每個時間都會導致該方案被調用並且不會執行(儘管它表示該方案的成功完成時間約爲5毫秒)。胡蘿蔔周圍的黃瓜調用塊多次(Ruby)

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設置在我正在計時的特定區域周圍。我不是在整個測試的時間,只是其中的關鍵部分;測試的其餘部分已經到了這一點,等等,這不是定時部分的一部分,所以我不能將定時部分移動到這之外。

這個問題可能與我在這些方法中所做的事情有關,但據我所知,一切正常(正如放置的語句所示)。任何想法表示讚賞!

+0

我認爲你可以使用'yield',而不是'block.call'。它也更高效。 – 2012-04-19 21:00:31

+0

投入產量會導致它返回「空測試套件」,即使它不是。這可能是因爲block.call是另一個塊內 – 2012-04-19 21:08:36

+0

你有一個IDE你可以用它來放斷點?我最好的猜測是,在測試之後,你可能沒有重新設置一些值,導致你的測試在每次後續運行中都沒有任何事情要做。 – 2012-04-20 20:21:20

回答

3

目前黃瓜似乎並不支持在掛鉤時兩次調用該塊。

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 

當此執行,黃瓜會打印:

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中的狀態以使它們重新運行。

圍繞鉤子還有其他問題,例如你不能在圍繞鉤子設置變量(比如你可以在鉤子之前)。更多血淋淋的細節,請參閱黃瓜問題52116