我在一个功能文件中编写了几个场景。 我使用一个大的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的最佳位置,而不会冒被打开的次数超过必要的次数?
答案 0 :(得分:2)
我认为BeforeScenario
步骤适用于所有场景而不管代码的原因是因为您将Feature1Steps
类置于Feature1
功能范围内。
我做了一些测试 - 如果您从方案中删除了所有标记,那么BeforeScenario
个步骤仍然可以运行。如果您向现有要素添加没有标记的新方案,则相同。
我认为SpecFlow看到你指定了步骤类的范围,这比标记作用域的优先级更高 - 所以它将为BeforeScenario
中的任何场景运行Feature1
步骤。
从[Scope(Feature = "Feature1")]
课程中删除Feature1Steps
属性会根据您选择的标记正确应用特定的BeforeScenario
步骤,但不知道为什么您选择了所有绑定范围对于特定功能,我无法评论是否删除此范围是一个好主意。
虽然将步骤定义与功能和场景结合起来被认为是一种反模式 - 请在Cucumber wiki上阅读更多内容。