Browse Source

When running unit tests in multiple projects, perform a single build for all those projects before executing any tests.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6049 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
08c1792353
  1. 21
      src/AddIns/Analysis/UnitTesting/Src/AbstractRunTestCommands.cs
  2. 44
      src/AddIns/Analysis/UnitTesting/Src/BuildProjectBeforeTestRun.cs
  3. 4
      src/AddIns/Analysis/UnitTesting/Src/IBuildProjectFactory.cs
  4. 50
      src/AddIns/Analysis/UnitTesting/Src/MultipleProjectBuildable.cs
  5. 6
      src/AddIns/Analysis/UnitTesting/Src/UnitTestBuildProjectFactory.cs
  6. 50
      src/AddIns/Analysis/UnitTesting/Test/Tree/BuildProjectBeforeTestRunTestFixture.cs
  7. 2
      src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestCommandBeforeRunTestFixture.cs
  8. 4
      src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestWithDebuggerCommandTestFixtureBase.cs
  9. 6
      src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestsWithoutBuildingProjectTestFixture.cs
  10. 6
      src/AddIns/Analysis/UnitTesting/Test/Tree/RunTwoProjectsTestsTestFixture.cs
  11. 4
      src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj
  12. 9
      src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectBeforeTestRun.cs
  13. 7
      src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectFactory.cs
  14. 4
      src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockBuildProjectBeforeTestRunTestFixture.cs
  15. 2
      src/AddIns/Analysis/UnitTesting/UnitTesting.csproj
  16. 10
      src/Main/Base/Project/Src/Commands/BuildCommands.cs

21
src/AddIns/Analysis/UnitTesting/Src/AbstractRunTestCommands.cs

@ -6,12 +6,14 @@ @@ -6,12 +6,14 @@
// </file>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.UnitTesting
{
@ -60,7 +62,7 @@ namespace ICSharpCode.UnitTesting @@ -60,7 +62,7 @@ namespace ICSharpCode.UnitTesting
if (selectedTests.HasProjects) {
runningTestCommand = this;
BeforeRun();
RunTests();
BuildAndRunTests();
}
}
@ -91,7 +93,7 @@ namespace ICSharpCode.UnitTesting @@ -91,7 +93,7 @@ namespace ICSharpCode.UnitTesting
OnBeforeRunTests();
}
void RunTests()
void BuildAndRunTests()
{
if (IsBuildNeededBeforeTestRun()) {
BuildProjectBeforeRunningTests(selectedTests);
@ -103,7 +105,7 @@ namespace ICSharpCode.UnitTesting @@ -103,7 +105,7 @@ namespace ICSharpCode.UnitTesting
bool IsBuildNeededBeforeTestRun()
{
return context.RegisteredTestFrameworks.IsBuildNeededBeforeTestRunForProject(selectedTests.Project);
return selectedTests.Projects.Any(p => context.RegisteredTestFrameworks.IsBuildNeededBeforeTestRunForProject(p));
}
void ClearTasks()
@ -138,20 +140,21 @@ namespace ICSharpCode.UnitTesting @@ -138,20 +140,21 @@ namespace ICSharpCode.UnitTesting
}
/// <summary>
/// Runs the tests after building the project under test.
/// Runs the tests after building the project(s) under test.
/// </summary>
void BuildProjectBeforeRunningTests(SelectedTests selectedTests)
{
BuildProjectBeforeTestRun build = CreateBuildProjectBeforeTestRun(selectedTests);
BuildProject build = CreateBuildProjectBeforeTestRun(selectedTests);
build.BuildComplete += delegate {
OnBuildComplete(build.LastBuildResults, selectedTests);
};
build.Run();
}
BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(SelectedTests selectedTests)
BuildProject CreateBuildProjectBeforeTestRun(SelectedTests selectedTests)
{
return context.BuildProjectFactory.CreateBuildProjectBeforeTestRun(selectedTests.Project);
var projects = selectedTests.Projects.Where(p => context.RegisteredTestFrameworks.IsBuildNeededBeforeTestRunForProject(p));
return context.BuildProjectFactory.CreateBuildProjectBeforeTestRun(projects);
}
/// <summary>
@ -197,7 +200,7 @@ namespace ICSharpCode.UnitTesting @@ -197,7 +200,7 @@ namespace ICSharpCode.UnitTesting
StopActiveTestRunner();
selectedTests.RemoveFirstProject();
if (selectedTests.HasProjects) {
RunTests();
RunTests(selectedTests);
} else {
runningTestCommand = null;
UpdateUnitTestsPadToolbar();

44
src/AddIns/Analysis/UnitTesting/Src/BuildProjectBeforeTestRun.cs

@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.UnitTesting
{
/// <summary>
/// Custom build command that makes sure errors and warnings
/// are not cleared from the Errors list before every build since
/// we may be running multiple tests after each other.
/// </summary>
public class BuildProjectBeforeTestRun : BuildProjectBeforeExecute
{
IUnitTestSaveAllFilesCommand saveAllFilesCommand;
public BuildProjectBeforeTestRun(IProject targetProject,
IUnitTestSaveAllFilesCommand saveAllFilesCommand)
: base(targetProject)
{
this.saveAllFilesCommand = saveAllFilesCommand;
}
public BuildProjectBeforeTestRun(IProject targetProject)
: this(targetProject, new UnitTestSaveAllFilesCommand())
{
}
/// <summary>
/// Before a build do not clear the tasks, just save any
/// dirty files.
/// </summary>
public override void BeforeBuild()
{
saveAllFilesCommand.SaveAllFiles();
}
}
}

4
src/AddIns/Analysis/UnitTesting/Src/IBuildProjectFactory.cs

@ -6,12 +6,14 @@ @@ -6,12 +6,14 @@
// </file>
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.UnitTesting
{
public interface IBuildProjectFactory
{
BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(IProject project);
BuildProject CreateBuildProjectBeforeTestRun(IEnumerable<IProject> projects);
}
}

50
src/AddIns/Analysis/UnitTesting/Src/MultipleProjectBuildable.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.UnitTesting
{
/// <summary>
/// IBuildable implementation that builds several projects.
/// </summary>
public class MultipleProjectBuildable : IBuildable
{
readonly IBuildable[] projects;
public MultipleProjectBuildable(IEnumerable<IBuildable> projects)
{
this.projects = projects.ToArray();
}
public string Name {
get { return string.Empty; }
}
public Solution ParentSolution {
get { return projects.Length > 0 ? projects[0].ParentSolution : null; }
}
public ICollection<IBuildable> GetBuildDependencies(ProjectBuildOptions buildOptions)
{
return projects;
}
public void StartBuild(ProjectBuildOptions buildOptions, IBuildFeedbackSink feedbackSink)
{
// SharpDevelop already has built our dependencies, so we're done immediately.
feedbackSink.Done(true);
}
public ProjectBuildOptions CreateProjectBuildOptions(BuildOptions options, bool isRootBuildable)
{
return null;
}
}
}

6
src/AddIns/Analysis/UnitTesting/Src/UnitTestBuildProjectFactory.cs

@ -6,15 +6,17 @@ @@ -6,15 +6,17 @@
// </file>
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.UnitTesting
{
public class UnitTestBuildProjectFactory : IBuildProjectFactory
{
public BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(IProject project)
public BuildProject CreateBuildProjectBeforeTestRun(IEnumerable<IProject> projects)
{
return new BuildProjectBeforeTestRun(project);
return new BuildProjectBeforeExecute(new MultipleProjectBuildable(projects));
}
}
}

50
src/AddIns/Analysis/UnitTesting/Test/Tree/BuildProjectBeforeTestRunTestFixture.cs

@ -1,50 +0,0 @@ @@ -1,50 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.UnitTesting;
using NUnit.Framework;
using UnitTesting.Tests.Utils;
namespace UnitTesting.Tests.Tree
{
[TestFixture]
public class BuildProjectBeforeTestRunTestFixture
{
BuildProjectBeforeTestRun buildProjectBeforeTestRun;
MockSaveAllFilesCommand saveAllFilesCommand;
MockCSharpProject project;
[SetUp]
public void Init()
{
if (!PropertyService.Initialized) {
PropertyService.InitializeServiceForUnitTests();
}
saveAllFilesCommand = new MockSaveAllFilesCommand();
project = new MockCSharpProject();
BuildResults buildResults = new BuildResults();
buildProjectBeforeTestRun = new BuildProjectBeforeTestRun(project, saveAllFilesCommand);
}
[Test]
public void SaveAllFilesCommandNotCalledInitially()
{
Assert.IsFalse(saveAllFilesCommand.IsSaveAllFilesMethodCalled);
}
[Test]
public void BeforeBuildMethodSavesAllFiles()
{
buildProjectBeforeTestRun.BeforeBuild();
Assert.IsTrue(saveAllFilesCommand.IsSaveAllFilesMethodCalled);
}
}
}

2
src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestCommandBeforeRunTestFixture.cs

@ -153,7 +153,7 @@ namespace UnitTesting.Tests.Tree @@ -153,7 +153,7 @@ namespace UnitTesting.Tests.Tree
public void BuildProjectBeforeTestRunIsCreatedWhenRunMethodCalled()
{
runTestCommand.Run();
Assert.AreEqual(project, buildProjectBeforeTestRun.Project);
Assert.AreEqual(new[] { project }, buildProjectBeforeTestRun.Projects);
}
[Test]

4
src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestWithDebuggerCommandTestFixtureBase.cs

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
using System;
using ICSharpCode.Core;
using ICSharpCode.UnitTesting;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using UnitTesting.Tests.Utils;
@ -60,7 +60,7 @@ namespace UnitTesting.Tests.Tree @@ -60,7 +60,7 @@ namespace UnitTesting.Tests.Tree
public void ExpectedBuildProjectReturnedFromBuildFactory()
{
InitBase();
Assert.AreEqual(buildProject, context.MockBuildProjectFactory.CreateBuildProjectBeforeTestRun(null));
Assert.AreEqual(buildProject, context.MockBuildProjectFactory.CreateBuildProjectBeforeTestRun(new IProject[0]));
}
[Test]

6
src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestsWithoutBuildingProjectTestFixture.cs

@ -72,11 +72,13 @@ namespace UnitTesting.Tests.Tree @@ -72,11 +72,13 @@ namespace UnitTesting.Tests.Tree
}
[Test]
public void WhenTestRunCompletedAllFilesAreSaved()
public void WhenTestRunCompletedAllFilesAreNotSavedAgain()
{
// feature change 2010/07/05: we save all files only once
// during the build, not whenever a new test run starts
context.MockSaveAllFilesCommand.IsSaveAllFilesMethodCalled = false;
runTestCommand.CallTestsCompleted();
Assert.IsTrue(context.MockSaveAllFilesCommand.IsSaveAllFilesMethodCalled);
Assert.IsFalse(context.MockSaveAllFilesCommand.IsSaveAllFilesMethodCalled);
}
}
}

6
src/AddIns/Analysis/UnitTesting/Test/Tree/RunTwoProjectsTestsTestFixture.cs

@ -20,7 +20,6 @@ namespace UnitTesting.Tests.Tree @@ -20,7 +20,6 @@ namespace UnitTesting.Tests.Tree
TestProject testProject2;
MockCSharpProject project2;
MockBuildProjectBeforeTestRun buildProject1;
MockBuildProjectBeforeTestRun buildProject2;
[SetUp]
public void Init()
@ -41,10 +40,8 @@ namespace UnitTesting.Tests.Tree @@ -41,10 +40,8 @@ namespace UnitTesting.Tests.Tree
context.MockUnitTestsPad.AddTestProject(testProject2);
buildProject1 = new MockBuildProjectBeforeTestRun();
buildProject2 = new MockBuildProjectBeforeTestRun();
context.MockBuildProjectFactory.AddBuildProjectBeforeTestRun(buildProject1);
context.MockBuildProjectFactory.AddBuildProjectBeforeTestRun(buildProject2);
runTestCommand.Run();
@ -61,7 +58,8 @@ namespace UnitTesting.Tests.Tree @@ -61,7 +58,8 @@ namespace UnitTesting.Tests.Tree
[Test]
public void SecondProjectIsBuilt()
{
Assert.IsTrue(buildProject2.IsRunMethodCalled);
Assert.IsTrue(buildProject1.IsRunMethodCalled);
Assert.AreEqual(new[] { project1, project2 }, buildProject1.Projects);
}
[Test]

4
src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj

@ -55,6 +55,9 @@ @@ -55,6 +55,9 @@
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
@ -94,7 +97,6 @@ @@ -94,7 +97,6 @@
<Compile Include="Project\TwoBaseClassesWithTestMethodsTestFixture.cs" />
<Compile Include="Tree\AddNUnitReferenceToProjectTestFixture.cs" />
<Compile Include="Tree\BuildErrorWhenRunningTestsTestFixture.cs" />
<Compile Include="Tree\BuildProjectBeforeTestRunTestFixture.cs" />
<Compile Include="Tree\ClassTestFixtureSelectedTestFixture.cs" />
<Compile Include="Tree\GoToSelectedBaseClassMethodTestFixture.cs" />
<Compile Include="Tree\GoToSelectedClassTestFixture.cs" />

9
src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectBeforeTestRun.cs

@ -7,13 +7,13 @@ @@ -7,13 +7,13 @@
using System;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
using ICSharpCode.UnitTesting;
namespace UnitTesting.Tests.Utils
{
public class MockBuildProjectBeforeTestRun : BuildProjectBeforeTestRun
public class MockBuildProjectBeforeTestRun : BuildProjectBeforeExecute
{
IProject project;
bool runMethodCalled;
public MockBuildProjectBeforeTestRun()
@ -21,10 +21,7 @@ namespace UnitTesting.Tests.Utils @@ -21,10 +21,7 @@ namespace UnitTesting.Tests.Utils
{
}
public IProject Project {
get { return project; }
set { project = value; }
}
public IProject[] Projects { get; set; }
public void FireBuildCompleteEvent()
{

7
src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectFactory.cs

@ -7,7 +7,10 @@ @@ -7,7 +7,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
using ICSharpCode.UnitTesting;
namespace UnitTesting.Tests.Utils
@ -16,11 +19,11 @@ namespace UnitTesting.Tests.Utils @@ -16,11 +19,11 @@ namespace UnitTesting.Tests.Utils
{
List<MockBuildProjectBeforeTestRun> buildProjectInstances = new List<MockBuildProjectBeforeTestRun>();
public BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(IProject project)
public BuildProject CreateBuildProjectBeforeTestRun(IEnumerable<IProject> projects)
{
MockBuildProjectBeforeTestRun buildProject = RemoveBuildProjectInstance();
if (buildProject != null) {
buildProject.Project = project;
buildProject.Projects = projects.ToArray();
}
return buildProject;
}

4
src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockBuildProjectBeforeTestRunTestFixture.cs

@ -28,7 +28,7 @@ namespace UnitTesting.Tests.Utils.Tests @@ -28,7 +28,7 @@ namespace UnitTesting.Tests.Utils.Tests
buildProject = new MockBuildProjectBeforeTestRun();
factory.AddBuildProjectBeforeTestRun(buildProject);
createdBuildProject = factory.CreateBuildProjectBeforeTestRun(project) as MockBuildProjectBeforeTestRun;
createdBuildProject = factory.CreateBuildProjectBeforeTestRun(new[] { project }) as MockBuildProjectBeforeTestRun;
}
[Test]
@ -40,7 +40,7 @@ namespace UnitTesting.Tests.Utils.Tests @@ -40,7 +40,7 @@ namespace UnitTesting.Tests.Utils.Tests
[Test]
public void ProjectPassedToBuildProjectObject()
{
Assert.AreEqual(project, buildProject.Project);
Assert.AreEqual(new[] { project }, buildProject.Projects);
}
[Test]

2
src/AddIns/Analysis/UnitTesting/UnitTesting.csproj

@ -57,6 +57,7 @@ @@ -57,6 +57,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Src\MultipleProjectBuildable.cs" />
<Compile Include="Src\UnitTestAddInTree.cs" />
<Compile Include="Src\UnitTestBuildOptions.cs" />
<Compile Include="Src\UnitTestBuildProjectFactory.cs" />
@ -74,7 +75,6 @@ @@ -74,7 +75,6 @@
</None>
<Compile Include="Src\AllTestsTreeNode.cs" />
<Compile Include="Src\BaseTestMethod.cs" />
<Compile Include="Src\BuildProjectBeforeTestRun.cs" />
<Compile Include="Src\EmptyUnitTestsPad.cs" />
<Compile Include="Src\IAddInTree.cs" />
<Compile Include="Src\IBuildOptions.cs" />

10
src/Main/Base/Project/Src/Commands/BuildCommands.cs

@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public class BuildProjectBeforeExecute : BuildProject
{
public BuildProjectBeforeExecute(IProject project) : base(project)
public BuildProjectBeforeExecute(IBuildable project) : base(project)
{
}
@ -162,8 +162,8 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -162,8 +162,8 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public abstract class AbstractProjectBuildMenuCommand : AbstractBuildMenuCommand
{
protected IProject targetProject;
protected IProject ProjectToBuild {
protected IBuildable targetProject;
protected IBuildable ProjectToBuild {
get {
return targetProject ?? ProjectService.CurrentProject;
}
@ -180,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -180,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public BuildProject()
{
}
public BuildProject(IProject targetProject)
public BuildProject(IBuildable targetProject)
{
this.targetProject = targetProject;
}
@ -194,7 +194,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -194,7 +194,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public class RebuildProject : BuildProject
{
public RebuildProject() {}
public RebuildProject(IProject targetProject) : base(targetProject) {}
public RebuildProject(IBuildable targetProject) : base(targetProject) {}
public override void StartBuild()
{

Loading…
Cancel
Save