Convert NUnit 3 to NUnit 2 results XML file
Although NUnit 3 was officially released in November 2015 still there are CI tools that do not provide support for parsing NUnit 3 result XML files. In this post, I will show how to convert between formats so CI tools can read NUnit 2 format.
NUnit 3 console runner
The easiest way is if you are using NUnit 3 console runner. It can be provided with an option: --result=TestResult.xml;format=nunit2.Nota bene: Mandatory for this to work is to have nunit-v2-result-writer in NuGet packages directory otherwise an error will be shown: Unknown result format: nunit2.
Convert NUnit 3 to NUnit 2
If tests are being run in some other way other than NUnit 3 console runner then solution below is needed. There is no program or tool that can do this conversion, so custom one is needed. This is a Powershell script that uses nunit-v2-result-writer assemblies and with their functionality converts the XML files:$assemblyNunitEngine = 'nunit.engine.api.dll';
$assemblyNunitWriter = 'nunit-v2-result-writer.dll';
$inputV3Xml = 'TestResult.xml';
$outputV2Xml = 'TestResultV2.xml';
Add-Type -Path $assemblyNunitEngine;
Add-Type -Path $assemblyNunitWriter;
$xmldoc = New-Object -TypeName System.Xml.XmlDataDocument;
$fs = New-Object -TypeName System.IO.FileStream -ArgumentList $inputV3Xml,'Open','Read';
$xmldoc.Load($fs);
$xmlnode = $xmldoc.GetElementsByTagName('test-run').Item(0);
$writer = New-Object -TypeName NUnit.Engine.Addins.NUnit2XmlResultWriter;
$writer.WriteResultFile($xmlnode, $outputV2Xml);
Important here is to give a proper path to nunit.engine.api.dll, nunit-v2-result-writer.dll and NUnit 3 TestResult.xml files. Powershell script above is equivalent to following C# code:
using System.IO;
using System.Xml;
using NUnit.Engine.Addins;
public class NUnit3ToNUnit2Converter
{
public static void Main(string[] args)
{
var xmldoc = new XmlDataDocument();
var fileStream
= new FileStream("TestResult.xml", FileMode.Open, FileAccess.Read);
xmldoc.Load(fileStream);
var xmlnode = xmldoc.GetElementsByTagName("test-run").Item(0);
var writer = new NUnit2XmlResultWriter();
writer.WriteResultFile(xmlnode, "TestResultV2.xml");
}
}