Я реализовал тестовую среду с использованием NUnit с ParallelScope.Children на дочернем уровне без проблем. Я создал вложенный класс в textFixture, чтобы каждый [Test] имел свою собственную область видимости и не перекрывал друг друга.
Теперь мне нужно интегрировать Specflow в приведенный выше тест. Я использовал «инъекцию зависимостей», чтобы поделиться некоторым состоянием в соответствии с инструкциями, и все работает нормально без проблем, без параллелизма.
Проблема возникает, когда я пытался запустить Parallel на уровне Fixture для Specflow - это означает, что 1 тест из этой функции выполняется параллельно с другим тестом в другой функции.
Вот мои конфигурации: NUnit 3.11 Specflow 2.41 (У меня возникла проблема с Specflow 3, поэтому я использовал 2.41) Net 4.6.1 NUnit Test Adapter 3
Крючки:
private static TestScopeContext _testScope;
private readonly IObjectContainer _objectContainer;
public Hooks(IObjectContainer objectContainer)
{
_objectContainer = objectContainer;
}
[BeforeTestRun]
public static void SetUpTestScope()
{
_testScope = new TestScopeContext();
}
[BeforeScenario]
public void CreateScenario(FeatureContext featureContext, ScenarioContext scenarioContext)
{
_objectContainer.RegisterInstanceAs<TestScopeContext>(_testScope);
//some codes that need access to feature context, scenario context. Not sure if this is the correct way
}
TestScopeContext.cs
public class TestScopeContext:IDisposable
{
public string value;
//other codes
}
Шаги привязки
FileA.cs
[Binding]
public class FileProcessingTestSteps
{
private readonly TestScopeContext _testScope;
private readonly ScenarioContext _scenarioContext;
public FileProcessingTestSteps(
TestScopeContext testScope,
ScenarioContext scenarioContext)
{
_testScope = testScope;
_scenarioContext = scenarioContext;
}
[When(@"The user drops the file to (.*) UNC path")]
public void WhenTheUserDropsTheFileToUNCPath(string client)
{
Console.WriteLine(_scenarioContext.ScenarioInfo.Title);
Console.WriteLine(_testScope.value); //issue at this line
}
}
FileB.cs
[Binding]
public class CitiTestStepsDefinition
{
private readonly TestScopeContext _testScope;
private readonly ScenarioContext _scenarioContext;
public CitiTestStepsDefinition(
TestScopeContext testScope,
ScenarioContext scenarioContext)
{
_testScope = testScope;
_scenarioContext = scenarioContext;
}
[Given(@"The user modifies the File (.*)")]
public void GivenTheUserModifiesTheFile(string text)
{
_testScope.value= _scenarioContext.ScenarioInfo.Title;
}
}
Вопрос 1:
Учитывая, что у меня есть 2 теста - Test1, Test2.
Console.WriteLine(_testScope.value);
при запуске выдаст либо Test1 для обоих тестов, либо Test2, в зависимости от того, какое значение назначено последним.
Является ли этот testScope только одним экземпляром, независимо от того, сколько рабочих я определил.
Вопрос 2: Я пытался удалить этот код _objectContainer.RegisterInstanceAs<TestScopeContext>(_testScope);
После этого область проверки выполняется правильно, _testScope.value возвращает Test1 для этого сценария и Test2 для другого сценария.
Я думал, что RegisterInstanceAs
используется для того, чтобы состояние «TestScope» можно было разделить между этапами привязки. Что-то не так с моими конфигурациями?
Если что-то непонятно, дайте мне знать, я могу попробовать продублировать свой рабочий проект и прикрепить сюда код.