Есть ли инструмент для объединения файлов результатов NUnit?

По непонятным причинам мое тестовое крепление Nunit не может быть выполнено за один проход, поэтому я вынужден выполнить несколько тестов в отдельных прогонах. Однако это означает, что результаты теста разделяются на несколько выходных файлов.

Есть ли доступный инструмент, который может объединять XML файлы результата NUnit в один файл XML?

Я пробовал использовать существующий инструмент резюме Nunit, но это просто последовательно анализирует XML файлы с данным XSL файлом и объединяет результат как один большой файл.

Вместо этого я хотел бы сначала объединить/сгруппировать результаты для тестовых случаев в правильные пространства имен/тестовые объекты, а затем передать их в XSLT-процессор. Таким образом, все результаты теста должны отображаться с помощью приспособления, даже если они не собраны за один проход.

Ответы

Ответ 1

Возможно, слишком поздно, чтобы помочь вам, но мы недавно столкнулись с подобной проблемой и написали небольшой инструмент с открытым исходным кодом, чтобы помочь: https://github.com/15below/NUnitMerger

Из файла readme:

Использование в MSBuild

Загрузите задачу:

<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" />
  ...

Подайте массив файлов в цель:

  <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>

Найдите полученные комбинированные результаты в OutputPath.

Использование в F #

Создайте консольное приложение F # и добавьте в качестве ссылок 15below.NUnitMerger.dll, System.Xml и System.Xml.Linq.

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())

Ответ 2

Я некоторое время использовал 15 ниже NUnitMerger, но хотел его продлить, и поскольку мои навыки F # недостаточно хороши для этого, я проверил их механизм и реализовал следующий класс в С# для достижения того же. Вот мой стартовый код, который может помочь любому, кто также хочет делать подобные манипуляции на С#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;

namespace RunNUnitTests
{
    public static class NUnitMerger
    {
        public static bool MergeFiles(IEnumerable<string> files, string output)
        {
            XElement environment = null;
            XElement culture = null;
            var suites = new List<XElement>();

            bool finalSuccess = true;
            string finalResult = "";
            double totalTime = 0;
            int total = 0, errors = 0, failures = 0, notrun = 0, inconclusive = 0, ignored = 0, skipped = 0, invalid = 0;
            foreach (var file in files)
            {
                var doc = XDocument.Load(file);
                var tr = doc.Element("test-results");

                if (environment == null)
                    environment = tr.Element("environment");
                if (culture == null)
                    culture = tr.Element("culture-info");

                total += Convert.ToInt32(tr.Attribute("total").Value);
                errors += Convert.ToInt32(tr.Attribute("errors").Value);
                failures += Convert.ToInt32(tr.Attribute("failures").Value);
                notrun += Convert.ToInt32(tr.Attribute("not-run").Value);
                inconclusive += Convert.ToInt32(tr.Attribute("inconclusive").Value);
                ignored += Convert.ToInt32(tr.Attribute("ignored").Value);
                skipped += Convert.ToInt32(tr.Attribute("skipped").Value);
                invalid += Convert.ToInt32(tr.Attribute("invalid").Value);

                var ts = tr.Element("test-suite");
                string result = ts.Attribute("result").Value;

                if (!Convert.ToBoolean(ts.Attribute("success").Value))
                    finalSuccess = false;

                totalTime += Convert.ToDouble(ts.Attribute("time").Value);

                if (finalResult != "Failure" && (String.IsNullOrEmpty(finalResult) || result == "Failure" || finalResult == "Success"))
                    finalResult = result;

                suites.Add(ts);
            }

            if (String.IsNullOrEmpty(finalResult))
            {
                finalSuccess = false;
                finalResult = "Inconclusive";
            }

            var project = XElement.Parse(String.Format("<test-suite type=\"Test Project\" name=\"\" executed=\"True\" result=\"{0}\" success=\"{1}\" time=\"{2}\" asserts=\"0\" />", finalResult, finalSuccess ? "True" : "False", totalTime));
            var results = XElement.Parse("<results/>");
            results.Add(suites.ToArray());
            project.Add(results);

            var now = DateTime.Now;
            var trfinal = XElement.Parse(String.Format("<test-results name=\"Merged results\" total=\"{0}\" errors=\"{1}\" failures=\"{2}\" not-run=\"{3}\" inconclusive=\"{4}\" ignored=\"{5}\" skipped=\"{6}\" invalid=\"{7}\" date=\"{8}\" time=\"{9}\" />", total, errors, failures, notrun, inconclusive, ignored, skipped, invalid, now.ToString("yyyy-MM-dd"), now.ToString("HH:mm:ss")));
            trfinal.Add(new[] { environment, culture, project });
            trfinal.Save(output);

            return finalSuccess;
        }

    }
}

Ответ 3

Если вы работаете под NAnt, ответы на этот вопрос выглядят так, как будто они помогут.

Ответ 4

Я читал в Интернете, что файлы результатов Nunit являются XML, поэтому я думаю, вы можете объединить файл с обычным программным обеспечением слияния как WinMerge