2017-08-28 139 views
0

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

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

UPDATE:

解决方案已经发现,我们应该通过TestThreadContext到钩构造,但这只会工作,如果我们将使用一个线程:

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}锁定方法内的线程安全线程安全。

回答

0

为什么不创建具有指定ID这样打开一个文档的一般步骤:

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

,然后从Specflow scenarious这样称呼它:

User opens document with ID "1234567" 

所以你会从不同的测试场景中调用这个步骤3次,每个调用都拥有自己的文件ID。

+0

因为我们无法订购测试场景,所以有时候这个文件会打开两次, ID。 –

1

我不确定自己完全了解情况。通常,您可以通过两种不同的方式并行运行测试(使用SpecRun alias SpecFlow + Runner),解决方案也取决于您使用的是哪一种。

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

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

+0

它可能在域之间共享数据。不过谢谢你的回答:) –