フック周辺のキュウリ内の複数回ブロックを呼び出す(Ruby) -- ruby フィールド と cucumber フィールド と hook フィールド 関連 問題

Calling Block multiple times in Cucumber Around Hook (Ruby)


2
vote

問題

日本語

素敵な統計的サンプルを取得するために、シナリオを数回(30)回転させようとしています。ただし、ブロックは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

TAG @ MASS_BENCHMARKは、〜@ mass_benchmarkではなく、このブロックを実行します。これは正常にシナリオを実行するだけです。 play_hookとafter_hookは、前( '〜@ mass_benchmark')と後( '@ mass_benchmark')のフック(実際にも同じ方法を呼び出す)を複製します。

変数$ SECONS_TAKENは、私がタイミングである特定の領域の周囲に設定されています。私はその全体のテストをタイミングではありません。テストの残りの部分は、タイミング部分の一部ではないので、その時点までのようになるので、このタイミング部分をこの外側に移動することはできません。

問題は私がそれらの方法でやっているものであるかもしれませんが、私が言うことができる限りでは、すべてが正常に動作します(適切なputsステートメントで示されるように)。どんなアイデアも評価されています!

英語

I'm trying to run a scenario several (30) times in order to get a nice statistical sample. However the block is only executing once; each subsequent time results in the scenario being called and not executing (although it says that the scenario did successfully complete with a time of around 5 ms).

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 

The tag @mass_benchmark executes this block, as opposed to ~@mass_benchmark, which just executes the scenario normally. The methods before_hook and after_hook replicate the Before ('~@mass_benchmark') and After ('~@mass_benchmark') hooks (which actually just call the same method).

The variable $seconds_taken is set around the specific area for which I am timing. I am not timing the whole test there, just a critical portion of it; the remainder of the test is getting to that point, etc, which is not to be part of the timed portion, so I cannot just move the timing portion outside of this.

The issue may be with something I'm doing in those methods, but as far as I can tell, everything works normally (as indicated by well-placed puts statements). Any ideas are appreciated!

        
     
     

回答リスト

4
 
vote
vote
ベストアンサー
 

現在キュウリは、周囲のフックでブロックを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   

これを実行すると、キュウリが印刷されます:

<事前> <コード> 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

明らかにシナリオのステータスはすでに「渡された」ので、出力フォーマッタはステップを受信しますが、キュウリは再実行されません。シナリオAPIのステータスを「リセット」して再実行するようにする方法が見つかりませんでした。

フックの周囲にも他にも問題があります。たとえば、フックの周囲の変数を世界に設定することはできません(フックの前にできるように)。キュウリの問題も参照してください。 52 と 116 より多くの故郷の詳細は

 

Currently Cucumber does not seem to support calling the block twice in an around hook. This can be demonstrated by the following feature file:

Feature: This scenario will print a line    Scenario: Print a line     When I print a line 

And step definitions:

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 

When this is executed, Cucumber will print:

  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 

Evidently since the status of the scenario is already "passed", Cucumber does not re-execute it, though the output formatter receives the steps. I have not found any way to "reset" the status in the scenario API to get them to be re-run.

There are other problems with around hooks as well, for example you cannot set variables to the World in around hooks (like you can in before hooks). See also Cucumber issues 52 and 116 for more gory details.

 
 
0
 
vote

1つの可能性は、渡されたブロックをそのままに保つことであり、複製で ".call"メソッドを呼び出しますか? (未テスト)のようなもの:

<事前> <コード> Around do |scenario, block| 30.times do duplicate = block.dup before_hook(scenario) duplicate.call after_hook(scenario) end end

ブロック上の「.clone」を使用しないでください.Cloneは同じIDを持つオブジェクトを作成し、元の変更に加えられたすべての変更にも、元のものに影響を与えます。

 

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.

 
 

関連する質問

0  Gerritフックを有効にする方法  ( How to enable gerrit hooks ) 
gerrit 9988777667 を実行しています。 patchset-created を使用しようとしています。ジェリットで。しかし、最初のステップそのもので立ち往生しています。 GERRIT_SITE ディレクトリでGerritが初期化...

3  Git Updateフック:新しいブランチにプッシュされているすべてのファイルを見つける  ( Git update hook finding all files being pushed to a new branch ) 
私は私のチームでいくつかのコーディングスタイルを強制しようとしています。そのため、プッシュされているすべてのファイルをチェックするGit Updateフックを書いた。 しかし、リモコンに存在するブランチには完全に機能しますが、新しいブランチには正しく機能しま...

17  キーボードフックの検出  ( Detecting keyboard hooks ) 
どのプログラムやモジュールがキーボードフックを聴いているかを検出する方法はありますか? SYSINTERNALSによって? ...

2  res.view.jsファイルのためのHookをオーバーライドする方法?  ( How override sails js view hook for res view js file ) 
res.view.jsファイルのsails.jsビューフックをオーバーライドできますか? プロジェクトでこのファイルをカスタマイズしてそれを上書きすることはできますか? どのフォルダで、そしてどの名前? フォルダパスの変換名と詳細に標準のマニュアルを見つける...

21  WindowsでSubversionのためにフックを書くための最良の戦略[閉じた]  ( Best strategy to write hooks for subversion in windows ) 
閉鎖。この質問はもっと焦点を絞ったにする必要があります。現在答えを受け付けていません。 この質問を改善したいですか?この記事の編...

0  WordPressアクションフック  ( Wordpress action hook ) 
私は2つのことに問題があります。 2つのプロセスにカスタムロジックを追加する必要があります。 POSTを挿入した直後(DBが更新されたとき)、およびPOSTを更新した直後の右 - アクションフックを使用する必要があると思いますが、この操作に2つの異なるフッ...

2  テーマ関数を使用してボディタグの直後にコードを挿入します  ( Insert code right after body tag using theme functions ) 
Drupalサイトのページごとのの開始時にコードを追加しようとしています。 複数の<コード> page テンプレートを持っているので、これをプログラムでやりたいです。しかし、成功していません。 私はまだ新しいです、そして、私はフックの山、テーマ機能、そしてそ...

282  PHPアプリケーション用のプラグインを許可するための最良の方法  ( Best way to allow plugins for a php application ) 
PHPで新しいWebアプリケーションを開始し、今回は、プラグインインターフェイスを使用して人々が拡張できるものを作成したいと考えています。 プラグインが特定のイベントに添付できるように、自分のコードに「フック」を書くことにどのようにしてくださいか。 ...

1  VC#でマウスフックを使用してマウスを制御する  ( Take control of mouse using mouse hooks in vc ) 
マウスフックを完全に使用しているすべてのマウスイベントを制御する方法はありますか?アプリケーションを開発しています(vc#exe)、私は以下の要件を満たすために私は次の要件を満たすために:アプリケーションがアクティブなときはいつでも、Windowsカーソルの代...

20  SVNポストコミットフックを使用して、コミットされたファイルのみを更新する  ( Using svn post commit hook to update only files that have been committed ) 
私のWeb開発作業のためのSVNリポジトリを使用しています。リポジトリのチェックアウトを保持している開発サイトのセットアップがあります。 SVNポストコミットフックを設定したので、開発サイトが更新されたリポジトリにコミットが更新されると: <事前> <コード...

0  JavaScript:オブジェクト定義をフックに追加したリセット(フッキング構築)  ( Javascript resetting object definition with hook added hooking construction ) 
JavaScriptにオブジェクトの作成をフックしようとしています。これはメソッドには簡単ですが、コンストラクターではなくAFAIKがあります。現在のライブラリのために機能する必要があるため、オブジェクトを作成する方法を変更することはできません。 とにかく、...

-1  Gerrit Repoサーバー側のフックを設定するための最良の方法  ( Best way to configure gerrit repo server side hooks ) 
デフォルトでは、Gerritには$ SITE_PATH / HOOKSのフックがあります。これは私の場合はインストールフォルダに正しいです。ただし、これはインスタンスごとです。私はいくつかのテストをしました、そしてそれは魅力のように動作します。 私はコール方法...

-1  Cと窓でのフッキング  ( Hooking in c and windows ) 
私はCと一緒にWindowsで基本的なDLLフッティングへのクイックガイドを探していますが、私が見つけることができるすべてのガイドは、C、Windowsではなく、Windowsではありません。 (DLLはWindowsの一部ではなく、サードパーティのプログラム...

1  SVNでCVSスタイルのチェックアウトフックは可能ですか?  ( Are cvs style checkout hooks possible in svn ) 
CVSからSVNに移行しており、わかりやすい場合はSVNにチェックアウトフックがありません。 CVSでは、ポストチェックアウト操作は、モジュールファイル内のモジュールを定義するときに -o オプションを使用して定義されます。この現象はSVNで可能ですか? ...

0  Fake関数では、PIDを見つけます  ( Hook zwterminateprocess in fake function find pid ) 
<事前> <コード> NTSTATUS fakeZwCreateProcess(HANDLE ProcessHandle , NTSTATUS ExitStatus ) { } ProcessHandleは処理するためのハンドル(カーネルハンド...

6  カーネルモードフックで発信者SIDを取得する方法(ウィンドウズ)  ( How do i get the caller sid in kernel mode hook windows ) 
Windowsで機能をフックするドライバを開発しています(一部のアクションをブロックする硬化ドライバ)。問題は、それらのアクションを実行しようとしたユーザーがログに記録したいです。 たとえば、レジ​​ストリの書き込みをフィルタリングするためにzwsetVal...

4  JavaScriptですべての関数呼び出しをフックしますか?  ( Hooking all function calls in javascript ) 
この質問に対する私の直感的な対応は、「これはこの会話を続けることができないほどばかげています。」ただし、 モジュール内のすべてのJavaScript関数呼び出しをフックする方法はありますか? Ajaxコールを実行しなくても、Ajaxコールを実行する場合は、「B...

5  OSによって提供されたDLOPEN()/ DLSYM()のアドレスを取得できる方法  ( How i can get address of dlopen dlsym provided by the os ) 
DLSYM()およびDlopen()SYSCALLSのフックを実装する必要があります。フックから元のDLSYM()を呼び出すために、このSYSCALLのアドレスを取得する必要があります。 SO-Library-Constructor-functionでアドレ...

14  Pre-Commitフックを使用して特定の作者によるGITコミットを停止する  ( Stop a git commit by a specific author using pre commit hook ) 
私の計画は、/ etcの変更を追跡するためにgitを使うことですが、コミュニケーションを行う人にコマンドラインに--authorオプションを追加して、自分自身を作家として指定してください。 だから私は根本的なコミットを根本的なコミットを止めたいと思います。 こ...

0  スタイリングメニューブロックのメニューリンクDrupal 7  ( Styling menu blocks menu links in drupal 7 ) 
私はDrupal 7でブロックをスタイルしようとしています、そして私は非常に苦労していて物事を出しています! メインメニューからすべてのリンクを取得するためにmenu_blockモジュールを使用しました。それは私が各メニューツリーのDIVとしてテーマをテーマに...

4  連携して(Pivot、BenlesStomany)協会でフックを続けてください。  ( Sequelize hooks aftercreate afterupdate in association pivot belongstomany ) 
SeaseLizeをORMとして使用してAPIを構築しています。特定の値が変更されたかどうかを確認するために、コアロジックにいくつかの「リスナー」を組み込んでください。 私の主な関心事ATMの1つは、顧客とユーザーの間のピボットテーブルです。 (所属の店)...

1  C#Windowsエクスプローラフォルダにフックイベントを変更しました  ( C sharp hook into windows explorer folder changed event ) 
私は、運行のために、Windowsエクスプローラフォルダ変更イベントにフックする方法があるかどうかを確認しました。 私がそれを望んでいること:私のエクスプローラを閲覧している場合(Windows 7)フォルダが変更された後に特定のコードセット(キーコンボ送信)...

1  フックフィルタ機能でのWindowsメッセージのフィルタリング  ( Filtering windows messages in a hook filter function ) 
私はWindowsフックを使って別のアプリケーションのメッセージを取得しようとしています。 SetWindowshookexとHookをwh_getmessageフックを設定しました。これはDLLを介して行われます。 My GetMSGPROC関数(ターゲット...

4  Emacsテキストモードのマージンの変更  ( Changing margin for emacs text mode ) 
私が熟練している唯一の方法は、面白いことがなくても私の好みに興味を与えていないことがわかっています。 <事前> <コード> (add-hook 'window-configuration-change-hook (lambda () ...

2  Windowsエクスプローラのウィンドウをサブクラス化する方法  ( How to subclass windows explorers window ) 
このようなexplorer.exeのListViewの色を変更したいです getTopWindow関数とその家族によってListViewウィンドウのハンドルを手に入れました。 Explorer.exeのListViewウィンドウに、次のコードで...

関連する質問

0  Gerritフックを有効にする方法 
3  Git Updateフック:新しいブランチにプッシュされているすべてのファイルを見つける 
17  キーボードフックの検出 
2  res.view.jsファイルのためのHookをオーバーライドする方法? 
21  WindowsでSubversionのためにフックを書くための最良の戦略[閉じた] 
0  WordPressアクションフック 
2  テーマ関数を使用してボディタグの直後にコードを挿入します 
282  PHPアプリケーション用のプラグインを許可するための最良の方法 
1  VC#でマウスフックを使用してマウスを制御する 
20  SVNポストコミットフックを使用して、コミットされたファイルのみを更新する 
0  JavaScript:オブジェクト定義をフックに追加したリセット(フッキング構築) 
-1  Gerrit Repoサーバー側のフックを設定するための最良の方法 
-1  Cと窓でのフッキング 
1  SVNでCVSスタイルのチェックアウトフックは可能ですか? 
0  Fake関数では、PIDを見つけます 
6  カーネルモードフックで発信者SIDを取得する方法(ウィンドウズ) 
4  JavaScriptですべての関数呼び出しをフックしますか? 
5  OSによって提供されたDLOPEN()/ DLSYM()のアドレスを取得できる方法 
14  Pre-Commitフックを使用して特定の作者によるGITコミットを停止する 
0  スタイリングメニューブロックのメニューリンクDrupal 7 
4  連携して(Pivot、BenlesStomany)協会でフックを続けてください。 
1  C#Windowsエクスプローラフォルダにフックイベントを変更しました 
1  フックフィルタ機能でのWindowsメッセージのフィルタリング 
4  Emacsテキストモードのマージンの変更 
2  Windowsエクスプローラのウィンドウをサブクラス化する方法