public Task BeforeAllTests(TestContext testContext)
        {
            var executor = new MethodExecuter(methodInfo);

            return(executor.ExecuteAsync(true));
        }
        public override async Task <IEnumerable <PerformanceTestIterationResult> > ExecuteAsync(TestContext context)
        {
            IEnumerable <ITestLifecycle> testLifecycles = BuildLifeTimeEvents();

            var afterTest           = testLifecycles.OfType <ITestLifecycleAfterTest>().ToArray();
            var beforeTest          = testLifecycles.OfType <ITestLifecycleBeforeTest>().ToArray();
            var afterTestIteration  = testLifecycles.OfType <ITestLifecycleAfterTestIteration>().ToArray();
            var beforeTestIteration = testLifecycles.OfType <ITestLifecycleBeforeTestIteration>().ToArray();

            var executor = new MethodExecuter(this.methodInfo);

            foreach (var t in beforeTest)
            {
                await t.BeforeTest(context);
            }

            var results = new ConcurrentBag <PerformanceTestIterationResult>();
            var wc      = Math.Max(0, this.settings.WarmUpCount);

            for (var i = 0; i < wc; i++)
            {
                using (var subContext = TestContext.Start(this, context, true))
                {
                    foreach (var t in beforeTestIteration)
                    {
                        await t.BeforeTestIteration(subContext);
                    }
                    var result = await executor.ExecuteAsync();

                    results.Add(new PerformanceTestIterationResult
                    {
                        Duration = result.Elapsed,
                        Error    = result.Error,
                        IsWarmup = true,
                        Output   = subContext.Output
                    });
                    foreach (var t in afterTestIteration)
                    {
                        await t.AfterTestIteration(subContext);
                    }
                }
            }
            var timeout = Stopwatch.StartNew();
            var tasks   = new List <Task>();

            var cc = Math.Max(1, this.settings.ConcurrancyCount);

            for (var i = 0; i < cc; i++)
            {
                var t = Task.Run(async() =>
                {
                    do
                    {
                        using (var subContext = TestContext.Start(this, context, false))
                        {
                            foreach (var e in beforeTestIteration)
                            {
                                await e.BeforeTestIteration(subContext);
                            }
                            var result = await executor.ExecuteAsync();
                            results.Add(new PerformanceTestIterationResult
                            {
                                Duration = result.Elapsed,
                                Error    = result.Error,
                                IsWarmup = false,
                                Output   = subContext.Output
                            });
                            foreach (var e in afterTestIteration)
                            {
                                await e.AfterTestIteration(subContext);
                            }
                        }
                    } while (timeout.ElapsedMilliseconds < settings.ExecutionLength);
                });

                tasks.Add(t);
            }
            await Task.WhenAll(tasks);

            // all executions complete deal with stats etc out side the runners

            foreach (var t in afterTest)
            {
                await t.AfterTest(context);
            }

            return(results);
        }