コード例 #1
0
        private void RunTest(ITestExecutionRecorder frameworkHandle, string source, string spec = null)
        {
            var results = appDomainRunner.ExecuteSpecifications(source, spec);
            var query = from result in results
                        from @group in result.Examples
                        from example in @group.Examples
                        select example;

            foreach (var example in query) {
                var testCase = new TestCase(example.Reason, ExecutorUri, source) {
                    CodeFilePath = source
                };

                frameworkHandle.RecordStart(testCase);
                var testResult = new TestResult(testCase) {
                    DisplayName = example.Reason,
                    Duration = new TimeSpan(example.ElapsedTime),
                };

                if (example.Status == ResultStatus.Error) {
                    testResult.Outcome = TestOutcome.Failed;
                    testResult.ErrorMessage = example.Message;
                    testResult.ErrorStackTrace = example.StackTrace;
                }

                if (example.Status == ResultStatus.Success) {
                    testResult.Outcome = TestOutcome.Passed;
                }

                frameworkHandle.RecordEnd(testCase, testResult.Outcome);
                frameworkHandle.RecordResult(testResult);
            }
        }
コード例 #2
0
        private void RunTestsCore(IEnumerable <ITestScript> tests, Predicate <ITestFunction> filter, ILogger logger, IRunContext runContext, ITestExecutionRecorder recorder)
        {
            var settingsService = runContext.RunSettings.GetSettings(PSycheTestRunSettings.SettingsProviderName) as IPSycheTestSettingsService ?? new PSycheTestSettingsService();

            var testCaseMap = new Dictionary <ITestFunction, TestCase>();
            var executor    = _executorFactory(logger);

            executor.OutputDirectory = new DirectoryInfo(runContext.TestRunDirectory);
            logger.Info("Test output directory: {0}", executor.OutputDirectory.FullName);

            foreach (var module in settingsService.Settings.Modules)
            {
                logger.Info("Adding module '{0}'", module);
                executor.InitialModules.Add(module);
            }

            executor.TestStarting += (o, e) =>
            {
                var testCase = _mapper.Map(e.Test);
                testCaseMap[e.Test] = testCase;
                recorder.RecordStart(testCase);
            };
            executor.TestEnded += (o, e) =>
            {
                var testCase = testCaseMap[e.Test];
                recorder.RecordEnd(testCase, _mapper.Map(e.Result.Status));
                recorder.RecordResult(_mapper.Map(testCase, e.Result));
            };

            using (_cancellationTokenSource = new CancellationTokenSource())
            {
                executor.ExecuteAsync(tests, filter, _cancellationTokenSource.Token).Wait();                    // Awaiting seems to cause odd behavior, just block instead.
            }
            _cancellationTokenSource = null;
        }
コード例 #3
0
        private void ExecuteTestsWithTestRunner(
            IEnumerable <TestCase> tests,
            IRunContext runContext,
            ITestExecutionRecorder testExecutionRecorder,
            string source,
            IDictionary <string, object> sourceLevelParameters,
            UnitTestRunner testRunner)
        {
            foreach (var currentTest in tests)
            {
                if (this.cancellationToken != null && this.cancellationToken.Canceled)
                {
                    break;
                }

                var unitTestElement = currentTest.ToUnitTestElement(source);
                testExecutionRecorder.RecordStart(currentTest);

                var startTime = DateTimeOffset.Now;

                PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo("Executing test {0}", unitTestElement.TestMethod.Name);

                // Run single test passing test context properties to it.
                var tcmProperties         = TcmTestPropertiesProvider.GetTcmProperties(currentTest);
                var testContextProperties = this.GetTestContextProperties(tcmProperties, sourceLevelParameters);
                var unitTestResult        = testRunner.RunSingleTest(unitTestElement.TestMethod, testContextProperties);

                PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo("Executed test {0}", unitTestElement.TestMethod.Name);

                var endTime = DateTimeOffset.Now;

                this.SendTestResults(currentTest, unitTestResult, startTime, endTime, testExecutionRecorder);
            }
        }
コード例 #4
0
        public void TestStarted(XmlNode testNode)
        {
            TestCase ourCase = _testConverter.GetCachedTestCase(testNode.GetAttribute("id"));

            // Simply ignore any TestCase not found in the cache
            if (ourCase != null)
            {
                _recorder.RecordStart(ourCase);
            }
        }
コード例 #5
0
        public void TestStarted(NUnitTestEventStartTest testNode)
        {
            var ourCase = _testConverter.GetCachedTestCase(testNode.Id);

            // Simply ignore any TestCase not found in the cache
            if (ourCase != null)
            {
                _recorder.RecordStart(ourCase);
            }
        }
コード例 #6
0
        protected override bool Visit(ITestStarting testStarting)
        {
            var vsTestCase = FindTestCase(testStarting.TestCase);

            if (vsTestCase != null)
            {
                recorder.RecordStart(vsTestCase);
            }

            return(!cancelledThunk());
        }
コード例 #7
0
        protected override bool Visit(ITestCaseStarting testCaseStarting)
        {
            var vsTestCase = FindTestCase(testCaseStarting.TestCase);

            if (vsTestCase != null)
            {
                TryAndReport("RecordStart", testCaseStarting.TestCase, () => recorder.RecordStart(vsTestCase));
            }
            else
            {
                logger.LogWarning(testCaseStarting.TestCase, "(Starting) Could not find VS test case for {0} (ID = {1})", testCaseStarting.TestCase.DisplayName, testCaseStarting.TestCase.UniqueID);
            }

            return(!cancelledThunk());
        }
コード例 #8
0
        void HandleTestCaseStarting(MessageHandlerArgs <ITestCaseStarting> args)
        {
            var testCaseStarting = args.Message;
            var vsTestCase       = FindTestCase(testCaseStarting.TestCase);

            if (vsTestCase != null)
            {
                TryAndReport("RecordStart", testCaseStarting.TestCase, () => recorder.RecordStart(vsTestCase));
            }
            else
            {
                logger.LogWarning(testCaseStarting.TestCase, "(Starting) Could not find VS test case for {0} (ID = {1})", testCaseStarting.TestCase.DisplayName, testCaseStarting.TestCase.UniqueID);
            }

            HandleCancellation(args);
        }
コード例 #9
0
ファイル: TestExecutionManager.cs プロジェクト: tbolon/testfx
        private void ExecuteTestsWithTestRunner(
            IEnumerable <TestCase> tests,
            IRunContext runContext,
            ITestExecutionRecorder testExecutionRecorder,
            string source,
            IDictionary <string, object> sourceLevelParameters,
            UnitTestRunner testRunner)
        {
            var testExecutionRecorderWrapper = new TestExecutionRecorderWrapper(testExecutionRecorder);

            foreach (var currentTest in tests)
            {
                if (this.cancellationToken != null && this.cancellationToken.Canceled)
                {
                    break;
                }

                var unitTestElement = currentTest.ToUnitTestElement(source);

                // Fire a RecordStart here even though we also fire RecordStart inside TestMethodInfo
                // this is to ensure we fire start events for error cases. This is acceptable because
                // vstest ignores multiple start events.
                testExecutionRecorder.RecordStart(currentTest);

                var startTime = DateTimeOffset.Now;

                PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo(
                    "Executing test {0}",
                    unitTestElement.TestMethod.Name);

                // Run single test passing test context properties to it.
                var tcmProperties         = TcmTestPropertiesProvider.GetTcmProperties(currentTest);
                var testContextProperties = this.GetTestContextProperties(tcmProperties, sourceLevelParameters);
                var unitTestResult        = testRunner.RunSingleTest(unitTestElement.TestMethod, testExecutionRecorderWrapper, testContextProperties);

                PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo(
                    "Executed test {0}",
                    unitTestElement.TestMethod.Name);

                var endTime = DateTimeOffset.Now;

                this.SendTestResults(currentTest, unitTestResult, startTime, endTime, testExecutionRecorder);
            }
        }
コード例 #10
0
        private void RunTest(ITestExecutionRecorder frameworkHandle, string source, string spec = null)
        {
            var results = appDomainRunner.ExecuteSpecifications(source, spec);
            var query   = from result in results
                          from @group in result.Examples
                          from example in @group.Examples
                          select example;

            foreach (var example in query)
            {
                var testCase = new TestCase(example.Reason, ExecutorUri, source)
                {
                    CodeFilePath = source
                };

                frameworkHandle.RecordStart(testCase);
                var testResult = new TestResult(testCase)
                {
                    DisplayName = example.Reason,
                    Duration    = new TimeSpan(example.ElapsedTime),
                };

                if (example.Status == ResultStatus.Error)
                {
                    testResult.Outcome         = TestOutcome.Failed;
                    testResult.ErrorMessage    = example.Message;
                    testResult.ErrorStackTrace = example.StackTrace;
                }

                if (example.Status == ResultStatus.Success)
                {
                    testResult.Outcome = TestOutcome.Passed;
                }

                frameworkHandle.RecordEnd(testCase, testResult.Outcome);
                frameworkHandle.RecordResult(testResult);
            }
        }
コード例 #11
0
        private Task ExecuteTests(IEnumerable <TestCase> tests, ITestExecutionRecorder frameworkHandle, Executor executor, CancellationToken token)
        {
            return(Task.WhenAll(tests.Select(test => Task.Run(async() =>
            {
                frameworkHandle.RecordStart(test);
                try
                {
                    var result = await executor.Execute(_testDiscoverer.GetTest(test.FullyQualifiedName), token);

                    frameworkHandle.RecordEnd(test, result.Outcome.ToVsResultOutcome());
                    frameworkHandle.RecordResult(result.ConvertToVsResult(test));
                }
                catch (Exception ex)
                {
                    frameworkHandle.RecordEnd(test, TestOutcome.None);
                    frameworkHandle.RecordResult(new TestResult(test)
                    {
                        Outcome = TestOutcome.None,
                        ErrorMessage = ex.Message,
                        ErrorStackTrace = ex.StackTrace
                    });
                }
            }, token))));
        }
コード例 #12
0
        private static void ExecuteStandardTest(ITestExecutionRecorder recorder, TestCase test, MethodInfo method,
                                                TestContext context, object instance)
        {
            try
            {
                recorder.SendMessage(TestMessageLevel.Informational, "Running standard test");

                var accessor    = CallAccessor.Create(method);
                var occurrences = 0;

                recorder.RecordResult(DutyCycle(accessor, ++occurrences));

                while (!context.Skipped && context.RepeatCount > 0)
                {
                    recorder.RecordResult(DutyCycle(accessor, ++occurrences));
                    context.RepeatCount--;
                }
            }
            finally
            {
                context.Dispose();
            }

            TestResult DutyCycle(IMethodCallAccessor accessor, int occurrence)
            {
                if (occurrence > 1)
                {
                    var clone = new TestCase
                    {
                        DisplayName        = $"{test.DisplayName ?? "<No Name>"} #{occurrence}",
                        ExecutorUri        = test.ExecutorUri,
                        FullyQualifiedName = test.FullyQualifiedName,
                        Id                 = test.Id,
                        LineNumber         = test.LineNumber,
                        LocalExtensionData = test.LocalExtensionData,
                        CodeFilePath       = test.CodeFilePath,
                        Source             = test.Source
                    };

                    clone.Traits.AddRange(test.Traits);

                    test = clone;
                }


                TestResult testResult = null;

                try
                {
                    recorder.SendMessage(TestMessageLevel.Informational, "Starting test");
                    recorder.RecordStart(test);

                    context.BeginTest();
                    var result = ExecuteTestMethod(accessor, instance, context);
                    context.EndTest();

                    var outcome = context.Skipped ? TestOutcome.Skipped :
                                  result ? TestOutcome.Passed : TestOutcome.Failed;
                    recorder.SendMessage(TestMessageLevel.Informational,
                                         $"{test.DisplayName} => {outcome.ToString().ToLowerInvariant()}");

                    recorder.SendMessage(TestMessageLevel.Informational, "Ending test");
                    recorder.RecordEnd(test, outcome);

                    testResult = new TestResult(test)
                    {
                        Outcome = outcome
                    };
                    if (context.Skipped)
                    {
                        testResult.Messages.Add(new TestResultMessage(Constants.Categories.Skipped,
                                                                      context.SkipReason));
                    }

                    var listener = Trace.Listeners.OfType <TestResultTraceListener>().SingleOrDefault();
                    if (listener != null)
                    {
                        testResult.Messages.Add(listener.ToMessage());
                    }

                    return(testResult);
                }
                catch (Exception ex)
                {
                    recorder.SendMessage(TestMessageLevel.Error, ex.Message);
                    testResult ??= new TestResult(test);

                    testResult.Messages.Add(new TestResultMessage(Constants.Categories.Failed,
                                                                  "Test failed because an exception prevented execution."));

                    testResult.Outcome         = TestOutcome.Failed;
                    testResult.ErrorMessage    = ex.Message;
                    testResult.ErrorStackTrace = ex.StackTrace;

                    return(testResult);
                }
            }
        }
コード例 #13
0
 public bool TestStart(string name, string type, string method)
 {
     recorder.RecordStart(GetTestCase(type, method));
     return(!cancelledThunk());
 }
コード例 #14
0
        protected override bool Visit(ITestStarting testStarting)
        {
            recorder.RecordStart(testCases[testStarting.TestCase]);

            return(!cancelledThunk());
        }
コード例 #15
0
        private void LogTestCaseStarted(TestStepStartedEventArgs e)
        {
            var testCase = testCaseFactory.GetTestCase(e.Test);

            executionRecorder.RecordStart(testCase);
        }
コード例 #16
0
        //----------------------------------------------------------------------------------------------------

        private async Task ParseTestRunOutput(
            ITestExecutionRecorder recorder,
            StreamReader stream,
            IEnumerable <TestCase> tests
            )
        {
            var      tests_complete        = false;
            TestCase current_test          = null;
            var      current_message_lines = new List <string>();

            do
            {
                var line = await stream.ReadLineAsync();

                if (line == null)
                {
                    break;
                }

                if (tests_complete)
                {
                    // We have stopped processing tests for some reason.
                    break;
                }

                if (line.StartsWith("    "))
                {
                    // A message line for the current test.
                    current_message_lines.Add(line.TrimStart());
                    continue;
                }

                if (line.StartsWith("Test Complete:"))
                {
                    if (current_test == null)
                    {
                        LogError("Unexpected test completion");
                        break;
                    }

                    // The current test has finished.  Update the status.
                    var status  = line.Substring(15);
                    var outcome = (status == "passed") ? TestOutcome.Passed : TestOutcome.Failed;
                    var message = string.Join(Environment.NewLine, current_message_lines);
                    recorder.RecordResult(
                        new TestResult(current_test)
                    {
                        Outcome      = outcome,
                        ErrorMessage = message
                    }
                        );
                    LogDebug($"Test Complete: {current_test.FullyQualifiedName} ({status})");

                    current_test = null;
                    current_message_lines.Clear();
                    continue;
                }

                if (current_test != null)
                {
                    // The current test has finished unexpectedly.
                    LogError($"Unexpected end of test: {current_test.FullyQualifiedName}");
                    break;
                }

                if (line.StartsWith("Skip:"))
                {
                    var test_name = line.Substring(6);
                    recorder.RecordResult(
                        new TestResult(tests.First(t => t.FullyQualifiedName == test_name))
                    {
                        Outcome = TestOutcome.Skipped
                    }
                        );
                    LogDebug($"Test Skipped: {test_name}");
                    continue;
                }

                if (line.StartsWith("Test:"))
                {
                    var test_name = line.Substring(6);
                    current_test = tests.First(t => t.FullyQualifiedName == test_name);
                    recorder.RecordStart(current_test);
                    continue;
                }

                if (line.StartsWith("Running"))
                {
                    // Ignore the first line.
                    continue;
                }

                if (line.StartsWith("Complete."))
                {
                    // All done.
                    tests_complete = true;
                    continue;
                }

                // Something has gone wrong.  Stop processing.
                tests_complete = true;
            } while (!stream.EndOfStream);
        }
コード例 #17
0
 void ITestExecutionRecorder.RecordStart(TestCase testCase) => recorder?.RecordStart(testCase);
コード例 #18
0
        private void ExecuteTestsWithTestRunner(
            IEnumerable <TestCase> tests,
            IRunContext runContext,
            ITestExecutionRecorder testExecutionRecorder,
            string source,
            UnitTestRunner testRunner)
        {
            TestCase test = null;

            UnitTestResult[] unitTestResult = null;

            var startTime = DateTimeOffset.MinValue;
            var endTime   = DateTimeOffset.MinValue;

            bool filterHasError;
            var  filterExpression = this.TestMethodFilter.GetFilterExpression(
                runContext,
                testExecutionRecorder,
                out filterHasError);

            if (!filterHasError)
            {
                foreach (var currentTest in tests)
                {
                    // Skip test if not fitting filter criteria.
                    if (filterExpression != null && filterExpression.MatchTestCase(
                            currentTest,
                            (p) => this.TestMethodFilter.PropertyValueProvider(currentTest, p)) == false)
                    {
                        continue;
                    }

                    // Send previous test result.
                    this.SendTestResults(test, unitTestResult, startTime, endTime, testExecutionRecorder);

                    if (this.cancellationToken != null && this.cancellationToken.Canceled)
                    {
                        break;
                    }

                    var unitTestElement = currentTest.ToUnitTestElement(source);
                    testExecutionRecorder.RecordStart(currentTest);

                    startTime = DateTimeOffset.Now;

                    PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo(
                        "Executing test {0}",
                        unitTestElement.TestMethod.Name);

                    if (unitTestElement.Ignored)
                    {
                        unitTestResult = new[] { new UnitTestResult(UnitTestOutcome.Ignored, null) };
                    }
                    else
                    {
                        // this is done so that appropriate values of testcontext properties are set at source level
                        // and are merged with session level parameters
                        var sourceLevelParameters = PlatformServiceProvider.Instance.SettingsProvider.GetProperties(source);

                        if (this.sessionParameters != null && this.sessionParameters.Count > 0)
                        {
                            sourceLevelParameters = sourceLevelParameters.Concat(this.sessionParameters).ToDictionary(x => x.Key, x => x.Value);
                        }

                        unitTestResult = testRunner.RunSingleTest(unitTestElement.TestMethod, sourceLevelParameters);
                    }

                    PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo(
                        "Executed test {0}",
                        unitTestElement.TestMethod.Name);

                    endTime = DateTimeOffset.Now;
                    test    = currentTest;
                }
            }

            IList <string> warnings = null;

            try
            {
                PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo("Executing cleanup methods.");
                var cleanupResult = testRunner.RunCleanup();
                PlatformServiceProvider.Instance.AdapterTraceLogger.LogInfo("Executed cleanup methods.");

                if (cleanupResult != null)
                {
                    warnings = cleanupResult.Warnings;

                    if (unitTestResult?.Length > 0)
                    {
                        var lastResult = unitTestResult[unitTestResult.Length - 1];
                        lastResult.StandardOut   += cleanupResult.StandardOut;
                        lastResult.StandardError += cleanupResult.StandardError;
                        lastResult.DebugTrace    += cleanupResult.DebugTrace;
                    }
                }
            }
            finally
            {
                // Send last test result
                this.SendTestResults(test, unitTestResult, startTime, endTime, testExecutionRecorder);
            }

            this.LogWarnings(testExecutionRecorder, warnings);
        }
コード例 #19
0
        public void Record(PipeMessage.CaseStarted message)
        {
            var testCase = ToVsTestCase(message.Test);

            log.RecordStart(testCase);
        }