【问题标题】:Application Start event SpecFlow应用程序启动事件 SpecFlow
【发布时间】:2020-10-02 22:21:52
【问题描述】:

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

约束 1:该应用程序并非设计为同时登录超过一次登录。也就是说,许多不同的用户可以同时登录,但相同的用户不应该同时登录。所以字典的项目需要一次限制为一个线程。

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

注意 1:我来自 MVC ASP.NET 背景,并且会执行类似于 global.asax App_Start() 方法的操作。

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

Specflow 中有这样的东西吗?

谢谢 德文

2020 年 9 月 24 日更新:

我已经在这个问题上做了更多的工作,并决定使用 Singleton 课程。 Singleton 在第一次被调用之前不会被实例化,然后只会实例化一个实例。

2020 年 9 月 24 日更新 #1:

我发现使用单例模式的一个警告,问题是我们的 Specflow 项目配置为“带有内存隔离的并行执行”,这意味着您不能在线程之间共享状态,这似乎是根据 Specflow 的推荐方式。当我发现我的 Dictionary 有 25 个唯一实例时,我发现了这一点。

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

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

【问题讨论】:

  • 你说你没有,但是有什么理由不能添加依赖/上下文注入吗?如果您需要,我很乐意为您提供样板以帮助您?它可能还需要支持框架的其他领域。 Specflow 在他们的文档docs.specflow.org/projects/specflow/en/latest/Bindings/… 中谈论 bodi 和他们的方法
  • @RichEdwards,网址中缺少连字符,看起来这是正确的:docs.specflow.org/projects/specflow/en/latest/Bindings/…
  • @Renat - 就是这个!复制粘贴错误。很好的收获,感谢朋友的纠正!
  • 您使用的是哪个版本的 SpecFlow? SpecFlow 绝对支持依赖注入。见docs.specflow.org/projects/specflow/en/latest/Bindings/…
  • 依赖注入超出了我现在想要完成的工作范围,但我希望尽快实现它。感谢您的参考。除了直立 DI 之外,有没有其他方法可以在应用程序启动时、测试开始执行之前调用一次代码。

标签: c# selenium specflow selenium-grid


【解决方案1】:

In SpecFlow how can I share data between steps/features? 似乎是重复的,但由于它的年龄和缺乏代码示例,我决定不将此问题标记为重复。


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

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

您只需将 ScenarioContext 对象声明为步骤定义构造函数中的参数(请参阅Context Injection),将其分配给一个字段,然后在您的步骤中使用它。您可以在多个类中执行此操作以共享数据(请参阅Sharing Data between Bindings):

[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 对象线程安全,并启用 parallel execution of SpecFlow tests,这正是您真正追求的。

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2013-07-12
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多