2

I have a set of NUnit XML result files (produced by xUnit.NET via the NUnitXml parameter to the Xunit.Runner.MSBuild.xunit msbuild task pretty much as in How do I get Team Build to show test results and coverage for xUnit.net test suite? and http://jonnekats.wordpress.com/2009/05/07/integrate-xunit-tests-into-your-daily-team-build/)

The script publishes each of the test runs individually, which is slow as it pulls in all the TestResults artifacts each time. Thus I'd like to combine them into a single consolidated set on the client side first prior to submission [to TFS using mstest.exe with the /publish parameter].

xUnit.net has a CombineXunitXml Task which is invoked in xunit.tests.msbuild as follows:-

<CombineXunitXml InputFiles="@(TestXmlFiles)" OutputFile="TestResults.xml" />

Does anyone know of an equivalent task to merge NUnit result files in a similar way? (I'm guessing this doesnt arise as commonly as the NUnit task takes multiple assemblies in its Assemblies parameter whereas xUnit.net has a singular Assembly parameter).

Community
  • 1
  • 1
Ruben Bartelink
  • 59,778
  • 26
  • 187
  • 249

2 Answers2

2

The CombineXunitXml task does not exist in xUnit 1.1. Copying the class from the source for 1.5 (currently CTP2) into the solution for 1.1, it built just fine for me.

sprobean
  • 171
  • 1
  • 2
  • 7
  • Hi, good to hear its working for you. FWIW, I was looking for (and got, thanks Atans again!) a task for combining NUnit XML - Combining xUnit XML is only something that's generally of interest in the context of building xUnit itself (There's an XSLT to convert onward from NUnit XML to MSTEST). I'd be interested to hear what you're cooking up [as a comment when you have 50 points!] Here's 10 to send you on your way... BTW the xUnit.net forum on CodePlex is obv well worth asking questions on too. – Ruben Bartelink Jul 30 '09 at 22:04
  • Thanks. I really should have given more context in my response. I found this post while searching for ways to get xUnit results for multiple test assemblies showing in CruiseControl build results. The single-assembly version is covered at the xUnit site on codeplex. – sprobean Jul 30 '09 at 23:02
  • Right, sorry for any tinge of patronising noob treatment in my response then! (I'll leave you the +1 tho' :D) – Ruben Bartelink Jul 31 '09 at 08:02
1

I couldn't get Davy Brion's build task to work when I tried (the link in Atanas Korchev's answer).

So we wrote an open source replacement:

https://github.com/15below/NUnitMerger

From the readme:

Using in MSBuild

Load the task:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
             ToolsVersion="4.0"
             DefaultTargets="Build">
  <UsingTask AssemblyFile="$(MSBuildProjectDirectory)\..\Tools\MSBuild\15below.NUnitMerger.dll" TaskName="FifteenBelow.NUnitMerger.MSBuild.NUnitMergeTask" />
  ...

Feed it an array of files with in a target:

  <Target Name="UnitTest" DependsOnTargets="OtherThings">
    ... Generate the individual files here in $(TestResultsDir) ...

    <ItemGroup>
      <ResultsFiles Include="$(TestResultsDir)\*.xml" />
    </ItemGroup> 

    <NUnitMergeTask FilesToBeMerged="@(ResultsFiles)" OutputPath="$(MSBuildProjectDirectory)\TestResult.xml" />
  </Target>

Find the resulting combined results at OutputPath.

Using in F#

Create an F# console app and add 15below.NUnitMerger.dll, System.Xml and System.Xml.Linq as references.

open FifteenBelow.NUnitMerger.Core
open System.IO
open System.Xml.Linq

// All my files are in one directory
WriteMergedNunitResults (@"..\testdir", "*.xml", "myMergedResults.xml")

// I want files from all over the place
let myFiles = ... some filenames as a Seq

myFiles
|> Seq.map (fun fileName -> XDocument.Parse(File.ReadAllText(fileName)))
|> FoldDocs
|> CreateMerged
|> fun x -> File.WriteAllText("myOtherMergedResults.xml", x.ToString())
mavnn
  • 9,101
  • 4
  • 34
  • 52