private TestResults RunTests(TestPackage package, TestFilter filter, Messages.OnMessage[] subscribers) { NUnit.Core.TestResult result; ProcessModel processModel = package.Settings.Contains("ProcessModel") ? (ProcessModel)package.Settings["ProcessModel"] : ProcessModel.Default; DomainUsage domainUsage = package.Settings.Contains("DomainUsage") ? (DomainUsage)package.Settings[(object)"DomainUsage"] : DomainUsage.Default; RuntimeFramework runtimeFramework = package.Settings.Contains("RuntimeFramework") ? (RuntimeFramework)package.Settings["RuntimeFramework"] : RuntimeFramework.CurrentFramework; using (new SaveConsoleOutput()) using (TestRunner testRunner = new DefaultTestRunnerFactory().MakeTestRunner(package)) using (var ms = new MemoryStream()) using (var output = CreateOutputWriter(ms)) { try { TestEventHandler eventCollector = new TestEventHandler(_options, output, subscribers); testRunner.Load(package); if (testRunner.Test == null) { testRunner.Unload(); return new TestResults(TestResults.Code.FixtureNotFound, "Unable to locate fixture"); } result = testRunner.Run(eventCollector, filter, false, LoggingThreshold.All); var summary = eventCollector.GetSummary(); output.Flush(); if (summary.UnexpectedError) return new TestResults(TestResults.Code.UnexpectedError, GetResultText(ms), summary); return new TestResults(summary.InvalidAssemblies > 0 ? TestResults.Code.InvalidAssembly : GetCode(summary.FailureCount + summary.ErrorCount + summary.InvalidCount), GetResultText(ms), summary); } catch (FileNotFoundException ex) { output.WriteLine(ex.Message); output.Flush(); return new TestResults(TestResults.Code.InvalidAssembly, GetResultText(ms)); } catch (DirectoryNotFoundException ex) { output.WriteLine(ex.Message); output.Flush(); return new TestResults(TestResults.Code.InvalidAssembly, GetResultText(ms)); } catch (Exception ex) { output.WriteLine(ex.ToString()); output.Flush(); return new TestResults(TestResults.Code.UnexpectedError, GetResultText(ms)); } } }
public int Execute( ConsoleOptions options ) { this.workDir = options.work; if (workDir == null || workDir == string.Empty) workDir = Environment.CurrentDirectory; else { workDir = Path.GetFullPath(workDir); if (!Directory.Exists(workDir)) Directory.CreateDirectory(workDir); } TextWriter outWriter = Console.Out; bool redirectOutput = options.output != null && options.output != string.Empty; if ( redirectOutput ) { StreamWriter outStreamWriter = new StreamWriter( Path.Combine(workDir, options.output) ); outStreamWriter.AutoFlush = true; outWriter = outStreamWriter; } TextWriter errorWriter = Console.Error; bool redirectError = options.err != null && options.err != string.Empty; if ( redirectError ) { StreamWriter errorStreamWriter = new StreamWriter( Path.Combine(workDir, options.err) ); errorStreamWriter.AutoFlush = true; errorWriter = errorStreamWriter; } TestPackage package = MakeTestPackage(options); ProcessModel processModel = package.Settings.Contains("ProcessModel") ? (ProcessModel)package.Settings["ProcessModel"] : ProcessModel.Default; DomainUsage domainUsage = package.Settings.Contains("DomainUsage") ? (DomainUsage)package.Settings["DomainUsage"] : DomainUsage.Default; RuntimeFramework framework = package.Settings.Contains("RuntimeFramework") ? (RuntimeFramework)package.Settings["RuntimeFramework"] : RuntimeFramework.CurrentFramework; #if CLR_2_0 || CLR_4_0 Console.WriteLine("ProcessModel: {0} DomainUsage: {1}", processModel, domainUsage); Console.WriteLine("Execution Runtime: {0}", framework); #else Console.WriteLine("DomainUsage: {0}", domainUsage); if (processModel != ProcessModel.Default && processModel != ProcessModel.Single) Console.WriteLine("Warning: Ignoring project setting 'processModel={0}'", processModel); if (!RuntimeFramework.CurrentFramework.Supports(framework)) Console.WriteLine("Warning: Ignoring project setting 'runtimeFramework={0}'", framework); #endif using (TestRunner testRunner = new DefaultTestRunnerFactory().MakeTestRunner(package)) { testRunner.Load(package); if (testRunner.Test == null) { testRunner.Unload(); Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture); return FIXTURE_NOT_FOUND; } EventCollector collector = new EventCollector( options, outWriter, errorWriter ); TestFilter testFilter = TestFilter.Empty; SimpleNameFilter nameFilter = new SimpleNameFilter(); if ( options.run != null && options.run != string.Empty ) { Console.WriteLine( "Selected test(s): " + options.run ); foreach (string name in TestNameParser.Parse(options.run)) nameFilter.Add(name); testFilter = nameFilter; } if (options.runlist != null && options.runlist != string.Empty) { Console.WriteLine("Run list: " + options.runlist); using (StreamReader rdr = new StreamReader(options.runlist)) { // NOTE: We can't use rdr.EndOfStream because it's // not present in .NET 1.x. string line = rdr.ReadLine(); while (line != null) { if (line[0] != '#') nameFilter.Add(line); line = rdr.ReadLine(); } } testFilter = nameFilter; } if ( options.include != null && options.include != string.Empty ) { TestFilter includeFilter = new CategoryExpression( options.include ).Filter; Console.WriteLine("Included categories: " + includeFilter.ToString()); if (testFilter.IsEmpty) testFilter = includeFilter; else testFilter = new AndFilter( testFilter, includeFilter ); } if ( options.exclude != null && options.exclude != string.Empty ) { TestFilter excludeFilter = new NotFilter( new CategoryExpression( options.exclude ).Filter ); Console.WriteLine("Excluded categories: " + excludeFilter.ToString()); if ( testFilter.IsEmpty ) testFilter = excludeFilter; else if ( testFilter is AndFilter ) ((AndFilter)testFilter).Add( excludeFilter ); else testFilter = new AndFilter( testFilter, excludeFilter ); } if (testFilter is NotFilter) ((NotFilter)testFilter).TopLevel = true; TestResult result = null; string savedDirectory = Environment.CurrentDirectory; TextWriter savedOut = Console.Out; TextWriter savedError = Console.Error; try { result = testRunner.Run( collector, testFilter, false, LoggingThreshold.Off ); } finally { outWriter.Flush(); errorWriter.Flush(); if ( redirectOutput ) outWriter.Close(); if ( redirectError ) errorWriter.Close(); Environment.CurrentDirectory = savedDirectory; Console.SetOut( savedOut ); Console.SetError( savedError ); } Console.WriteLine(); int returnCode = UNEXPECTED_ERROR; if (result != null) { string xmlOutput = CreateXmlOutput(result); ResultSummarizer summary = new ResultSummarizer(result); if (options.xmlConsole) { Console.WriteLine(xmlOutput); } else { WriteSummaryReport(summary); if (summary.ErrorsAndFailures > 0 || result.IsError || result.IsFailure) { if (options.stoponerror) { Console.WriteLine("Test run was stopped after first error, as requested."); Console.WriteLine(); } WriteErrorsAndFailuresReport(result); } if (summary.TestsNotRun > 0) WriteNotRunReport(result); if (!options.noresult) { // Write xml output here string xmlResultFile = options.result == null || options.result == string.Empty ? "TestResult.xml" : options.result; using (StreamWriter writer = new StreamWriter(Path.Combine(workDir, xmlResultFile))) { writer.Write(xmlOutput); } } } returnCode = summary.ErrorsAndFailures; } if ( collector.HasExceptions ) { collector.WriteExceptions(); returnCode = UNEXPECTED_ERROR; } return returnCode; } }
public int Execute( ConsoleOptions options ) { TextWriter outWriter = Console.Out; bool redirectOutput = options.output != null && options.output != string.Empty; if ( redirectOutput ) { StreamWriter outStreamWriter = new StreamWriter( options.output ); outStreamWriter.AutoFlush = true; outWriter = outStreamWriter; } TextWriter errorWriter = Console.Error; bool redirectError = options.err != null && options.err != string.Empty; if ( redirectError ) { StreamWriter errorStreamWriter = new StreamWriter( options.err ); errorStreamWriter.AutoFlush = true; errorWriter = errorStreamWriter; } TestPackage package = MakeTestPackage(options); Console.WriteLine("ProcessModel: {0} DomainUsage: {1}", package.Settings.Contains("ProcessModel") ? package.Settings["ProcessModel"] : "Default", package.Settings.Contains("DomainUsage") ? package.Settings["DomainUsage"] : "Default"); Console.WriteLine("Execution Runtime: {0}", package.Settings.Contains("RuntimeFramework") ? package.Settings["RuntimeFramework"] : "Default"); using (TestRunner testRunner = new DefaultTestRunnerFactory().MakeTestRunner(package)) { testRunner.Load(package); if (testRunner.Test == null) { testRunner.Unload(); Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture); return FIXTURE_NOT_FOUND; } EventCollector collector = new EventCollector( options, outWriter, errorWriter ); TestFilter testFilter = TestFilter.Empty; if ( options.run != null && options.run != string.Empty ) { Console.WriteLine( "Selected test(s): " + options.run ); testFilter = new SimpleNameFilter( options.run ); } if ( options.include != null && options.include != string.Empty ) { Console.WriteLine( "Included categories: " + options.include ); TestFilter includeFilter = new CategoryExpression( options.include ).Filter; if ( testFilter.IsEmpty ) testFilter = includeFilter; else testFilter = new AndFilter( testFilter, includeFilter ); } if ( options.exclude != null && options.exclude != string.Empty ) { Console.WriteLine( "Excluded categories: " + options.exclude ); TestFilter excludeFilter = new NotFilter( new CategoryExpression( options.exclude ).Filter ); if ( testFilter.IsEmpty ) testFilter = excludeFilter; else if ( testFilter is AndFilter ) ((AndFilter)testFilter).Add( excludeFilter ); else testFilter = new AndFilter( testFilter, excludeFilter ); } if (testFilter is NotFilter) ((NotFilter)testFilter).TopLevel = true; TestResult result = null; string savedDirectory = Environment.CurrentDirectory; TextWriter savedOut = Console.Out; TextWriter savedError = Console.Error; try { result = testRunner.Run( collector, testFilter ); } finally { outWriter.Flush(); errorWriter.Flush(); if ( redirectOutput ) outWriter.Close(); if ( redirectError ) errorWriter.Close(); Environment.CurrentDirectory = savedDirectory; Console.SetOut( savedOut ); Console.SetError( savedError ); } Console.WriteLine(); int returnCode = UNEXPECTED_ERROR; if (result != null) { string xmlOutput = CreateXmlOutput(result); ResultSummarizer summary = new ResultSummarizer(result); if (options.xmlConsole) { Console.WriteLine(xmlOutput); } else { WriteSummaryReport(summary); if (summary.ErrorsAndFailures > 0) WriteErrorsAndFailuresReport(result); if (summary.TestsNotRun > 0) WriteNotRunReport(result); } // Write xml output here string xmlResultFile = options.xml == null || options.xml == string.Empty ? "TestResult.xml" : options.xml; using (StreamWriter writer = new StreamWriter(xmlResultFile)) { writer.Write(xmlOutput); } returnCode = summary.ErrorsAndFailures; } if ( collector.HasExceptions ) { collector.WriteExceptions(); returnCode = UNEXPECTED_ERROR; } return returnCode; } }
public int Execute( ConsoleOptions options ) { this.workDir = options.work; if (workDir == null || workDir == string.Empty) workDir = Environment.CurrentDirectory; else { workDir = Path.GetFullPath(workDir); if (!Directory.Exists(workDir)) Directory.CreateDirectory(workDir); } TextWriter outWriter = Console.Out; bool redirectOutput = options.output != null && options.output != string.Empty; if ( redirectOutput ) { StreamWriter outStreamWriter = new StreamWriter( Path.Combine(workDir, options.output) ); outStreamWriter.AutoFlush = true; outWriter = outStreamWriter; } TextWriter errorWriter = Console.Error; bool redirectError = options.err != null && options.err != string.Empty; if ( redirectError ) { StreamWriter errorStreamWriter = new StreamWriter( Path.Combine(workDir, options.err) ); errorStreamWriter.AutoFlush = true; errorWriter = errorStreamWriter; } TestPackage package = MakeTestPackage(options); ProcessModel processModel = package.Settings.Contains("ProcessModel") ? (ProcessModel)package.Settings["ProcessModel"] : ProcessModel.Default; DomainUsage domainUsage = package.Settings.Contains("DomainUsage") ? (DomainUsage)package.Settings["DomainUsage"] : DomainUsage.Default; RuntimeFramework framework = package.Settings.Contains("RuntimeFramework") ? (RuntimeFramework)package.Settings["RuntimeFramework"] : RuntimeFramework.CurrentFramework; #if CLR_2_0 || CLR_4_0 Console.WriteLine("ProcessModel: {0} DomainUsage: {1}", processModel, domainUsage); Console.WriteLine("Execution Runtime: {0}", framework); #else Console.WriteLine("DomainUsage: {0}", domainUsage); if (processModel != ProcessModel.Default && processModel != ProcessModel.Single) Console.WriteLine("Warning: Ignoring project setting 'processModel={0}'", processModel); if (!RuntimeFramework.CurrentFramework.Supports(framework)) Console.WriteLine("Warning: Ignoring project setting 'runtimeFramework={0}'", framework); #endif using (TestRunner testRunner = new DefaultTestRunnerFactory().MakeTestRunner(package)) { testRunner.Load(package); if (testRunner.Test == null) { testRunner.Unload(); Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture); return FIXTURE_NOT_FOUND; } EventCollector collector = new EventCollector( options, outWriter, errorWriter ); TestFilter testFilter; if(!CreateTestFilter(options, out testFilter)) return INVALID_ARG; TestResult result = null; string savedDirectory = Environment.CurrentDirectory; TextWriter savedOut = Console.Out; TextWriter savedError = Console.Error; try { result = testRunner.Run( collector, testFilter, false, LoggingThreshold.Off ); } finally { outWriter.Flush(); errorWriter.Flush(); if (redirectOutput) outWriter.Close(); if (redirectError) errorWriter.Close(); Environment.CurrentDirectory = savedDirectory; Console.SetOut( savedOut ); Console.SetError( savedError ); } Console.WriteLine(); int returnCode = UNEXPECTED_ERROR; if (result != null) { string xmlOutput = CreateXmlOutput(result); ResultSummarizer summary = new ResultSummarizer(result); if (options.xmlConsole) { Console.WriteLine(xmlOutput); } else { WriteSummaryReport(summary); bool hasErrors = summary.Errors > 0 || summary.Failures > 0 || result.IsError || result.IsFailure; if (options.stoponerror && (hasErrors || summary.NotRunnable > 0)) { Console.WriteLine("Test run was stopped after first error, as requested."); Console.WriteLine(); } if (hasErrors) WriteErrorsAndFailuresReport(result); if (summary.TestsNotRun > 0) WriteNotRunReport(result); if (!options.noresult) { // Write xml output here string xmlResultFile = options.result == null || options.result == string.Empty ? "TestResult.xml" : options.result; using (StreamWriter writer = new StreamWriter(Path.Combine(workDir, xmlResultFile))) { writer.Write(xmlOutput); } } } returnCode = summary.Errors + summary.Failures + summary.NotRunnable; } if (collector.HasExceptions) { collector.WriteExceptions(); returnCode = UNEXPECTED_ERROR; } return returnCode; } }
protected override int DoRun(Console.ConsoleOptions options, bool redirectOutput, bool redirectError, TestPackage package, TextWriter outWriter, TextWriter errorWriter, TestFilter testFilter, out TestResult result, EventCollector collector) { result = null; var testRunner1 = new DefaultTestRunnerFactory().MakeTestRunner(package); try { testRunner1.Load(package); if (testRunner1.Test == null) { testRunner1.Unload(); System.Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture); return FIXTURE_NOT_FOUND; } } finally { var disp = testRunner1 as IDisposable; if (disp != null) disp.Dispose(); } result = new TestResult(new TestName { Name = "Global" }); var timer = new Stopwatch(); timer.Start(); var testRunnerId = 0; { var syncTestRunner = new DefaultTestRunnerFactory().MakeTestRunner(package); var syncFilter = new AndFilter(testFilter, new SynchronousFilter()); var logger = new ConsoleLoggingEventListener(collector); result.AddResult(RunPartition(redirectOutput, redirectError, package, outWriter, errorWriter, syncFilter, syncTestRunner, logger)); testRunnerId = syncTestRunner.ID; } var dep = 0; var consoleOptions = options as ConsoleOptions; if (options != null) dep = consoleOptions.degreeofparallelism; if (dep == 0) dep = 4; System.Console.WriteLine("Degree of Parallelism: {0}", dep); var state = new AsynchronousFilterState(dep); var asyncTestRunner = new ParallelTestRunner(testRunnerId + 1, dep, state); result.AddResult(RunPartition(redirectOutput, redirectError, package, outWriter, errorWriter, testFilter, asyncTestRunner, collector)); if (consoleOptions != null && consoleOptions.retestfailures) { var failedTests = (from test in Flatten(result) where test.Result.IsFailure select test).ToList(); var failedTestFilter = new SimpleNameFilter(failedTests.Select(t => t.Result.FullName)); var retestTestRunner = new DefaultTestRunnerFactory().MakeTestRunner(package); var retestFilter = new AndFilter(testFilter, failedTestFilter); var logger = new ConsoleLoggingEventListener(collector); var retestResults = RunPartition(redirectOutput, redirectError, package, outWriter, errorWriter, retestFilter, retestTestRunner, logger); var newTests = Flatten(retestResults).ToDictionary(test => test.Result.FullName); foreach (var failedTest in failedTests) { var newTest = newTests[failedTest.Result.FullName]; if (newTest.Result.IsSuccess) { failedTest.Parent.Results.Remove(failedTest.Result); failedTest.Parent.Results.Add(newTest.Result); } } } result = MergeResults(result.Test, (TestResult)result.Results[0], (TestResult)result.Results[1]); timer.Stop(); result.Time = timer.ElapsedTicks / (double)TimeSpan.TicksPerSecond; return 0; }