2017-12-07 51 views
1

複数のシナリオを1つのフィーチャーファイルでプログラミングしています。 私は1つの大きなStepsファイルを使用して、シナリオのステップをコードにバインドしています。c#SpecFlow BeforeScenarioフック

例えば私のフィーチャーファイルは次のようになります。

Feature: Feature1 
    Description of feature1 

@TagA @TagB 
Scenario: Scenario1 
    Given Some form 
    When I press the submit button 
    Then I end up at a page 

@TagA 
Scenario: Scenario2 
    Given Some form 
    When I press cancel 
    Then I should end up at a different page 

そして、私のステップファイルは次のようになります。私のステップのファイルが与えられたいくつかの一般的なを持っている基本クラスから継承し

using System; 
using TechTalk.SpecFlow; 

namespace UpdateServer.AcceptanceTests.StepFiles 
{ 
    [Binding] 
    [Scope(Feature = "Feature1")] 
    public class Feature1Steps : SeleniumTestsBaseClass 
    { 
     [BeforeScenario("TagA")] 
     public void BeforeScenarioTagA() 
     { 
      // prepare some stuff 
     } 

     [BeforeScenario("TagB")] 
     public void BeforeScenarioTagB() 
     { 
      // prepare some other stuff 
     } 

     [Given(@"Some form")] 
     public void GivenSomeForm() 
     { 
      // navigate to form 
     } 

     [When(@"I press the submit button")] 
     public void WhenIPressTheSubmitButton() 
     { 
      // press submit button 
     } 

     [When(@"I press cancel")] 
     public void WhenIPressCancel() 
     { 
      // press cancel button 
     } 

     [Then(@"I end up at a page")] 
     public void ThenIEndUpAtAPage() 
     { 
      // check url 
     } 

     [Then(@"I should end up at a different page")] 
     public void ThenIShouldEndUpAtADifferentPage() 
     { 
      // check url 
     } 
    } 
} 

お知らせ、when、thenバインディング、そしてWebDriverを終了するAfterScenario。

これで、Scenario2を実行すると、TagBのBeforeScenarioも実行されます。 もちろん、私はこの振る舞いを望んでいませんが、なぜSpecFlowはこのコンテキストでTagBコードを実行していますか?そして、それをやめさせるにはどうすればいいですか?

編集

SeleniumTestsBaseClassこの基底クラスのコンストラクタでセレンwebdriverを初期化するために使用されます。これは、すべてのステップクラスが基本クラスから継承するため、スコープがステップクラスに追加された理由です。このスコープ属性を削除すると、1つのテストだけが実行されている場合でも、そこにあるすべてのステップファイルに対してWebDriverが開かれます。

今後の質問:WebDriverを必要以上に開いてしまう危険性なしにWebDriverを初期化するのに最適な場所は何ですか?

+0

なぜステップクラスを「Feature1」にスコープしましたか?もしあなたがそれを削除すると、あなたはScenario2で実行されている 'BeforeScenarioTagA'しか取得できないと思います。しかし、特定の理由でステップクラスをフィーチャに適用したかどうかわからないので、それが有効な答えかどうかわかりません。 –

+1

フィーチャ結合ステップ定義は反パターンbtwです - https://github.com/cucumber/cucumber/wiki/Feature-Coupled-Step-Definitions-%28Antipattern%29 –

答えて

2

の手順が、タグに関係なくすべてのシナリオに適用されている理由は、クラスの範囲がFeature1であるためです。

私はいくつかのテストを行いました。シナリオからすべてのタグを削除すると、BeforeScenarioのステップが実行されます。既存の機能にタグのない新しいシナリオを追加する場合と同じです。

私はSpecFlowがあなたのステップクラスのスコープを指定しているのを見ていると思います。これはタグスコープよりも優先順位が高いため、のステップをFeature1に実行します。あなたのFeature1Stepsクラスから[Scope(Feature = "Feature1")]属性が正しく選択したタグに基づいて特定のBeforeScenarioステップを適用していますが、特定の機能にスコープにすべてのあなたのバインディングを選択した理由を知らなくても、私はこれを削除するかどうかについてはコメントすることはできません削除

スコープは良いアイデアです。

ステップ定義をフィーチャやシナリオに結合する反パターンと考えられますが、Cucumber wikiで詳しく説明しています。

+0

テスト用に使用するすべてのステップファイルは、私のテストを実行するために使用するドライバを初期化する基本クラス。このスコープを削除すると、スコープを持たないすべてのステップファイルが作成され、新しいドライバを作成する独自の基本クラスが作成されます。スコープを使用しないときは、基本的に多くのドライバが開きます。 SeleniumとSpecFlowを一緒に使用する場合、継承は良いアイデアではありません。しかし、私たちは内部的にプログラムしたAPIを作るためにそれを使用します。私は継承を削除することを検討する必要がありますか? – Jeroen

+0

スコープを削除すると、タグリンクの問題 – Jeroen

+1

@ Jeroenがコードの多くを見ることなく修正されました。継承を削除することは残念なことに良い考えであるかどうかについてはコメントできませんでした。少なくとも、私の答えがあなたに有用な方向性を与えることを願っています。 –