在 Azure DevOps 中发布测试结果时如何包含 NUnit 测试输出?

mar*_*ark 6 nunit unit-testing azure-devops vnext

我有一个 vNext 版本,它运行一些 NUnit 测试并发布结果。但是,测试生成的输出并未发布,即使可以在相应的 XML 文件中找到它。

例如:

在此输入图像描述

但是,如果我检查相应的 XML 文件 - 它就在那里:

在此输入图像描述

注意该<output>元素。

我非常希望看到这个输出与测试结果一起发布。我该怎么做?

聚苯乙烯

出版还有一个问题。顶部窗格中的运行持续时间报告为 4 小时 59 分钟,但在底部详细信息窗格中,它是正确的 10:48.176 分钟。4h 59m 看起来很像 5h,这是 EST 和 UTC 之间的时差。测试在 Octopus 服务器上运行,并由 vNext 构建获取。也许某处存在时区混乱。

编辑1

我们有一个本地 TFS

编辑2

检查该任务的源代码Publish Test Results表明它使用Microsoft.TeamFoundation.TestClient.PublishTestResults汇编来解析 NUnit XML 测试结果。具体来说,以下 C# 代码用于解析元素test-case(NUnit3ResultsXmlReader.cs):

if (testCaseResultNode.Attributes["result"] != null)
{
  testCaseResultData.TestCaseResult.Outcome = !string.Equals(testCaseResultNode.Attributes["result"].Value, "Passed", StringComparison.OrdinalIgnoreCase) ? (!string.Equals(testCaseResultNode.Attributes["result"].Value, "Failed", StringComparison.OrdinalIgnoreCase) ? (!string.Equals(testCaseResultNode.Attributes["result"].Value, "Skipped", StringComparison.OrdinalIgnoreCase) ? TestOutcome.Inconclusive.ToString() : TestOutcome.NotExecuted.ToString()) : TestOutcome.Failed.ToString()) : TestOutcome.Passed.ToString();
  XmlNode xmlNode1 = testCaseResultNode.SelectSingleNode("failure");
  if (xmlNode1 != null)
  {
    XmlNode xmlNode2 = xmlNode1.SelectSingleNode("message");
    XmlNode xmlNode3 = xmlNode1.SelectSingleNode("stack-trace");
    testCaseResultData.TestCaseResult.ErrorMessage = xmlNode2 != null ? xmlNode2.InnerText : (string) null;
    testCaseResultData.TestCaseResult.StackTrace = xmlNode3 != null ? xmlNode3.InnerText : (string) null;
    XmlNode xmlNode4 = testCaseResultNode.SelectSingleNode("output");
    if (!string.IsNullOrWhiteSpace(xmlNode4 != null ? xmlNode4.InnerText : (string) null))
      testCaseResultData.ConsoleLog = xmlNode4.InnerText;
  }
}
Run Code Online (Sandbox Code Playgroud)

由此可见,程序集作者认为测试输出仅在相关测试用例失败时才有用。这是一个不幸的决定,因为他们无法决定输出何时有用。如果它在测试结果 XML 中,则应该将其发布。

打开了一个新问题https://github.com/Microsoft/azure-pipelines-tasks/issues/8979

提出 Azure DevOps 功能请求 - https://developercommunity.visualstudio.com/idea/432166/the-publish-tests-azure-devops-plugin-should-publi.html

mar*_*ark 1

针对这种不幸的行为,我的解决方案是在将 XML 测试结果交给“发布测试结果”任务之前对其进行修改。

下面的 powershell 代码可以解决这个问题:

$Modified = $false
$xml = [xml](cat $OriginalTestResultsXmlFile -Raw)
$xml.SelectNodes('//test-case') |? { !$_.failure -and $_.output } |% { 
    $Modified = $true
    $_.InnerXml = @"
<!-- Workaround the issue https://github.com/Microsoft/azure-pipelines-tasks/issues/8979. No real failure here -->
<failure/>
$($_.InnerXml)

"@
}

if ($Modified)
{
    $xml.Save($TestResultsXmlFile)
}
else
{
    move $OriginalTestResultsXmlFile $TestResultsXmlFile
    $OriginalTestResultsXmlFile = $TestResultsXmlFile
}
Run Code Online (Sandbox Code Playgroud)

我们必须通过在元素failure之外创建一个虚拟元素来欺骗任务执行我们需要的逻辑output

你看:

在此输入图像描述