2

優れた統計サンプルを取得するために、シナリオを数回実行しようとしています。ただし、ブロックは1回だけ実行されます。その後の時間ごとに、シナリオが呼び出されて実行されなくなります(ただし、シナリオは約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 はアラウンド フックでブロックを 2 回呼び出すことをサポートしていないようです。これは、次の機能ファイルで実証できます。

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 に答える