【问题标题】:Share data between specflow scenarios在 specflow 场景之间共享数据
【发布时间】:2017-09-05 20:28:20
【问题描述】:

在我们的应用程序中,我需要打开 3 个完全相同的文档,对于每个文档,我都有一个带有唯一定位器的按钮,因为我们正在并行执行测试,我需要知道哪个文档已经打开并打开另一个未使用的文档,我无法同时打开一个文档。我的场景应该共享哪些文档已打开以及哪些可用于编辑的状态。是否可以在场景之间共享此类数据?

我已经检查了所有可能的IObjectContainer 并使用var Container = new ContainerBuilder().CreateGlobalContainer(); 创建GlobalContainer,但没有任何效果。

更新:

已经找到解决方案,我们应该将 TestThreadContext 传递给 hooks 构造函数,但这只有在我们使用一个线程时才有效:

private readonly TestThreadContext _context;

private Hooks(ScenarioContext scenarioContext, TestThreadContext context)
    {
        ScenarioContext = scenarioContext;
        _context = context;
        if (!_context.TestThreadContainer.IsRegistered<Dictionary<int, bool>>("myObject"))
            _context.TestThreadContainer.RegisterInstanceAs(MyDictionary, "myObject"); // you can register any object not only dictionary.
    }

    [BeforeScenario]
    private void BeforeScenario()
    {
        var myDictionary = _context.TestThreadContainer.Resolve<Dictionary<int, bool>>("myObject"); // to get your dictionary back from container
    }

如果您想在并行测试场景之间共享数据,您应该在 GlobalStep(SpecRun) 中创建新的 AppDomain 并将您的类与可以返回数据和更新数据的数据和方法一起传递给这个应用程序域,这可以使用yourDomain.SetData("youKey", new yourClass),然后在 Hooks 中你应该得到你的域 (how to get required app domain) 并从域中得到你添加的类 var data = domain.GetData("yourKey") 然后你可以调用你的方法 data.YourMethod(); 也你应该锁定你的方法中的行以使用线程安全lock(object) {your code}.

【问题讨论】:

    标签: c# .net specflow specrun


    【解决方案1】:

    我不确定我是否完全理解这种情况。通常,您可以通过两种不同的方式并行运行测试(使用 SpecRun 别名 SpecFlow+ Runner),解决方案还取决于您使用哪一种。

    1. 您可以在 appdomain 隔离中运行测试线程。在这种情况下,为每个线程创建了一个新的 AppDomain。 AppDomain 具有独立的内存,因此您无法创建可从所有线程访问的“全局”字典。在这种情况下,您必须以其他方式共享状态,例如在临时文件夹中创建空文件。 (您可以根据您的文档命名您的文件,例如 mydoc1.lock,并检查该文件是否存在,相应地创建/删除该文件。)

    2. 您可以在同一个应用程序域中运行测试。 (这也是您可以使用 xunit/nunit 执行的操作。)在这种情况下,您可以简单地为字典声明一个 static 字段,它将在所有线程之间共享。 (当然,你必须保护你的读/写,因为字典默认不是线程安全的。)

    【讨论】:

    • 可以在域之间共享数据。不过还是谢谢你的回答:)
    【解决方案2】:

    为什么不创建一个通用步骤来打开具有指定 ID 的文档,如下所示:

    [Then(@"User opens document with ID ""(.*)""")]
    public void ThenUserOpensTheDocument(string docId)
    {
    }
    

    然后像这样从 Specflow 场景中调用它:

    User opens document with ID "1234567"
    

    因此,您将从不同的测试场景调用此步骤 3 次,每次调用都有自己的文档 ID。

    【讨论】:

    • 因为我们无法订购测试场景,所以有时这个文档会被打开两次,id相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多