4

UIの自動化に.Netを使用してSpecFlowを使用しています。同じ機能とシナリオを定義しました。私の質問は、シナリオはメインシナリオを実行する前に他のシナリオに依存しているということです。同じ機能ファイルでシナリオとして定義されているすべての依存データが最初に作成されることを確認する必要があるため、それらすべてをバックグラウンドに配置します。では、Feature 1stですでに作成したのと同じシナリオに依存する次の機能を実行する場合、それはすでに作成されているかどうか?したがって、同じことを再度実行する必要はありません。

したがって、シナリオを実行する前に、バックグラウンドシナリオがUIレベルですでに実行/作成/提示されていることを確認する方法はありますか?

4

2 に答える 2

4

いくつかの異なる機能ファイルに共通の背景を持ちたいと思っているようです。これを行うには、少なくとも 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()がないシナリオでは、メソッドのみが実行されます。@webBeforeAllScenarios()

このように、シナリオに特定の属性を適用することで、一連のコードを実行することができます。

参考: SpecFlow 1.9 の時点で、複数のフックが指定されている場合、これらのフックが実行される順序を指定することはできません。

いつどちらを使用するのですか?

これは、技術的な問題を設定するか、ビジネス上の問題を設定するかによって異なります。

タグを使用して技術的な問題を設定する

ビジネス ユーザーが意識する必要のないテストの技術的側面を設定したい場合は、タグ アプローチを使用します。良い例は、私が提示したものです... Seleniumのセットアップです。ビジネス ユーザーは、Selenium が何であるかをあまり気にしない可能性があるため、それを設定するシナリオでステップを作成しても意味がありません。

複合ステップを使用してビジネス上の問題を設定する

ビジネス ユーザーが関心を持つシステムの状態 (ログイン ユーザーや既存の製品データなど) を指定する必要がある場合は、シナリオ (またはバックグラウンド) の別のステップにする必要があります。これは、ビジネスの観点から動作を読んで理解するために必要なすべてのステップがステップに含まれている必要があるためです。

于 2012-11-04T19:53:39.307 に答える
2

バックグラウンドと呼ばれるドメインがあり、UI と呼ばれる別の上位レベルのドメインを導入したいという点で、ここでドメインについて質問していると思います。あなたのアプリケーションについて十分な情報がないので、別の例で説明してみます。

店舗があるとしましょう。在庫管理、朝の開店、釣り銭の提供、夜の閉店など、多くのドメインにわたるシナリオを作成できます。WhenWeFillTheShelves()これはおそらく、 、WhenWeUnlockTheDoor()、などのバインディングがたくさんあることを意味しますWhenWeHaveAChangeInTheTill()

今、私たちは顧客とのやり取りを扱うようになったので、次のように書きたいと思うかもしれません

Given the shop is ready for business

この時点で、私は書きます

[Binding]
public void GivenTheShopIsReadyForBusiness()
{
    WhenWeFillTheShelves();
    WhenWeHaveChangeInTheTill();
    WhenWeUnlockTheDoor();
}

このようにして、下位レベルのより詳細なドメインを再利用して上位レベルのドメイン テストを構築し、すべてが常に正しい状態であることを保証できます。

また、 Dan North の Whose domain is it とにかく読むことをお勧めします

于 2012-10-11T11:15:50.203 に答える