在我们的应用程序中,我需要打开3个完全相同的文档,对于每个文档,我有一个带有唯一定位器的按钮,因为我们并行执行测试我需要知道哪个文档已经打开并打开另一个未使用的文档,我无法并行打开一个文件。我的方案应该共享已打开的文档的状态以及可供编辑的文档的状态。是否可以在场景之间共享此类数据?
我已经检查了所有可能的内容IObjectContainer
并使用GlobalContainer
创建了var Container = new ContainerBuilder().CreateGlobalContainer();
,但没有任何效果。
更新
已找到解决方案,我们应该将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,并使用可以返回数据和更新数据的数据和方法将您的类传递给此app域,这可以使用yourDomain.SetData("youKey", new yourClass)
,然后在Hooks中你应该获得你的域名(how to get required app domain),然后从域中获取你添加的课程var data = domain.GetData("yourKey")
然后你可以调用你的方法data.YourMethod();
你也应该锁定行在你的方法中使用lock(object) {your code}
来保证线程安全。
答案 0 :(得分:1)
我不确定我是否完全理解这种情况。通常,您可以以两种不同的方式并行运行测试(使用SpecRun别名SpecFlow + Runner),解决方案还取决于您使用的是哪一种。
您可以在appdomain隔离中运行测试线程。在这种情况下,为每个线程创建了一个新的AppDomain。 AppDomains具有隔离内存,因此您无法创建全局&#34;可从所有线程访问的字典。在这种情况下,您必须以其他方式共享状态,例如在temp文件夹中创建空文件。 (您可以根据文档命名文件,例如mydoc1.lock,并检查文件是否存在,相应地创建/删除文件。)
您可以在同一个应用程序域中运行测试。 (这也是你可以用xunit / nunit做的。)在这种情况下,你可以简单地为字典声明一个 static 字段,它将在所有线程中共享。 (当然,你必须保护你的读/写,因为默认情况下Dictionary不是线程安全的。)
答案 1 :(得分:0)
为什么不创建一个通用步骤来打开具有指定ID的文档,如下所示:
[Then(@"User opens document with ID ""(.*)""")]
public void ThenUserOpensTheDocument(string docId)
{
}
然后从Specflow中调用它,如下所示:
User opens document with ID "1234567"
因此,您将从不同的测试场景中调用此步骤3次,每次调用都使用自己的文档ID。