具有相同步骤的Specflow Feature文件导致多个浏览器实例启动

Fra*_*sco 8 c# specflow

我在我的C#Specflow测试项目中至少有3个.feature文件,例如:

Given I am at the Home Page

当我第一次在文件中编写步骤Feateure1.feature并创建步骤方法时,我将它放在一个步骤文件中,比方说Steps1.cs,它继承自初始化a的基类FirefoxDriver.我的所有StepsXXXX.cs类都继承自这个基类.

然后,我写了Feature2.feature,这也有一步Given I am at the Home Page.而且这个步骤是自动绑定的Steps1.cs

"直到现在,没问题.这就是我想要的 - 在整个测试项目中拥有可重复使用的步骤.但问题是,每当我运行一个包含不同StepsXXXX文件步骤的场景时,我就会运行各种浏览器实例.

======

我很确定这是因为我的StepsXXXX(绑定类)都继承自这个具有自己的IWebDriver的基类,并且在调用步骤时,其他所有内容(包括之前/之后的场景方法)都是调用.但我无法弄清楚如何解决这个问题.

我仍然想要可重复使用的步骤.我试图将这些步骤放在基类中,但它不起作用.我也考虑过更改绑定,但是specflow使用有意义的字符串来执行此操作,我不想将它们更改为误导性字符串.

有没有人偶然发现了这个?任何帮助都非常感谢.

Tot*_*eRo 6

您可以使用Scoped bindings using[Scope(Tag = "mytag", Feature = "feature title", Scenario = "scenario title")]引用特定场景或功能,如下所示:

Feature: Feateure1

Scenario: demo
Given I am at the Home Page
When ....

[Binding, Scope(Feature = "Feateure1")]
public class Steps1{

 [Given(@"Given I am at the Home Page")]
 public void GivenIAmAtTheHomePage(){
  {  }
}

Feature: Feateure2

Scenario: demo
Given I am at the Home Page
When ....
...

[Binding,Scope(Feature = "Feateure2")]
public class Steps2{

 [Given(@"Given I am at the Home Page")]
 public void GivenIAmAtTheHomePage(){
 {  }

}
Run Code Online (Sandbox Code Playgroud)


AlS*_*Ski 5

问题是SpecFlow绑定不尊重继承.所有自定义属性都被认为是全局的,因此所有SpecFlow都会搜索带有[Binding]的类列表,然后为所有[Given]/[When]/[Then] s建立一个字典,以便它可以评估它们为了最好的匹配.然后它将创建该类的实例(如果它还没有这样做)并在其上调用该方法.

因此,您的简单案例都保留在Steps1类中,因为它是第一个完美匹配.你的更复杂的情况开始实例化更多的类,因此多个浏览器,你的重构尝试将无法工作,因为你的抽象基类没有[绑定].

我可能首先将所有步骤类层次结构展平为一个大的AllSteps.cs类.这看起来可能适得其反,但您所做的只是安排代码,了解当前绑定对SpecFlow功能的影响.这样您就可以开始重构不同GWT绑定之间的重叠.

目前,您的绑定是围绕场景安排的.您需要做的是围绕您的功能重构它们.无论如何都要阅读谁的域名?在你开始之前,这可能会给你一些好主意.然后查看SpecFlow文档中的Sharing-Data-between-Bindings,了解如何在新的步骤类之间建立链接.