应用程序启动事件SpecFlow



我正在处理一个问题,我试图实例化Selenium SpecFlow项目中的共享资源。该资源是一个登录池(Dictionary<Login,DateTime>(。

限制1:应用程序不是设计为同时登录的,一次登录的次数多于一次。也就是说,许多不同的用户可以同时登录,但同一用户不应该同时登录。因此,字典中的项目需要一次限制为一个线程。

约束2:项目上没有依赖项注入,我正在寻找与应用程序状态事件等效的东西。

注1:我来自MVC ASP.NET背景,会做一些类似global.asax App_Start((方法的事情。

注意2:我将从步骤定义访问我的字典以"保留"登录,以及从挂钩访问以"释放"登录。

Specflow里有这样的东西吗?

谢谢Devin

更新9/24/2020:

我在这个问题上又做了一些研究,现在决定上辛格尔顿的课。Singleton在第一次调用之前不会实例化,然后只实例化一个实例。

更新9/24/2020#1:

我发现了使用Singleton模式的一个警告,问题是我们的Specflow项目被配置为"带内存隔离的并行执行",这意味着你不能在线程之间共享状态,根据Specflow,这似乎是推荐的方式。当我发现我的Dictionary<登录,日期时间>。

话虽如此,我不确定即使我真的实现了DI框架,它也不会有同样的问题。

我现在正在寻找其他形式的持久存储,可能会尝试Azure存储表。

  • 参考:辛格尔顿模式-https://csharpindepth.com/articles/singleton

  • 参考:带内存(AppDomain(隔离的Specflow并行执行-https://docs.specflow.org/projects/specflow/en/latest/Execution/Parallel-Execution.html#parallel-内存执行appdomain隔离

在SpecFlow中,如何在步骤/功能之间共享数据?看起来是重复的,但由于它的年龄和缺乏代码示例,我决定不将这个问题标记为重复


约束2:项目上没有依赖项注入,我正在寻找等效于应用程序状态事件的内容。

你说没有依赖注入,但由于你使用的是SpecFlow,你已经有了BoDi依赖注入框架。此外,SpecFlow已经提供了自己的方法,可以以线程安全的方式在步骤之间共享数据:ScenarioContext对象。

您只需要在步骤定义构造函数中将ScenarioContext对象声明为参数(请参见上下文注入(,将其分配给字段,然后在步骤中使用它。您可以在多个类中执行此操作以共享数据(请参阅绑定之间的共享数据(:

[Binding]
public class LoginSteps
{
private readonly ScenarioContext scenario;
public LoginSteps(ScenarioContext scenario)
{
this.scenario = scenario;
}
[Given(@"User is logged in as ""(.*)""")]
public void GivenUserIsLoggedInAs(string username)
{
// log user in
scenario["LoggedInUser"] = username;
}
}
[Binding]
public class SomeOtherStepDefinitionFile
{
private readonly ScenarioContext scenario;
public SomeOtherStepDefinitionFile(ScenarioContext scenario)
{
this.scenario = scenario;
}
[When(@"some other step requiring current user")]
public void WhenSomeOtherStepRequiringCurrentUser()
{
var currentUsername = (string)scenario["LoggedInUser"];
}
}

ScenarioContext对象作为构造函数参数传递,并且为每个测试初始化一个对象。这使ScenarioContext对象线程安全,并允许并行执行SpecFlow测试,这正是您真正追求的。

最新更新