В нашем приложении мне нужно открыть 3 абсолютно одинаковых документа, для каждого документа у меня есть кнопка с уникальным локатором, так как мы выполняем тесты параллельно мне нужно знать какой документ уже открыт и открыть другой который не используется, я не умеет открывать один документ параллельно. Мои сценарии должны делиться статусом того, какой документ был открыт, а какой доступен для редактирования. Можно ли обмениваться такими данными между сценариями?
Я проверил все, что было возможно IObjectContainer
и было создано GlobalContainer
с помощью var Container = new ContainerBuilder().CreateGlobalContainer();
, но ничего не работает.
ОБНОВЛЕНИЕ:
Решение найдено, нужно передать 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
}
Если вы хотите обмениваться данными между параллельными тестовыми сценариями, вы должны создать новый AppDomain в GlobalStep(SpecRun) и передать этому домену приложения свой класс с данными и методами, которые могут возвращать данные и обновлять данные, это можно сделать с помощью yourDomain.SetData("youKey", new yourClass)
, затем в Hooks вы должны получить свой домен (как получить требуемый домен приложения) и из домена получите свой добавленный класс var data = domain.GetData("yourKey")
, а затем вы можете вызывать свои методы data.YourMethod();
, также вы должны заблокировать строки внутри своих методов, чтобы быть потокобезопасными, используя lock(object) {your code}
.