当前位置: 首页 > 编程语言 > C#

具有相同步骤的Specflow特征文件导致多个浏览器实例开始共享

时间:2023-04-10 19:56:50 C#

Specflow具有相同步骤的特征文件导致多个浏览器实例启动我的C#Specflow测试项目中至少有3个.feature文件,例如:给定我在首页当我第一次在文件Feature1.feature中编写步骤并创建步骤方法时,我将其放在一个步骤文件中,例如Steps1.cs,它继承了用于自初始化FirefoxDriver的基类。我所有的StepsXXXX.cs类都继承自这个基类。然后,我写了Feature2.feature,它也有一个步骤GivenIamattheHomePage。并且这些步骤会自动绑定到Steps1.cs中的Steps1.cs“到现在为止,没问题。这就是我想要的-在整个测试项目中具有可重用的步骤。但问题是,每当我运行具有不同StepsXXXX文件步骤的场景时,我运行各种浏览器实例。======我很确定这是因为我的StepsXXXX(绑定类)都继承自这个基类,它有自己的IWebDriver,当调用该步骤时,其他所有内容(包括前/后场景方法)被调用。但我不知道如何解决这个问题。我仍然想要可重用的步骤。我试图将这些步骤放在基类中,但它没有用。我也考虑过更改绑定,但specflow使用有意义的字符串来完成它,我不想将它们更改为误导性字符串。有没有人偶然发现这个?任何帮助将不胜感激非常感谢。问题是SpecFlow绑定不t尊重继承。所有自定义属性都被认为是全局的,因此所有SpecFlow都使用[Binding]搜索类列表,然后搜索所有[Given]/[When]/[Then]s来构建一个字典,以便它可以评估它们最佳匹配。然后它将创建该类的一个实例(如果它还没有这样做的话)并调用它的方法。所以你的简单案例都留在Steps1类中,因为它是第一个完美匹配。您的更复杂的案例开始实例化更多的类,因此多个浏览器,并且您的重构尝试不会起作用,因为您的抽象基类没有[binding]。我可能会首先将所有步骤类层次结构扁平化为一个大的AllSteps.cs类。这似乎适得其反,但您所做的只是安排代码以查看当前绑定如何影响SpecFlow功能。这样您就可以开始重构不同GWT绑定之间的重叠。目前,您的钻机布置在场景周围。您需要做的是围绕您的功能重构它们。无论如何,谁的领域值得一读?在您开始之前,这可能会给您一些好的想法。然后查看SpecFlow文档中的Sharing-Data-between-Bindings,了解如何在新步骤类之间建立链接。您可以使用[Scope(Tag="mytag",Feature="featuretitle",Scenario="scenariotitle")]引用特定场景或类似场景:Feature:Feature1Scenario:demoGivenI我在主页时......[Binding,Scope(Feature="Feateure1")]publicclassSteps1{[Given(@"GivenIamattheHomePage")]publicvoidGivenIAmAtTheHomePage(){{}}Feature:Feature2场景:demoGivenIamattheHomePageWhen.......[Binding,Scope(Feature="Feature2")]publicclassSteps2{[Given(@"GivenIamattheHomePage")]publicvoidGivenIAmAtTheHomePage(){{}}我面临同样的问题。我想要一个函数文件,它将调用不同cs类中的步骤。当我想为每个场景设置和拆除时,我遇到了这个问题。步骤类构造函数和Dispose()不可能,因为场景使用多个步骤类,我不想在场景中多次“设置”它。对两个步骤类使用[BeforeScenario]和[AfterScenario]也会使跑步者在两个类中运行before和after方法,使其设置运行两次。所以我所做的是创建另一个名为BrowserScenarioSetup的第三类,我在其中放置了前场景和后场景类,为场景设置浏览器并分配给ScenarioContext.Current字典。测试运行时,只为场景创建一个浏览器,我可以使用任何类中定义的场景步骤,但只能使用Scenario.Context.Current来获取浏览器实例。我可以让两个步骤类都有一个基本步骤类,并创建一个简短的方法来获取浏览器实例(或在安装程序中创建的任何共享实例)只是为了隐藏Scenario.Context.Current最后,我可以标记[BeforeScenario("Browser","IE")]并在traits或场景中使用@Browser和@IE,仅在适当的上下文中调用此setter方法。我认为这比问答要简单得多。这里有两个问题:AISki在specflow上下文的文档链接中给出了正确的答案,但它并没有真正作为答案呈现,而且将一个糟糕的答案作为实际答案呈现会分散注意力。您所看到的行为的答案是,您应该按照您设置的方式准确预期会发生什么。如果您有多个创建浏览器实例的绑定类(如果它们都具有创建浏览器实例的公共基础),并且它们在您的函数中有匹配项,那么您应该期望有多个浏览器实例。您想要的答案(个别浏览器在您的步骤中共享)是您应该使用specflow的上下文功能来控制对浏览器实例的依赖性。这相当于依赖注入。您的步骤定义类应该对构建浏览器实例的东西采取构造函数依赖性-specflow为您管理依赖性,您将为您创建的第一个类获得一个新实例,然后是相同的实例。https://github.com/techtalk/SpecFlow/wiki/Sharing-Data-between-Bindings以上是C#学习教程:同样步骤的SpecflowFeature文件导致多个浏览器实例开始共享所有内容,如果你有使用过,需要详细了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: