Pesterの結果からFailureのみを抽出する

PowerShellには、Pesterというユニットテスト用のフレームワークが標準で用意されています。
Pesterのテスト結果はXMLファイルで出力されるのですが、テストケースが多い場合、また多数のサーバーでテストをする場合、テスト結果の中からエラーになった結果(Failure)を捕捉しにくいという欠点がありました。

そこで、複数のテスト結果のXMLファイルの中から、エラーになった結果(Failure)のみを抽出して、Excelファイルに一覧化して出力する方法を記載します。

using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;

namespace FailureExtractFromXML
{
    class Program
    {
        static void Main(string[] args)
        {
            string stCurrentDir = Directory.GetCurrentDirectory();

            IEnumerable<string> xmlFiles = Directory.EnumerateDirectories(
                    stCurrentDir, "*", SearchOption.AllDirectories)
                    .SelectMany(d => Directory.EnumerateFiles(d))
                    .Where(f => new[] { ".xml" }.Contains(Path.GetExtension(f)));

            var exportFile = Path.Combine(stCurrentDir,$"UTFailureResult_{DateTime.Now:yyyyMMddHHmmss}.xlsx");

            using(var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("UTFailureResult");
                worksheet.Style.Font.FontName = "Meiryo UI";

                worksheet.Cell("A1").Value = "nodename";
                worksheet.Cell("B1").Value = "name";
                worksheet.Cell("C1").Value = "description";
                worksheet.Cell("D1").Value = "message";
                worksheet.Cell("E1").Value = "stacktrace";

                var i = 2;
                foreach (var xmlFile in xmlFiles)
                {
                    var nodeName = Path.GetFileNameWithoutExtension(xmlFile);
                    var xdocText = XDocument.Load(xmlFile).ToString();
                    var xfailures = XDocument.Parse(xdocText).XPathSelectElements($"/test-results/test-suite/results").Descendants("failure");

                    foreach (var xfailure in xfailures)
                    {
                        worksheet.Cell(i,1).Value = nodeName;
                        worksheet.Cell(i,2).Value = xfailure.Ancestors().First().Attribute("name").Value;
                        worksheet.Cell(i,3).Value = xfailure.Ancestors().First().Attribute("description").Value;
                        worksheet.Cell(i,4).Value = xfailure.Element("message").Value.Replace("\n"," ");
                        worksheet.Cell(i,5).Value = xfailure.Element("stack-trace").Value.Replace("\n"," ");
                        i++;
                    }

                }

                workbook.SaveAs(exportFile);

            }
        }
    }
}

参考サイト
qiita.com