📄 testloader.cs
字号:
#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
/************************************************************************************
'
' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
' Copyright 2000-2002 Philip A. Craig
'
' This software is provided 'as-is', without any express or implied warranty. In no
' event will the authors be held liable for any damages arising from the use of this
' software.
'
' Permission is granted to anyone to use this software for any purpose, including
' commercial applications, and to alter it and redistribute it freely, subject to the
' following restrictions:
'
' 1. The origin of this software must not be misrepresented; you must not claim that
' you wrote the original software. If you use this software in a product, an
' acknowledgment (see the following) in the product documentation is required.
'
' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
' or Copyright 2000-2002 Philip A. Craig
'
' 2. Altered source versions must be plainly marked as such, and must not be
' misrepresented as being the original software.
'
' 3. This notice may not be removed or altered from any source distribution.
'
'***********************************************************************************/
#endregion
namespace NUnit.Util
{
using System;
using System.IO;
using System.Collections;
using System.Configuration;
using System.Threading;
using NUnit.Core;
/// <summary>
/// TestLoader handles interactions between a test runner and a
/// client program - typically the user interface - for the
/// purpose of loading, unloading and running tests.
///
/// It implemements the EventListener interface which is used by
/// the test runner and repackages those events, along with
/// others as individual events that clients may subscribe to
/// in collaboration with a TestEventDispatcher helper object.
///
/// TestLoader is quite handy for use with a gui client because
/// of the large number of events it supports. However, it has
/// no dependencies on ui components and can be used independently.
/// </summary>
public class TestLoader : LongLivingMarshalByRefObject, NUnit.Core.EventListener, ITestLoader
{
#region Instance Variables
/// <summary>
/// StdOut stream for use by the TestRunner
/// </summary>
private TextWriter stdOutWriter;
/// <summary>
/// StdErr stream for use by the TestRunner
/// </summary>
private TextWriter stdErrWriter;
/// <summary>
/// Our event dispatiching helper object
/// </summary>
private ProjectEventDispatcher events;
/// <summary>
/// Loads and executes tests. Non-null when
/// we have loaded a test.
/// </summary>
private TestDomain testDomain = null;
/// <summary>
/// Our current test project, if we have one.
/// </summary>
private NUnitProject testProject = null;
/// <summary>
/// The currently loaded test, returned by the testrunner
/// </summary>
private Test loadedTest = null;
/// <summary>
/// The test name that was specified when loading
/// </summary>
private string loadedTestName = null;
/// <summary>
/// The tests that are running
/// </summary>
private ITest[] runningTests = null;
/// <summary>
/// Result of the last test run
/// </summary>
private TestResult[] results = null;
/// <summary>
/// The last exception received when trying to load, unload or run a test
/// </summary>
private Exception lastException = null;
/// <summary>
/// Watcher fires when the assembly changes
/// </summary>
private AssemblyWatcher watcher;
/// <summary>
/// Assembly changed during a test and
/// needs to be reloaded later
/// </summary>
private bool reloadPending = false;
/// <summary>
/// Indicates whether to watch for changes
/// and reload the tests when a change occurs.
/// </summary>
private bool reloadOnChange = false;
/// <summary>
/// Indicates whether to reload the tests
/// before each run.
/// </summary>
private bool reloadOnRun = false;
private IFilter filter;
#endregion
#region Constructor
public TestLoader(TextWriter stdOutWriter, TextWriter stdErrWriter )
{
this.stdOutWriter = stdOutWriter;
this.stdErrWriter = stdErrWriter;
this.events = new ProjectEventDispatcher();
}
#endregion
#region Properties
public bool IsProjectLoaded
{
get { return testProject != null; }
}
public bool IsTestLoaded
{
get { return loadedTest != null; }
}
public bool IsTestRunning
{
get { return runningTests != null; }
}
public NUnitProject TestProject
{
get { return testProject; }
set { OnProjectLoad( value ); }
}
public IProjectEvents Events
{
get { return events; }
}
public string TestFileName
{
get { return testProject.ProjectPath; }
}
public TestResult[] Results
{
get { return results; }
}
public Exception LastException
{
get { return lastException; }
}
public bool ReloadOnChange
{
get { return reloadOnChange; }
set { reloadOnChange = value; }
}
public bool ReloadOnRun
{
get { return reloadOnRun; }
set { reloadOnRun = value; }
}
public Version FrameworkVersion
{
get { return this.testDomain.FrameworkVersion; }
}
#endregion
#region EventListener Handlers
void EventListener.RunStarted(Test[] tests)
{
int count = 0;
foreach( Test test in tests )
count += filter == null ? test.CountTestCases() : test.CountTestCases( filter );
events.FireRunStarting( tests, count );
}
void EventListener.RunFinished(NUnit.Core.TestResult[] results)
{
this.results = results;
events.FireRunFinished( results );
runningTests = null;
}
void EventListener.RunFinished(Exception exception)
{
this.lastException = exception;
events.FireRunFinished( exception );
runningTests = null;
}
/// <summary>
/// Trigger event when each test starts
/// </summary>
/// <param name="testCase">TestCase that is starting</param>
void EventListener.TestStarted(NUnit.Core.TestCase testCase)
{
events.FireTestStarting( testCase );
}
/// <summary>
/// Trigger event when each test finishes
/// </summary>
/// <param name="result">Result of the case that finished</param>
void EventListener.TestFinished(TestCaseResult result)
{
events.FireTestFinished( result );
}
/// <summary>
/// Trigger event when each suite starts
/// </summary>
/// <param name="suite">Suite that is starting</param>
void EventListener.SuiteStarted(TestSuite suite)
{
events.FireSuiteStarting( suite );
}
/// <summary>
/// Trigger event when each suite finishes
/// </summary>
/// <param name="result">Result of the suite that finished</param>
void EventListener.SuiteFinished(TestSuiteResult result)
{
events.FireSuiteFinished( result );
}
/// <summary>
/// Trigger event when an unhandled exception occurs during a test
/// </summary>
/// <param name="exception">The unhandled exception</param>
void EventListener.UnhandledException(Exception exception)
{
events.FireTestException( exception );
}
#endregion
#region Methods for Loading and Unloading Projects
/// <summary>
/// Create a new project with default naming
/// </summary>
public void NewProject()
{
try
{
events.FireProjectLoading( "New Project" );
OnProjectLoad( NUnitProject.NewProject() );
}
catch( Exception exception )
{
lastException = exception;
events.FireProjectLoadFailed( "New Project", exception );
}
}
/// <summary>
/// Create a new project using a given path
/// </summary>
public void NewProject( string filePath )
{
try
{
events.FireProjectLoading( filePath );
NUnitProject project = new NUnitProject( filePath );
project.Configs.Add( "Debug" );
project.Configs.Add( "Release" );
project.IsDirty = false;
OnProjectLoad( project );
}
catch( Exception exception )
{
lastException = exception;
events.FireProjectLoadFailed( filePath, exception );
}
}
/// <summary>
/// Load a new project, optionally selecting the config and fire events
/// </summary>
public void LoadProject( string filePath, string configName )
{
try
{
events.FireProjectLoading( filePath );
NUnitProject newProject = NUnitProject.LoadProject( filePath );
if ( configName != null )
{
newProject.SetActiveConfig( configName );
newProject.IsDirty = false;
}
OnProjectLoad( newProject );
// return true;
}
catch( Exception exception )
{
lastException = exception;
events.FireProjectLoadFailed( filePath, exception );
// return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -