ASP.NET MVC,BDD,Specflow和WatiN:将应用程序置于特定状态

时间:2012-06-01 18:05:45

标签: asp.net-mvc bdd watin specflow

我是BDD,Specflow和WatiN的新手。我想使用这些工具自动化ASP.NET MVC应用程序的验收测试。

我已经想出如何基本上使用这些工具,并且我成功构建了我的第一个验收测试:登录网站。

以下是此测试的小黄瓜:

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

让我感到困惑的是,要让这个测试独立于其他测试,我必须编写代码才能再次登录网站。这是要走的路吗?我怀疑。

我想知道是否有最佳实践可以遵循这样的测试方案。我应该在同一个浏览器上打开浏览器并按特定顺序运行测试吗?或者我应该将MVC应用程序置于特定状态吗?

2 个答案:

答案 0 :(得分:4)

为此,我们有一个特定的Given步骤,在Gherkin中看起来像这样:

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。鉴于auth cookie已加密,我不确定您是否可以这样做。我总是发现让SF在每个场景开始时通过身份验证步骤更容易。

答案 1 :(得分:1)

您可能需要考虑进一步完善您的解决方案。阅读Dan North's Who's Domain is it anyway然后问问自己这两个场景是否真的属于一起。我发现danludwig建议的方法很有价值,但根据域名划分场景更有价值。可以将其视为重构场景。

你仍然可以从另一个场景的活动中构建一个场景,但是问问自己,你真的需要经历相同的步骤,还是会为你的会话提供一个模拟的“已经登录”对象更好。