Cucumber-js: 前後の機能のフックとハック

作成日 2017年08月23日  ·  10コメント  ·  ソース: cucumber/cucumber-js

BeforeFeature/AfterFeature機能フックがない理由を理解しています。 テストは理想的には分離する必要があります。 ただし、実用的なパフォーマンス上の理由から、データベースフィクスチャなどを機能ごとに1回セットアップすることが望ましい場合があります。

#614で指定されている回避策は、次の理由で不十分です。

  1. 連続する機能に同じタグがある場合、Afterは呼び出されません。
  2. タグ付けされた機能がビルドの最後のテストであった場合、Afterは呼び出されません。

3.0.0より前では、registerHandler('BeforeFeatures')の最初の引数として渡されたコンテキストを使用して、この機能をハックすることが可能でした。

この機能のPRを受け入れること、または少なくともハッキングを再び可能にするために3.0で同様のコンテキストを提供することについて何か考えはありますか?

最も参考になるコメント

BeforeFeature/AfterFeatureフックの+1
パフォーマンスとテストの分離のバランスをとる必要性に同意します。 フレームワークが現在構築されている方法では、繰り返されるバックグラウンドステップを除いて、単一の機能でシナリオを接続するものはほとんどありません。 場合によっては、バックグラウンドの手順を繰り返したくない場合がありますが、機能の開始時に1回だけ実行し、すべてのシナリオが完了した後でのみ破棄します。

全てのコメント10件

連続する機能に同じタグがある場合、Afterは呼び出されません。

わかりません。 これについて詳しく教えていただけますか? タグが存在するかどうかに固有のAfterフックを作成できます。 その回避策が与えられてから、タグの構文が変更されていることに注意してください。

タグ付けされた機能がビルドの最後のテストであった場合、Afterは呼び出されません。

繰り返しますが、私はこれを理解していません、もっと説明してください。 Afterフックを使用できるはずですが、これが最後のものであるかどうかのコンテキストは失われます。 理想的には、ここで分解を行う必要はありません。


また、シナリオを接続しようとしていますが、これはお勧めできません。 次のいずれかをお勧めします。

  • シナリオを切断します
  • cucumber-jsを複数回実行して、さまざまなサポートファイルをロードし、BeforeAll/AfterAllを使用します

明確にするために、私が言及している回避策は次のとおりです。

this.Before({ tags: ['<strong i="6">@featurehook</strong>'] }, function () {
  // log user in (if needed)
})

this.Before({ tags: ['~<strong i="7">@featurehook</strong>'] }, function () {
  // log user out (if needed)
})

いくつかの機能を検討してください。

<strong i="11">@featurehook</strong>
Feature: feature 1
   Scenario: scenario 1

<strong i="12">@featurehook</strong>
Feature: feature 2
   Scenario: scenario 2

Feature: feature 3
   Scenario: scenario 3

<strong i="13">@featurehook</strong>
Feature: feature 4
   Scenario: scenario 4

上記の順序で実行された場合、機能1と機能2の間でティアダウンは発生しません。機能4の後で、他に一致するテストがないため、分解は発生しません〜 @featurehook (確かにこれはで修正できます)結局)。

私はシナリオを接続しようとはしていません。私にとっては、分離とパフォーマンスの間のトレードオフを自由に決めることができます。

さまざまな構成でテストSMTPサーバーをセットアップするテストの例を見てください。

<strong i="20">@smtpConfig1</strong>
Feature: ....

<strong i="21">@smtpConfig2</strong>
Feature: ....

シナリオを破棄しないことにより、シナリオ間に副作用が生じる可能性がありますが、この場合、純度とパフォーマンスの間のトレードオフは価値がある可能性があります。

申し訳ありませんが、これはサポートされるべきではないと思います。 すべてのシナリオ間および大多数のケースをカバーする単一のシナリオ間で状態を共有する機能があります。 最後のコメント(@featurehookを使用)の例は、とにかくBeforeFeature/AfterFeatureを使用しても解決されません。

BeforeFeature/AfterFeatureフックの+1
パフォーマンスとテストの分離のバランスをとる必要性に同意します。 フレームワークが現在構築されている方法では、繰り返されるバックグラウンドステップを除いて、単一の機能でシナリオを接続するものはほとんどありません。 場合によっては、バックグラウンドの手順を繰り返したくない場合がありますが、機能の開始時に1回だけ実行し、すべてのシナリオが完了した後でのみ破棄します。

私はBrowserstackのようなサービスを使用しているので、操作が非常に遅くて苦痛です(Saucelabsのような他のリモートサーバープロバイダーもそうです)。通常、BeforeFeatureおよびAfterFeatureイベントハンドラーを使用して、セレンセッションと機能ファイルごとのティアダウンをセットアップします。

したがって、ファイルに記載されているその機能に関連するシナリオが一緒に実行され、各シナリオの投稿を新たに開始するために、ブラウザー画面を更新し、テストのためにアプリの状態を更新します。 したがって、ある意味でそれらは分離されており、テストのパフォーマンスにも影響を与えません。

これは、上記のように機能ファイルごとにcucumberjsを実行するよりも、Before/After機能フックを使用できるようにする場合と見なす必要があります。

BeforeFeature/AfterFeatureフックは、キュウリが作られているe2e / uat / bdd/call-it-whatever-you-wantテストに不可欠です。

Cucumberの主要な「競合他社」はこれをサポートしており(JBehave、RobotFrameworkなど)、ハッキングはありません。 これはフレームワークの適切な機能です。

この問題は間違いなくキュウリを使用するためのブロッカーです。

こんにちは...私はこれに関連する問題に直面しています。 私の場合、タグ付けされたBeforeフックとAfterフックを使用して、UIのテストに使用されるデータを作成/削除します。 BeforeフックでAPIエンドポイントにアクセスしてデータを作成し、Afterフックで別のAPIエンドポイントにアクセスして削除します(作成応答で返されたオブジェクトのIDを保存してから、それらのIDで削除ペイロードを作成します)。

問題は、そのデータを使用する(そしてフックをトリガーする)シナリオが最後に実行される場合、afterフックがトリガーされないことです...

これを回避する方法はありますか?

ありがとう

前と後の機能の+1。
私たちのユースケースは次のとおりです。特定のブラウザで、他のブラウザには表示されないバグを見つけました。

次のような機能にタグを付けます。

@ie-8-only
Business Need: IE8 should have limited functionality, but what is displayed, should be displayed correctly

@no-access @ssl-insecurity <strong i="8">@security</strong> @BUG-1876
Scenario: No access
   Given I am on the home page
   When I see that my browser is not supported
   Then I should not be able to access the core site functionality

@formatting-issue <strong i="9">@bugs</strong> @BUG-1210
Scenario: The menu should not be formatted like a staircase
   For the users to be able to navigate to the about us / contact us area of the site, the site navigation should be active
   Given I am on the home page
   When I see the menu
   Then it should be displayed in a line

これにより、ブラウザーを閉じてIEをBeforeFeatureフックで開き、スイートの残りの部分で使用しているブラウザーをAfterFeatureフックで再度開くことができます。 シナリオごとにブラウザを閉じて再度開くと、かなりの時間がかかります。これは、これを使用するのに最適な機能です。

ノート:
ワールドオブジェクトを含む代替手段があることは知っています(現在のブラウザーをそこに設定し、ブラウザーがbeforeAll Hookで必要なものでない場合にのみ閉じる)が、この方法で行う方が簡単なようであり、すでにフックで行われているか、Seleniumが半分の時間でヒッシーフィットをスローすることを決定します。

また、BeforeFeatureフックに追加の説明としてテキストを機能に添付したい場合もあります。これは、これが役立つ別の例です。

フィーチャーフックの前後も、特定のタイプのテストで役立つと思います。 たとえば、.NET用のCucumberライブラリであるSpecflowには、次のものが実装されています。
https://specflow.org/documentation/Hooks/

このスレッドは、閉じられた後、最近のアクティビティがないため、自動的にロックされています。 関連するバグについては、新しい問題を開いてください。

このページは役に立ちましたか?
0 / 5 - 0 評価