5

BDD、Specflow、WatiN は初めてです。これらのツールを使用して、ASP.NET MVC アプリケーションの受け入れテストを自動化したいと考えています。

これらのツールの基本的な使用方法は既に理解しており、最初の受け入れテストを作成することに成功しました: Web サイトにログオンします。

このテストの Gherkin は次のとおりです。

Feature: Log on to the web 
    As a normal user
    I want to log on to the web site

Scenario: Log on
    Given I am not logged in
    And I have entered my name in the username textbox
    And I have entered my password in the password textbox
    When I click on the login button
    Then I should be logged and redirected to home

ここで、他の多くのテストを書きたいと思います。それらはすべて、ユーザーが認証される必要があります。例えば:

Feature: List the products 
    As an authenticated user
    I want to list all the products

Scenario: Get Products
    Given I am authenticated
    And I am on the products page
    When I click the GetProducts button
    Then I should get a list of products

私を悩ませているのは、このテストを他のテストから独立させるには、Web サイトに再度ログオンするためのコードを作成する必要があることです。これは行く方法ですか?私は疑う。

そのようなシナリオをテストするために従うべきベストプラクティスがあるかどうか疑問に思っています. ブラウザーを開いたままにして、同じブラウザーで特定の順序でテストを実行する必要がありますか? それとも、MVC アプリケーションを特定の状態にする必要がありますか?

4

2 に答える 2

4

このために、Gherkinでは次のような特定のGivenステップがあります。

Given I am signed in as user@domain.tld

あなたが述べたように、このステップは基本的に他のステップを再利用してユーザーにサインインします。テストユーザーがデフォルト以外のテストパスワードを持っている場合に備えて、パスワードを取得する「オーバーロード」もあります。

Given I am signed in as user@domain.tld using password "<Password>"

[Binding]
public class SignInSteps
{
    [Given(@"I am signed in as (.*)")]
    public void SignIn(string email)
    {
        SignInWithSpecialPassword(email, "asdfasdf");
    }

    [Given(@"I am signed in as (.*) using password ""(.*)""")]
    public void SignInWithSpecialPassword(string email, string password)
    {
        var nav = new NavigationSteps();
        var button = new ButtonSteps();
        var text = new TextFieldSteps();
        var link = new LinkSteps();

        nav.GoToPage(SignOutPage.TitleText);
        nav.GoToPage(SignInPage.TitleText);
        nav.SeePage(SignInPage.TitleText);
        text.TypeIntoTextField(email, SignInPage.EmailAddressLabel);
        text.TypeIntoTextField(password, SignInPage.PasswordLabel);
        button.ClickLabeledSubmitButton(SignInPage.SubmitButtonLabel);
        nav.SeePage(MyHomePage.TitleText);
        link.SeeLinkWithText("Sign Out");
    }
}

すべてのテストが特定の順序で実行されることを保証できないため、これが最善のアプローチだと思います。

ただし、SpecFlowタグを使用してこれを実行し、そのタグでBeforeScenarioを実行することもできます。これは次のようになります。

Feature: List the products 
    As an authenticated user
    I want to list all the products

@GivenIAmAuthenticated
Scenario: Get Products
    Given I am on the products page
    When I click the GetProducts button
    Then I should get a list of products

[BeforeScenario("GivenIAmAuthenticated")]
public void AuthenticateUser()
{
    // code to sign on the user using Watin, or by reusing step methods
}

... MVCアプリケーションを特定の状態にする必要がありますか?

ユーザーにサインインするとき、特定の状態にする必要があるのはMVCアプリケーションではなく、特定の状態にする必要があるブラウザーです。つまり、認証Cookieを書き込みます。認証Cookieが暗号化されているため、これを実行できるかどうかはわかりません。各シナリオの最初にある認証手順をSFに説明する方が簡単だといつも思っていました。

于 2012-06-01T18:36:14.217 に答える
1

ソリューションをさらに改良することを検討してください。Dan North の Who's Domain is it とにかく読んでから、これら 2 つのシナリオが実際に一緒に属しているかどうかを自問してください。danludwig が提案したアプローチには価値があることがわかりましたが、ドメインに従ってシナリオを分離することにはより多くの価値があります。シナリオのリファクタリングと考えてください。

別のアクティビティから 1 つのシナリオを構築することはできますが、同じ手順を実行する必要があるのか​​、それともモック化された「既にログイン済み」オブジェクトをセッションに提供する方が適切かを自問してください。

于 2012-06-20T15:59:28.603 に答える