c#SpecFlow BeforeScenario挂钩

时间:2017-12-07 10:07:06

标签: c# testing automated-tests hook specflow

我在一个功能文件中编写了几个场景。 我使用一个大的Steps文件将Scenario步骤绑定到代码。

例如,我的Feature文件如下所示:

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

我的Step文件如下所示:

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
        }
    }
}

请注意,我的步骤文件继承自一个基类,该基类具有一般的给定时间,然后是绑定和一个关闭webdriver的AfterScenario。

现在,当我运行Scenario2时,它也将执行TagB的BeforeScenario。 当然,我不想要这种行为,为什么SpecFlow仍然在这种情况下执行TagB代码?我怎么能阻止它这样做呢?

修改

SeleniumTestsBaseClass用于在此基类的构造函数中初始化Selenium WebDriver。这就是为什么将Scope添加到steps类中的原因,因为我的所有步骤类都继承自基类。删除此Scope属性会导致为每个步骤文件打开WebDriver,即使只运行一个测试也是如此。

跟进问题:什么是初始化我的WebDriver的最佳位置,而不会冒被打开的次数超过必要的次数?

1 个答案:

答案 0 :(得分:2)

我认为BeforeScenario步骤适用于所有场景而不管代码的原因是因为您将Feature1Steps类置于Feature1功能范围内。

我做了一些测试 - 如果您从方案中删除了所有标记,那么BeforeScenario个步骤仍然可以运行。如果您向现有要素添加没有标记的新方案,则相同。

我认为SpecFlow看到你指定了步骤类的范围,这比标记作用域的优先级更高 - 所以它将为BeforeScenario中的任何场景运行Feature1步骤。

[Scope(Feature = "Feature1")]课程中删除Feature1Steps属性会根据您选择的标记正确应用特定的BeforeScenario步骤,但不知道为什么您选择了所有绑定范围对于特定功能,我无法评论是否删除此范围是一个好主意。

虽然将步骤定义与功能和场景结合起来被认为是一种反模式 - 请在Cucumber wiki上阅读更多内容。