<nunit2>
<test>
<includesList name="tests.txt" />
</test>
</nunit2>to run all of the tests in "test.txt". It still supports the old syntax.
Any objections?
Matt.
? patch.txt
? pathc.txt
Index: NUnit2Task.cs
===================================================================
RCS file: /cvsroot/nant/nant/src/NAnt.NUnitTasks/NUnit2/NUnit2Task.cs,v
retrieving revision 1.5
diff -u -r1.5 NUnit2Task.cs
--- NUnit2Task.cs 25 Feb 2003 23:15:35 -0000 1.5
+++ NUnit2Task.cs 11 Mar 2003 19:29:51 -0000
@@ -26,6 +26,7 @@
using System.Reflection;
using System.Resources;
using System.Collections;
+using System.Collections.Specialized;
using System.Text;
using SourceForge.NAnt.Attributes;
using SourceForge.NAnt.Tasks.NUnit.Formatters;
@@ -44,7 +45,17 @@
/// <code>
/// <![CDATA[
/// <nunit2>
- /// <test assemblyname="MyProject.Tests.dll" outfile="results.xml"/>
+ /// <test assemblyname="MyProject.Tests.dll"/>
+ /// </nunit2>
+ /// ]]>
+ /// </code>
+ /// <para>Run all tests in files listed in the <c>tests.txt</c> file.</para>
+ /// <code>
+ /// <![CDATA[
+ /// <nunit2>
+ /// <test>
+ /// <includesList name="tests.txt" />
+ /// </test>
/// </nunit2>
/// ]]>
/// </code>
@@ -53,14 +64,14 @@
public class NUnit2Task : Task {
private bool _haltOnFailure;
private ArrayList tests = new ArrayList();
-
+
/// <summary>Stop the build process if a test fails.</summary>
[TaskAttribute("haltonfailure")]
[BooleanValidator()]
public bool HaltOnFailure { get { return _haltOnFailure; } set {
_haltOnFailure = value; }}
-
+
FormatterElementCollection _formatterElements = new
FormatterElementCollection();
-
+
protected override void InitializeTask(XmlNode taskNode) {
foreach (XmlNode testNode in taskNode) {
if(testNode.Name.Equals("test")) {
@@ -70,7 +81,7 @@
tests.Add(test);
}
}
-
+
// now get formatters
foreach (XmlNode formatterNode in taskNode) {
if(formatterNode.Name.Equals("formatter")) {
@@ -91,63 +102,77 @@
protected override void ExecuteTask() {
foreach (NUnit2Test test in tests) {
EventListener listener = new NullListener();
- TestResult result = RunRemoteTest(test, listener);
-
- string xmlResultFile = test.AssemblyName + "-results.xml";
-
- XmlResultVisitor resultVisitor = new XmlResultVisitor(xmlResultFile,
result);
- result.Accept(resultVisitor);
- resultVisitor.Write();
-
- foreach (FormatterElement formatter in _formatterElements) {
- if (formatter.Type == FormatterType.Xml) {
- if (!formatter.UseFile) {
- using (StreamReader reader = new
StreamReader(xmlResultFile)) {
- // strip off the xml header
- reader.ReadLine();
- StringBuilder builder = new StringBuilder();
- while (reader.Peek() > -1)
-
builder.Append(reader.ReadLine().Trim()).Append("\n");
- Log.WriteLine(builder.ToString());
+ TestResult[] results = RunRemoteTest(test, listener);
+ StringCollection assemblies = GetTestAssemblies(test);
+ for ( int i = 0; i < results.Length; i++ ) {
+
+ string assemblyFile = assemblies[ i ];
+ TestResult result = results[ i ];
+
+ string xmlResultFile = assemblyFile + "-results.xml";
+
+ XmlResultVisitor resultVisitor = new
XmlResultVisitor(xmlResultFile, result);
+ result.Accept(resultVisitor);
+ resultVisitor.Write();
+
+ foreach (FormatterElement formatter in _formatterElements) {
+ if (formatter.Type == FormatterType.Xml) {
+ if (!formatter.UseFile) {
+ using (StreamReader reader = new
StreamReader(xmlResultFile)) {
+ // strip off the xml header
+ reader.ReadLine();
+ StringBuilder builder = new StringBuilder();
+ while (reader.Peek() > -1)
+
builder.Append(reader.ReadLine().Trim()).Append("\n");
+ Log.WriteLine(builder.ToString());
+ }
}
+ } else if (formatter.Type == FormatterType.Plain) {
+ TextWriter writer;
+ if (formatter.UseFile) {
+ writer = new StreamWriter(assemblyFile + "-results" +
formatter.Extension);
+ } else {
+ writer = new LogWriter();
+ }
+ CreateSummaryDocument(xmlResultFile, writer, test);
+ writer.Close();
}
- } else if (formatter.Type == FormatterType.Plain) {
- TextWriter writer;
- if (formatter.UseFile) {
- writer = new StreamWriter(test.AssemblyName + "-results"
+ formatter.Extension);
- } else {
- writer = new LogWriter();
- }
- CreateSummaryDocument(xmlResultFile, writer, test);
- writer.Close();
}
+ if (result.IsFailure && (test.HaltOnFailure || HaltOnFailure)) {
+ throw new BuildException("Tests Failed");
+ }
}
- if (result.IsFailure && (test.HaltOnFailure || HaltOnFailure)) {
- throw new BuildException("Tests Failed");
- }
}
}
-
- private TestResult RunRemoteTest(NUnit2Test test, EventListener listener) {
+
+ private StringCollection GetTestAssemblies(NUnit2Test test) {
+ StringCollection files = new StringCollection();
+
+ if ( test.AssemblyName != null )
+ files.Add( test.AssemblyName );
+ else
+ files = test.Assemblies.FileNames;
+
+ return files;
+ }
+
+ private TestResult[] RunRemoteTest(NUnit2Test test, EventListener listener) {
LogWriter writer = new LogWriter();
NUnit2TestDomain domain = new NUnit2TestDomain(writer, writer);
- if ( test.TestName != null ) {
- return domain.RunTest(test.TestName, test.AssemblyName,
test.AppConfigFile, listener);
- } else {
- return domain.Run(test.AssemblyName, test.AppConfigFile, listener);
- }
+
+ return domain.RunTest(test.TestName, GetTestAssemblies(test),
test.AppConfigFile, listener);
}
-
+
private void CreateSummaryDocument(string resultFile, TextWriter writer,
NUnit2Test test) {
XPathDocument originalXPathDocument = new XPathDocument (resultFile);
XslTransform summaryXslTransform = new XslTransform();
XmlTextReader transformReader = GetTransformReader(test);
summaryXslTransform.Load(transformReader);
-
+
summaryXslTransform.Transform(originalXPathDocument,null,writer);
}
-
-
+
+
private XmlTextReader GetTransformReader(NUnit2Test test) {
XmlTextReader transformReader;
if(test.TransformFile == null) {
@@ -165,26 +190,26 @@
transformReader = new XmlTextReader(xsltInfo.FullName);
}
-
+
return transformReader;
}
-
+
private class LogWriter : TextWriter {
-
+
public override Encoding Encoding { get { return Encoding.UTF8; } }
-
-
+
+
public override void Write(char[] chars) {
Log.WriteLine(new String(chars, 0, chars.Length -1));
}
-
+
public override void WriteLine(string line) {
Log.WriteLine(line);
}
-
+
public override void WriteLine(string line, params object[] args) {
Log.WriteLine(line, args);
- }
+ }
}
}
}
Index: NUnit2Test.cs
===================================================================
RCS file: /cvsroot/nant/nant/src/NAnt.NUnitTasks/NUnit2/NUnit2Test.cs,v
retrieving revision 1.2
diff -u -r1.2 NUnit2Test.cs
--- NUnit2Test.cs 15 Dec 2002 21:23:13 -0000 1.2
+++ NUnit2Test.cs 11 Mar 2003 19:29:51 -0000
@@ -24,33 +24,38 @@
namespace SourceForge.NAnt.Tasks.NUnit2
{
- [ElementName("test")]
- public class NUnit2Test : Element
- {
- private string _assemblyName = null;
- private string _testname = null;
- private bool _haltOnFailure = true;
- private string _transformFile;
- string _appConfigFile = null;
+ [ElementName("test")]
+ public class NUnit2Test : Element
+ {
+ private string _assemblyName = null;
+ private string _testname = null;
+ private bool _haltOnFailure = true;
+ private string _transformFile;
+ private FileSet _assemblies = new FileSet();
+ string _appConfigFile = null;
- /// <summary>Name of the assembly to search for tests.</summary>
- [TaskAttribute("assemblyname", Required=true)]
- public string AssemblyName { get { return _assemblyName; } set
{_assemblyName = value;} }
+ /// <summary>Name of the assembly to search for tests.</summary>
+ [TaskAttribute("assemblyname")]
+ public string AssemblyName { get { return _assemblyName; } set {_assemblyName
= value;} }
- /// <summary>Name of a specific test to run. If Not specified then all
tests in the assembly are run.</summary>
- [TaskAttribute("testname")]
- public string TestName { get { return _testname; } set {_testname =
value;} }
+ /// <summary>Name of a specific test to run. If Not specified then all tests
in the assembly are run.</summary>
+ [TaskAttribute("testname")]
+ public string TestName { get { return _testname; } set {_testname = value;} }
- /// <summary>Build fails on failure</summary>
- [TaskAttribute("haltonfailure")]
- [BooleanValidator()]
- public bool HaltOnFailure { get { return _haltOnFailure; } set {
_haltOnFailure = value; } }
+ /// <summary>Assemblies to include in test.</summary>
+ [FileSet("assemblies")]
+ public FileSet Assemblies { get { return _assemblies; } set {_assemblies =
value;} }
+
+ /// <summary>Build fails on failure</summary>
+ [TaskAttribute("haltonfailure")]
+ [BooleanValidator()]
+ public bool HaltOnFailure { get { return _haltOnFailure; } set {
_haltOnFailure = value; } }
/// <summary>XSLT transform file to use when using the Xml formatter</summary>
- [TaskAttribute("transformfile")]
- public string TransformFile { get { return _transformFile; } set {
_transformFile = value; } }
+ [TaskAttribute("transformfile")]
+ public string TransformFile { get { return _transformFile; } set {
_transformFile = value; } }
- [TaskAttribute("appconfig")]
+ [TaskAttribute("appconfig")]
public string AppConfigFile {
get { return _appConfigFile; }
set { _appConfigFile = value; }
Index: NUnit2TestDomain.cs
===================================================================
RCS file: /cvsroot/nant/nant/src/NAnt.NUnitTasks/NUnit2/NUnit2TestDomain.cs,v
retrieving revision 1.2
diff -u -r1.2 NUnit2TestDomain.cs
--- NUnit2TestDomain.cs 26 Feb 2003 02:54:43 -0000 1.2
+++ NUnit2TestDomain.cs 11 Mar 2003 19:29:51 -0000
@@ -22,6 +22,8 @@
using System.IO;
using System.Reflection;
using System.Runtime.Remoting;
+using System.Collections;
+using System.Collections.Specialized;
using System.Xml;
using NUnit.Framework;
using NUnit.Core;
@@ -46,65 +48,45 @@
_errorStream = errorStream;
}
-
/// <summary>
- /// Create a testsuite and run it from an assembly
+ /// Run a single testcase
/// </summary>
- /// <param name="assemblyFile"></param>
+ /// <param name="testcase">The test to run, or null if running all tests</param>
+ /// <param name="assemblyFiles"></param>
/// <param name="configFilePath"></param>
/// <param name="listener"></param>
- /// <returns></returns>
- public TestResult Run (
- string assemblyFile,
+ /// <returns>The results of the test</returns>
+ public TestResult[] RunTest (
+ string testcase,
+ StringCollection assemblyFiles,
string configFilePath,
EventListener listener
)
{
- AppDomain domain =
- CreateDomain(Path.GetDirectoryName(assemblyFile), configFilePath);
- try
- {
- RemoteTestRunner runner = CreateTestRunner(domain);
-
- runner.Initialize(assemblyFile);
- domain.DoCallBack(new CrossAppDomainDelegate(runner.BuildSuite));
- return runner.Run(listener, _outStream, _errorStream);
-
- } finally {
- AppDomain.Unload(domain);
- }
- }
-
- /// <summary>
- /// Run a single testcase
- /// </summary>
- /// <param name="testcase"></param>
- /// <param name="assemblyFile"></param>
- /// <param name="configFilePath"></param>
- /// <param name="listener"></param>
- /// <returns></returns>
- public TestResult RunTest (
- string testcase, string assemblyFile,
- string configFilePath, EventListener listener
- )
- {
- string assemblyDir = Path.GetDirectoryName(assemblyFile);
- AppDomain domain = CreateDomain(assemblyDir, configFilePath);
-
- string currentDir = Directory.GetCurrentDirectory();
- Directory.SetCurrentDirectory(assemblyDir);
+ ArrayList results = new ArrayList();
+ foreach ( string assemblyFile in assemblyFiles ) {
+ string assemblyDir = Path.GetFullPath(
Path.GetDirectoryName(assemblyFile) );
+ AppDomain domain = CreateDomain(assemblyDir, configFilePath);
+
+ string currentDir = Directory.GetCurrentDirectory();
+ Directory.SetCurrentDirectory(assemblyDir);
+
+ try {
+ RemoteTestRunner runner = CreateTestRunner(domain);
+ if (testcase != null)
+ runner.Initialize(testcase, assemblyFile);
+ else
+ runner.Initialize(assemblyFile);
+ domain.DoCallBack(new CrossAppDomainDelegate(runner.BuildSuite));
+ results.Add( runner.Run(listener, _outStream, _errorStream) );
+
+ } finally {
+ Directory.SetCurrentDirectory(currentDir);
+ AppDomain.Unload(domain);
+ }
+ }
- try
- {
- RemoteTestRunner runner = CreateTestRunner(domain);
- runner.Initialize(testcase, assemblyFile);
- domain.DoCallBack(new CrossAppDomainDelegate(runner.BuildSuite));
- return runner.Run(listener, _outStream, _errorStream);
-
- } finally {
- Directory.SetCurrentDirectory(currentDir);
- AppDomain.Unload(domain);
- }
+ return ( TestResult[] )results.ToArray( typeof( TestResult ) );
}
private AppDomain CreateDomain(string basedir, string configFilePath)
