private async Task ExecuteSteps( IServiceProvider serviceProvider, TestResult testResult, IEnumerable <IStep> steps, DiscoveredTestData testData, TestRunContext testRunContext) { var scenarioExecutionStartTime = DateTime.UtcNow; var stepsIterator = new StepsIterator(steps); foreach (var step in stepsIterator.Iterate()) { testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{step.Title}{Environment.NewLine}")); var stepBinding = stepBinder.GetBindingFor(step, testData.Assembly); var executionStrategy = StepExecutionStrategyFactory.GetFor(stepBinding); try { await executionStrategy .Execute(stepBinding, serviceProvider, testResult.Messages, testRunContext) .ConfigureAwait(false); testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{StepLogIndent}Completed at {DateTime.UtcNow:o}{Environment.NewLine}{Environment.NewLine}")); } catch (Exception exception) { if (ScenarioFailureIsTerminal( testData.Scenario, scenarioExecutionStartTime, stepsIterator)) { testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{StepLogIndent}Failed at {DateTime.UtcNow:o}{Environment.NewLine}{Environment.NewLine}")); testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardErrorCategory, $"{exception}{Environment.NewLine}")); throw; } testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{StepLogIndent}Failed at {DateTime.UtcNow:o}, waiting and retrying scenario from last When step{Environment.NewLine}")); await Task.Delay(testData.Scenario.EventuallyConsistentConfiguration.RetryInterval).ConfigureAwait(false); } } }
public async Task ExecuteSteps(IServiceProvider serviceProvider, TestResult testResult, IEnumerable <IStep> steps, DiscoveredTestData testData, TestRunContext testRunContext) { var startTime = DateTime.UtcNow; for (var stepIndex = 0; stepIndex < steps.Count(); stepIndex++) { var step = steps.ElementAt(stepIndex); testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{step.Title}{Environment.NewLine}")); var stepBinding = stepBinder.GetBindingFor(step, testData.Assembly); var executionStrategy = StepExecutionStrategyFactory.GetFor(stepBinding); try { await executionStrategy .Execute(stepBinding, serviceProvider, testResult.Messages, testRunContext) .ConfigureAwait(false); } catch (Exception exception) { if (!testData.Scenario.IsEventuallyConsistent || DateTime.UtcNow > startTime.Add(testData.Scenario.EventuallyConsistentConfiguration.Within)) { testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{StepsExecutor.StepLogIndent}Failed{Environment.NewLine}{Environment.NewLine}")); testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardErrorCategory, $"{exception}{Environment.NewLine}")); throw; } var previousStepsInReverse = steps.Take(stepIndex + 1).Reverse(); var lastWhenStep = previousStepsInReverse.First(s => s is WhenStep); stepIndex = steps.ToList().IndexOf(lastWhenStep); await Task.Delay(testData.Scenario.EventuallyConsistentConfiguration.RetryInterval).ConfigureAwait(false); continue; } testResult.Messages.Add( new TestResultMessage( TestResultMessage.StandardOutCategory, $"{StepsExecutor.StepLogIndent}Completed{Environment.NewLine}{Environment.NewLine}")); } }