protected override void AfterTestStarting()
        {
            base.AfterTestStarting();

            if (Aggregator.HasExceptions || SkipReason != null)
            {
                return;
            }

            try
            {
                var scenarioDiscoverer = ScenarioDiscovererFactory.GetDiscoverer(DiagnosticMessageSink, ScenarioTest.ScenarioIdentifier);
                Scenario = scenarioDiscoverer.GetScenario(ScenarioTest.ScenarioIdentifier);

                if (Scenario == null)
                {
                    throw new InvalidOperationException("Scenario is null (ScenarioDiscoverer returned no scenario).");
                }

                if (Scenario is IExecutableScenario executableScenario)
                {
                    Aggregator
                    .RunAsync(() => executableScenario.ExecuteAsync())
                    .Wait();
                }
            }
            catch (Exception e)
            {
                Aggregator.Add(e);
            }
        }
        private ICollection <IXunitTestCase> CreatePreEnumeratedTestCases(
            ITestFrameworkDiscoveryOptions discoveryOptions,
            ITestMethod testMethod, IEnumerable <IAttributeInfo> scenarioAttributes)
        {
            var testCases = new List <IXunitTestCase>();

            foreach (var scenarioAttribute in scenarioAttributes)
            {
                IScenarioIdentifier scenarioIdentifier;
                var skipReason = scenarioAttribute.GetNamedArgument <string>(nameof(ScenarioAttribute.Skip));

                try
                {
                    var scenarioDiscoverer =
                        ScenarioDiscovererFactory.GetDiscoverer(DiagnosticMessageSink, scenarioAttribute);
                    scenarioIdentifier = scenarioDiscoverer.GetScenarioIdentifier(scenarioAttribute);
                }
                catch (Exception e)
                {
                    scenarioIdentifier = new DummyScenarioDiscoverer().GetScenarioIdentifier(scenarioAttribute);

                    if (skipReason == null)
                    {
                        testCases.Add(
                            new ExecutionErrorScenarioTestCase(
                                DiagnosticMessageSink,
                                discoveryOptions.MethodDisplayOrDefault(),
                                discoveryOptions.MethodDisplayOptionsOrDefault(),
                                testMethod,
                                scenarioIdentifier,
                                $"{e.Message} for {testMethod.TestClass.Class.Name}.{testMethod.Method.Name}, Scenario {scenarioIdentifier}."
                                )
                            );

                        continue;
                    }
                }

                var testCase = new ScenarioTestCase(DiagnosticMessageSink,
                                                    discoveryOptions.MethodDisplayOrDefault(), discoveryOptions.MethodDisplayOptionsOrDefault(),
                                                    testMethod, scenarioIdentifier, skipReason);

                testCases.Add(testCase);
            }

            return(testCases);
        }
        protected override async Task AfterTestCaseStartingAsync()
        {
            await base.AfterTestCaseStartingAsync();

            try
            {
                var scenarioAttributes = TestCase.TestMethod.GetScenarioAttributes(DiagnosticMessageSink);

                if (!scenarioAttributes.Any())
                {
                    throw new InvalidOperationException(
                              $"No scenario specified for {TestCase.TestMethod.TestClass.Class.Name}.{TestCase.TestMethod.Method.Name}. Make sure to add at least one ScenarioAttribute to the test method or class.");
                }

                foreach (var scenarioAttribute in scenarioAttributes)
                {
                    IScenarioIdentifier scenarioIdentifier = null;
                    var testRunnerAggregator = new ExceptionAggregator(Aggregator);
                    var skipReason           = scenarioAttribute.GetNamedArgument <string>("Skip");

                    try
                    {
                        var scenarioDiscoverer = ScenarioDiscovererFactory.GetDiscoverer(DiagnosticMessageSink, scenarioAttribute);
                        scenarioIdentifier = scenarioDiscoverer.GetScenarioIdentifier(scenarioAttribute);
                    }
                    catch (Exception exception)
                    {
                        scenarioIdentifier = new DummyScenarioDiscoverer().GetScenarioIdentifier(scenarioAttribute);
                        testRunnerAggregator.Add(exception);
                    }

                    var test       = CreateTest(TestCase, scenarioIdentifier);
                    var testRunner = new ScenarioTestRunner(test, DiagnosticMessageSink, MessageBus, TestClass, ConstructorArguments, TestMethod,
                                                            TestMethodArguments, skipReason, BeforeAfterAttributes, testRunnerAggregator,
                                                            CancellationTokenSource);

                    _testRunners.Add(testRunner);
                }
            }
            catch (Exception ex)
            {
                ScenarioDiscoveryException = ex;
            }
        }