📄 testloader.cs
字号:
}
/// <summary>
/// Load a new project using the default config and fire events
/// </summary>
public void LoadProject( string filePath )
{
LoadProject( filePath, null );
}
/// <summary>
/// Load a project from a list of assemblies and fire events
/// </summary>
public void LoadProject( string[] assemblies )
{
try
{
events.FireProjectLoading( "New Project" );
NUnitProject newProject = NUnitProject.FromAssemblies( assemblies );
OnProjectLoad( newProject );
// return true;
}
catch( Exception exception )
{
lastException = exception;
events.FireProjectLoadFailed( "New Project", exception );
// return false;
}
}
/// <summary>
/// Unload the current project and fire events
/// </summary>
public void UnloadProject()
{
string testFileName = TestFileName;
try
{
events.FireProjectUnloading( testFileName );
if ( testFileName != null && File.Exists( testFileName ) )
UserSettings.RecentProjects.RecentFile = testFileName;
if ( IsTestLoaded )
UnloadTest();
testProject.Changed -= new ProjectEventHandler( OnProjectChanged );
testProject = null;
events.FireProjectUnloaded( testFileName );
}
catch (Exception exception )
{
lastException = exception;
events.FireProjectUnloadFailed( testFileName, exception );
}
}
/// <summary>
/// Common operations done each time a project is loaded
/// </summary>
/// <param name="testProject">The newly loaded project</param>
private void OnProjectLoad( NUnitProject testProject )
{
if ( IsProjectLoaded )
UnloadProject();
this.testProject = testProject;
testProject.Changed += new ProjectEventHandler( OnProjectChanged );
events.FireProjectLoaded( TestFileName );
}
private void OnProjectChanged( object sender, ProjectEventArgs e )
{
switch ( e.type )
{
case ProjectChangeType.ActiveConfig:
if( TestProject.IsLoadable )
LoadTest();
break;
case ProjectChangeType.AddConfig:
case ProjectChangeType.UpdateConfig:
if ( e.configName == TestProject.ActiveConfigName && TestProject.IsLoadable )
LoadTest();
break;
case ProjectChangeType.RemoveConfig:
if ( IsTestLoaded && TestProject.Configs.Count == 0 )
UnloadTest();
break;
default:
break;
}
}
#endregion
#region Methods for Loading and Unloading Tests
public void LoadTest()
{
LoadTest( null );
}
public void LoadTest( string testName )
{
try
{
events.FireTestLoading( TestFileName );
testDomain = new TestDomain( stdOutWriter, stdErrWriter );
Test test = testDomain.Load( TestProject, testName );
TestSuite suite = test as TestSuite;
if ( suite != null )
suite.Sort();
loadedTest = test;
loadedTestName = testName;
results = null;
reloadPending = false;
if ( ReloadOnChange )
InstallWatcher( );
if ( suite != null )
events.FireTestLoaded( TestFileName, this.loadedTest );
else
{
lastException = new ApplicationException( string.Format ( "Unable to find test {0} in assembly", testName ) );
events.FireTestLoadFailed( TestFileName, lastException );
}
}
catch( FileNotFoundException exception )
{
lastException = exception;
foreach( string assembly in TestProject.ActiveConfig.AbsolutePaths )
{
if ( Path.GetFileNameWithoutExtension( assembly ) == exception.FileName &&
!ProjectPath.SamePathOrUnder( testProject.ActiveConfig.BasePath, assembly ) )
{
lastException = new ApplicationException( string.Format( "Unable to load {0} because it is not located under the AppBase", exception.FileName ), exception );
break;
}
}
events.FireTestLoadFailed( TestFileName, lastException );
}
catch( Exception exception )
{
lastException = exception;
events.FireTestLoadFailed( TestFileName, exception );
}
}
/// <summary>
/// Unload the current test suite and fire the Unloaded event
/// </summary>
public void UnloadTest( )
{
if( IsTestLoaded )
{
// Hold the name for notifications after unload
string fileName = TestFileName;
try
{
events.FireTestUnloading( TestFileName, this.loadedTest );
RemoveWatcher();
testDomain.Unload();
testDomain = null;
loadedTest = null;
loadedTestName = null;
results = null;
reloadPending = false;
events.FireTestUnloaded( fileName, this.loadedTest );
}
catch( Exception exception )
{
lastException = exception;
events.FireTestUnloadFailed( fileName, exception );
}
}
}
/// <summary>
/// Reload the current test on command
/// </summary>
public void ReloadTest()
{
OnTestChanged( TestFileName );
}
/// <summary>
/// Handle watcher event that signals when the loaded assembly
/// file has changed. Make sure it's a real change before
/// firing the SuiteChangedEvent. Since this all happens
/// asynchronously, we use an event to let ui components
/// know that the failure happened.
/// </summary>
/// <param name="assemblyFileName">Assembly file that changed</param>
public void OnTestChanged( string testFileName )
{
if ( IsTestRunning )
reloadPending = true;
else
try
{
events.FireTestReloading( testFileName, this.loadedTest );
// Don't unload the old domain till after the event
// handlers get a chance to compare the trees.
TestDomain newDomain = new TestDomain( stdOutWriter, stdErrWriter );
Test newTest = newDomain.Load( testProject, loadedTestName );
TestSuite suite = newTest as TestSuite;
if ( suite != null )
suite.Sort();
testDomain.Unload();
testDomain = newDomain;
loadedTest = newTest;
reloadPending = false;
events.FireTestReloaded( testFileName, newTest );
}
catch( Exception exception )
{
lastException = exception;
events.FireTestReloadFailed( testFileName, exception );
}
}
#endregion
#region Methods for Running Tests
public void SetFilter( IFilter filter )
{
this.filter = filter;
}
/// <summary>
/// Run the currently loaded top level test suite
/// </summary>
public void RunLoadedTest()
{
RunTest( loadedTest );
}
/// <summary>
/// Run a testcase or testsuite from the currrent tree
/// firing the RunStarting and RunFinished events.
/// Silently ignore the call if a test is running
/// to allow for latency in the UI.
/// </summary>
/// <param name="testName">The test to be run</param>
public void RunTest( ITest test )
{
RunTests( new ITest[] { test } );
}
public void RunTests( ITest[] tests )
{
if ( !IsTestRunning )
{
if ( reloadPending || ReloadOnRun )
ReloadTest();
runningTests = tests;
//kind of silly
string[] testNames = new string[ runningTests.Length ];
int index = 0;
foreach (ITest node in runningTests)
testNames[index++] = node.UniqueName;
testDomain.SetFilter( filter );
testDomain.DisplayTestLabels = UserSettings.Options.TestLabels;
testDomain.RunTest( this, testNames );
}
}
/// <summary>
/// Cancel the currently running test.
/// Fail silently if there is none to
/// allow for latency in the UI.
/// </summary>
public void CancelTestRun()
{
if ( IsTestRunning )
testDomain.CancelRun();
}
public IList GetCategories()
{
ArrayList list = new ArrayList();
list.AddRange(testDomain.GetCategories());
return list;
}
#endregion
#region Helper Methods
/// <summary>
/// Install our watcher object so as to get notifications
/// about changes to a test.
/// </summary>
/// <param name="assemblyFileName">Full path of the assembly to watch</param>
private void InstallWatcher()
{
if(watcher!=null) watcher.Stop();
watcher = new AssemblyWatcher( 1000, TestProject.ActiveConfig.AbsolutePaths );
watcher.AssemblyChangedEvent += new AssemblyWatcher.AssemblyChangedHandler( OnTestChanged );
watcher.Start();
}
/// <summary>
/// Stop and remove our current watcher object.
/// </summary>
private void RemoveWatcher()
{
if ( watcher != null )
{
watcher.Stop();
watcher = null;
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -