首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在specflow场景之间共享数据

在specflow场景之间共享数据
EN

Stack Overflow用户
提问于 2017-08-28 09:46:56
回答 2查看 1.1K关注 0票数 0

在我们的应用程序中,我需要打开3个完全相同的文档,对于每个文档,我都有一个带有唯一定位器的按钮,因为我们正在并行执行测试,我需要知道哪个文档已经打开,而另一个文档没有使用,我无法并行打开一个文档。我的方案应该共享已打开的文档和可供编辑的文档的状态。是否有可能在各种情况之间共享这些数据?

我已经检查了所有可能的IObjectContainer,并使用var Container = new ContainerBuilder().CreateGlobalContainer();创建了GlobalContainer,但是什么都不起作用。

更新:

找到了解决方案,我们应该将TestThreadContext传递给钩子构造函数,但只有在使用一个线程时才能工作:

代码语言:javascript
复制
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
    }

如果您想在并行测试场景之间共享数据,您应该创建新的AppDomain in GlobalStep(SpecRun),并使用可以返回数据和更新数据的数据和方法将您的类传递给这个应用程序域,这可以使用yourDomain.SetData("youKey", new yourClass)完成,然后在Hooks中您应该得到域(如何获得所需的应用程序域),从域获得添加的类var data = domain.GetData("yourKey"),然后您可以调用您的方法data.YourMethod();,还应该在方法中锁定行,以便使用lock(object) {your code}实现线程安全。

EN

回答 2

Stack Overflow用户

发布于 2017-09-05 12:28:20

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

  1. 可以在应用程序域隔离状态下运行测试线程。在本例中,为每个线程创建了一个新的AppDomain。AppDomains有独立的内存,所以您不能创建一个可从所有线程访问的“全局”字典。在这种情况下,您必须以某种方式共享状态,比如在temp文件夹中创建空文件。(您可以根据文档命名文件,如mydoc1.lock,并检查文件是否存在,相应地创建/删除文件。)
  2. 您可以在同一应用程序域中运行测试。(这也是xunit/nunit可以做的事情。)在这种情况下,您可以简单地为字典声明一个静态字段,并且它将在所有线程之间共享。(当然,您必须保护您的读写,因为默认情况下,字典并不是线程安全的。)
票数 1
EN

Stack Overflow用户

发布于 2017-08-28 09:59:58

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

代码语言:javascript
复制
[Then(@"User opens document with ID ""(.*)""")]
public void ThenUserOpensTheDocument(string docId)
{
}

然后从Specflow scenarious这样调用它:

代码语言:javascript
复制
User opens document with ID "1234567"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45916123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档