【发布时间】: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}.
【问题讨论】: