いくつかの異なる機能ファイルに共通の背景を持ちたいと思っているようです。これを行うには、少なくとも 2 つの異なる方法があります。
複合ステップ
これを行う 1 つの方法は、AlSki が提案したもので、他の多くのステップを呼び出す複合ステップを作成します。彼は返信で素晴らしい仕事をしたので、ここでこれを再定義しません。任意の機能の任意のシナリオ (またはバックグラウンド) から、この複合ステップ (多くのステップを呼び出すステップ) を呼び出すことができます。
フックでのタグ フィルタリング
もう 1 つのアプローチは、各シナリオの前にコードを実行するなど、SpecFlow で定義されたフックを使用することです。[BeforeScenario]
タグ フィルタリング (フックのリンクを参照) を使用して、対応するタグをシナリオまたは機能に追加することにより、実行するフックを指定できます。例を挙げて説明しましょう:
Selenium を使用して Web ブラウザーを駆動するシナリオがあるとしますが、すべてのシナリオで Selenium が使用されているわけではありません。必要なシナリオにのみ Selenium をセットアップしたいBeforeScenario
場合は、シナリオにタグがある場合にのみ実行されるフックを作成できます@web
。
ここに私の機能ファイルがありますLoggingIn.feature
:
Feature: Logging In
@web
Scenario: Log In
Given I am on the login page
When I supply valid credentials
Then I should be taken to the homepage
これが私のステップ定義ファイルですStepDefinitions.cs
:
[Binding]
public class StepDefinitions
{
[BeforeScenario("web")]
public static void BeforeWebScenario()
{
// Code to startup selenium
}
[BeforeScenario]
public static void BeforeAllScenarios()
{
// Code that executes before every scenario...regardless of tag.
}
}
@web
タグを持つすべてのシナリオでは、シナリオが実行される前にBeforeAllScenarios()
との両方が実行されます。タグBeforeWebScenario()
がないシナリオでは、メソッドのみが実行されます。@web
BeforeAllScenarios()
このように、シナリオに特定の属性を適用することで、一連のコードを実行することができます。
参考: SpecFlow 1.9 の時点で、複数のフックが指定されている場合、これらのフックが実行される順序を指定することはできません。
いつどちらを使用するのですか?
これは、技術的な問題を設定するか、ビジネス上の問題を設定するかによって異なります。
タグを使用して技術的な問題を設定する
ビジネス ユーザーが意識する必要のないテストの技術的側面を設定したい場合は、タグ アプローチを使用します。良い例は、私が提示したものです... Seleniumのセットアップです。ビジネス ユーザーは、Selenium が何であるかをあまり気にしない可能性があるため、それを設定するシナリオでステップを作成しても意味がありません。
複合ステップを使用してビジネス上の問題を設定する
ビジネス ユーザーが関心を持つシステムの状態 (ログイン ユーザーや既存の製品データなど) を指定する必要がある場合は、シナリオ (またはバックグラウンド) の別のステップにする必要があります。これは、ビジネスの観点から動作を読んで理解するために必要なすべてのステップがステップに含まれている必要があるためです。