/// <inheritdoc /> protected override void LogImpl(LogSeverity severity, string message, ExceptionData exceptionData) { switch (severity) { case LogSeverity.Error: testListener.WriteLine(message, FacadeCategory.Error); break; case LogSeverity.Warning: testListener.WriteLine(message, FacadeCategory.Warning); break; case LogSeverity.Important: case LogSeverity.Info: testListener.WriteLine(message, FacadeCategory.Info); break; case LogSeverity.Debug: testListener.WriteLine(message, FacadeCategory.Debug); break; } if (exceptionData != null) { testListener.WriteLine(exceptionData.ToString(), FacadeCategory.Error); } }
/// <inheritdoc /> protected override void LogAnnotation(AnnotationData annotation) { StringBuilder message = new StringBuilder(); message.AppendFormat("[{0}] ", annotation.Type.ToString().ToLower()); message.Append(annotation.Message); if (annotation.CodeLocation != CodeLocation.Unknown) { message.Append("\n\tLocation: "); message.Append(annotation.CodeLocation); } if (annotation.CodeLocation.Line == 0 && annotation.CodeReference != CodeReference.Unknown) { message.Append("\n\tReference: "); message.Append(annotation.CodeReference); } if (!string.IsNullOrEmpty(annotation.Details)) { message.Append("\n\tDetails: "); message.Append(annotation.Details); } FacadeCategory category = GetCategoryForAnnotation(annotation.Type); testListener.WriteLine(message.ToString(), category); }
/// <summary> /// Inform the user that no tests were run and the reason for it. TD.NET displays /// a message like "0 Passed, 0 Failed, 0 Skipped" but it does it in the status bar, /// which may be harder to notice for the user. Be aware that this message will /// only be displayed when the user runs an individual test or fixture (TD.NET /// ignores the messages we send when it's running an entire assembly). /// </summary> /// <param name="testListener">An ITestListener object to write the message to.</param> /// <param name="reason">The reason no tests were run for.</param> private static void InformNoTestsWereRun(IFacadeTestListener testListener, string reason) { reason = String.IsNullOrEmpty(reason) ? String.Empty : " (" + reason + ")"; string message = String.Format("** {0}{1} **", Resources.MbUnitTestRunner_NoTestsWereRun, reason); testListener.WriteLine(message, FacadeCategory.Warning); }
/// <inheritdoc /> protected override FacadeTestRunState RunImpl(IFacadeTestListener testListener, string assemblyPath, string cref, FacadeOptions facadeOptions) { string versionLabel = VersionPolicy.GetVersionLabel(Assembly.GetExecutingAssembly()); testListener.WriteLine(String.Format(Resources.RunnerNameAndVersion + "\n", versionLabel), FacadeCategory.Info); switch (facadeOptions.FilterCategoryMode) { case FacadeFilterCategoryMode.Include: testListener.WriteLine(String.Format("Included categories: {0}\n", CombineCategoryNameList(facadeOptions.FilterCategoryNames)), FacadeCategory.Info); break; case FacadeFilterCategoryMode.Exclude: testListener.WriteLine(String.Format("Excluded categories: {0}\n", CombineCategoryNameList(facadeOptions.FilterCategoryNames)), FacadeCategory.Info); break; } EnsureTestRunnerIsCreated(); return testRunner.Run(testListener, assemblyPath, cref, facadeOptions); }
/// <inheritdoc /> protected override FacadeTestRunState RunImpl(IFacadeTestListener testListener, string assemblyPath, string cref, FacadeOptions facadeOptions) { string versionLabel = VersionPolicy.GetVersionLabel(Assembly.GetExecutingAssembly()); testListener.WriteLine(String.Format(Resources.RunnerNameAndVersion + "\n", versionLabel), FacadeCategory.Info); switch (facadeOptions.FilterCategoryMode) { case FacadeFilterCategoryMode.Include: testListener.WriteLine(String.Format("Included categories: {0}\n", CombineCategoryNameList(facadeOptions.FilterCategoryNames)), FacadeCategory.Info); break; case FacadeFilterCategoryMode.Exclude: testListener.WriteLine(String.Format("Excluded categories: {0}\n", CombineCategoryNameList(facadeOptions.FilterCategoryNames)), FacadeCategory.Info); break; } EnsureTestRunnerIsCreated(); return(testRunner.Run(testListener, assemblyPath, cref, facadeOptions)); }
private FacadeTestRunState Run(IFacadeTestListener testListener, string assemblyPath, Filter <ITestDescriptor> filter, FacadeOptions facadeOptions) { if (testListener == null) { throw new ArgumentNullException(@"testListener"); } if (assemblyPath == null) { throw new ArgumentNullException("assemblyPath"); } if (facadeOptions == null) { throw new ArgumentNullException("facadeOptions"); } ILogger logger = new FilteredLogger(new TDNetLogger(testListener), LogSeverity.Info); try { RuntimeAccessor.Instance.AddLogListener(logger); var filterRules = new List <FilterRule <ITestDescriptor> >(); switch (facadeOptions.FilterCategoryMode) { case FacadeFilterCategoryMode.Disabled: filterRules.Add(new FilterRule <ITestDescriptor>(FilterRuleType.Inclusion, filter)); break; case FacadeFilterCategoryMode.Include: filterRules.Add(new FilterRule <ITestDescriptor>(FilterRuleType.Inclusion, new AndFilter <ITestDescriptor>(new[] { filter, ToCategoryFilter(facadeOptions.FilterCategoryNames) }))); break; case FacadeFilterCategoryMode.Exclude: filterRules.Add(new FilterRule <ITestDescriptor>(FilterRuleType.Exclusion, ToCategoryFilter(facadeOptions.FilterCategoryNames))); filterRules.Add(new FilterRule <ITestDescriptor>(FilterRuleType.Inclusion, filter)); break; } var filterSet = new FilterSet <ITestDescriptor>(filterRules); launcher.Logger = logger; launcher.ProgressMonitorProvider = new LogProgressMonitorProvider(logger); launcher.TestExecutionOptions.FilterSet = filterSet; launcher.TestProject.TestRunnerFactoryName = StandardTestRunnerFactoryNames.IsolatedAppDomain; launcher.TestProject.AddTestRunnerExtension(new TDNetExtension(testListener)); // This monitor will inform the user in real-time what's going on launcher.TestProject.TestPackage.AddFile(new FileInfo(assemblyPath)); string assemblyDirectory = Path.GetDirectoryName(assemblyPath); launcher.TestProject.TestPackage.ApplicationBaseDirectory = new DirectoryInfo(assemblyDirectory); launcher.TestProject.TestPackage.WorkingDirectory = new DirectoryInfo(assemblyDirectory); TestLauncherResult result = RunLauncher(launcher); string reportDirectory = GetReportDirectory(logger); if (reportDirectory != null) { var reportFormatterOptions = new ReportFormatterOptions(); var preferenceManager = (TDNetPreferenceManager)RuntimeAccessor.ServiceLocator.ResolveByComponentId("TDNetRunner.PreferenceManager"); var reportFormat = preferenceManager.ReportSettings.DetermineReportFormat(result.Report); result.GenerateReports(reportDirectory, Path.GetFileName(assemblyPath), ReportArchive.Normal, new[] { reportFormat }, reportFormatterOptions, RuntimeAccessor.ServiceLocator.Resolve <IReportManager>(), NullProgressMonitor.CreateInstance()); // This will generate a link to the generated report if (result.ReportDocumentPaths.Count != 0) { Uri rawUrl = new Uri(result.ReportDocumentPaths[0]); string displayUrl = "file:///" + rawUrl.LocalPath.Replace(" ", "%20").Replace(@"\", "/"); // TDNet just prints the link on its own but it's not always clear to users what it represents. // testListener.TestResultsUrl(displayUrl); testListener.WriteLine("\nTest Report: " + displayUrl, FacadeCategory.Info); } } // Inform no tests run, if necessary. if (result.ResultCode == ResultCode.NoTests) { InformNoTestsWereRun(testListener, Resources.MbUnitTestRunner_NoTestsFound); } else if (result.Statistics.TestCount == 0) { InformNoTestsWereRun(testListener, null); } return(GetTestRunState(result)); } finally { RuntimeAccessor.Instance.RemoveLogListener(logger); } }
private FacadeTestRunState Run(IFacadeTestListener testListener, string assemblyPath, Filter<ITestDescriptor> filter, FacadeOptions facadeOptions) { if (testListener == null) throw new ArgumentNullException(@"testListener"); if (assemblyPath == null) throw new ArgumentNullException("assemblyPath"); if (facadeOptions == null) throw new ArgumentNullException("facadeOptions"); ILogger logger = new FilteredLogger(new TDNetLogger(testListener), LogSeverity.Info); try { RuntimeAccessor.Instance.AddLogListener(logger); var filterRules = new List<FilterRule<ITestDescriptor>>(); switch (facadeOptions.FilterCategoryMode) { case FacadeFilterCategoryMode.Disabled: filterRules.Add(new FilterRule<ITestDescriptor>(FilterRuleType.Inclusion, filter)); break; case FacadeFilterCategoryMode.Include: filterRules.Add(new FilterRule<ITestDescriptor>(FilterRuleType.Inclusion, new AndFilter<ITestDescriptor>(new[] { filter, ToCategoryFilter(facadeOptions.FilterCategoryNames) }))); break; case FacadeFilterCategoryMode.Exclude: filterRules.Add(new FilterRule<ITestDescriptor>(FilterRuleType.Exclusion, ToCategoryFilter(facadeOptions.FilterCategoryNames))); filterRules.Add(new FilterRule<ITestDescriptor>(FilterRuleType.Inclusion, filter)); break; } var filterSet = new FilterSet<ITestDescriptor>(filterRules); launcher.Logger = logger; launcher.ProgressMonitorProvider = new LogProgressMonitorProvider(logger); launcher.TestExecutionOptions.FilterSet = filterSet; launcher.TestProject.TestRunnerFactoryName = StandardTestRunnerFactoryNames.IsolatedAppDomain; launcher.TestProject.AddTestRunnerExtension(new TDNetExtension(testListener)); // This monitor will inform the user in real-time what's going on launcher.TestProject.TestPackage.AddFile(new FileInfo(assemblyPath)); string assemblyDirectory = Path.GetDirectoryName(assemblyPath); launcher.TestProject.TestPackage.ApplicationBaseDirectory = new DirectoryInfo(assemblyDirectory); launcher.TestProject.TestPackage.WorkingDirectory = new DirectoryInfo(assemblyDirectory); TestLauncherResult result = RunLauncher(launcher); string reportDirectory = GetReportDirectory(logger); if (reportDirectory != null) { var reportFormatterOptions = new ReportFormatterOptions(); var preferenceManager = (TDNetPreferenceManager)RuntimeAccessor.ServiceLocator.ResolveByComponentId("TDNetRunner.PreferenceManager"); var reportFormat = preferenceManager.ReportSettings.DetermineReportFormat(result.Report); result.GenerateReports(reportDirectory, Path.GetFileName(assemblyPath), ReportArchive.Normal, new[] { reportFormat }, reportFormatterOptions, RuntimeAccessor.ServiceLocator.Resolve<IReportManager>(), NullProgressMonitor.CreateInstance()); // This will generate a link to the generated report if (result.ReportDocumentPaths.Count != 0) { Uri rawUrl = new Uri(result.ReportDocumentPaths[0]); string displayUrl = "file:///" + rawUrl.LocalPath.Replace(" ", "%20").Replace(@"\", "/"); // TDNet just prints the link on its own but it's not always clear to users what it represents. // testListener.TestResultsUrl(displayUrl); testListener.WriteLine("\nTest Report: " + displayUrl, FacadeCategory.Info); } } // Inform no tests run, if necessary. if (result.ResultCode == ResultCode.NoTests) { InformNoTestsWereRun(testListener, Resources.MbUnitTestRunner_NoTestsFound); } else if (result.Statistics.TestCount == 0) { InformNoTestsWereRun(testListener, null); } return GetTestRunState(result); } finally { RuntimeAccessor.Instance.RemoveLogListener(logger); } }