/// <summary> /// Run selected tests asynchronously, notifying the listener interface as it progresses. /// </summary> /// <param name="listener">Interface to receive EventListener notifications.</param> /// <param name="filter">A test filter used to select tests to be run</param> /// <remarks> /// RunAsync is a template method, calling various abstract and /// virtual methods to be overridden by derived classes. /// </remarks> public void RunAsync(ITestListener listener, ITestFilter filter) { log.Info("Running tests"); if (LoadedTest == null) { throw new InvalidOperationException("Tests must be loaded before running them."); } _runComplete.Reset(); CreateTestExecutionContext(listener); TopLevelWorkItem = WorkItemBuilder.CreateWorkItem(LoadedTest, filter, true); TopLevelWorkItem.InitializeContext(Context); TopLevelWorkItem.Completed += OnRunCompleted; WrapInNUnitCallContext(() => StartRun(listener)); }
/// <summary> /// Run selected tests asynchronously, notifying the listener interface as it progresses. /// </summary> /// <param name="listener">Interface to receive EventListener notifications.</param> /// <param name="filter">A test filter used to select tests to be run</param> /// <remarks> /// RunAsync is a template method, calling various abstract and /// virtual methods to be overridden by derived classes. /// </remarks> public void RunAsync(ITestListener listener, ITestFilter filter) { log.Info("Running tests"); if (LoadedTest == null) { throw new InvalidOperationException("The Run method was called but no test has been loaded"); } _runComplete.Reset(); CreateTestExecutionContext(listener); TopLevelWorkItem = WorkItemBuilder.CreateWorkItem(LoadedTest, filter, true); TopLevelWorkItem.InitializeContext(Context); TopLevelWorkItem.Completed += OnRunCompleted; StartRun(listener); }
// This method can't currently be used. It would be more efficient // to run test cases using the command directly, but that would // cause errors in tests that have a timeout or that require a // separate thread or a specific apartment. Those features are // handled at the level of the WorkItem in the current build. // Therefore, we run all tests, both test cases and fixtures, // by creating a WorkItem and executing it. See the RunTest // method below. //public static ITestResult RunTestMethod(TestMethod testMethod, object fixture) //{ // TestExecutionContext context = new TestExecutionContext(); // context.CurrentTest = testMethod; // context.CurrentResult = testMethod.MakeTestResult(); // context.TestObject = fixture; // TestCommand command = testMethod.MakeTestCommand(); // return command.Execute(context); //} //public static ITestResult RunTest(Test test) //{ // return RunTest(test, null); //} public static ITestResult RunTest(Test test, object testObject) { var context = new TestExecutionContext { TestObject = testObject }; var work = WorkItemBuilder.CreateWorkItem(test, TestFilter.Empty); work.InitializeContext(context); work.Execute(); // TODO: Replace with an event - but not while method is static while (work.State != WorkItemState.Complete) { #if PORTABLE System.Threading.Tasks.Task.Delay(1); #else Thread.Sleep(1); #endif } return(work.Result); }