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

6
我有一个vNext构建,其中运行了一些NUnit测试并发布了结果。然而,测试生成的输出未被发布,尽管在相应的XML文件中发现了它。
例如:

enter image description here

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

enter image description here

请注意<output>元素。
我非常希望能够将此输出与测试结果一起发布。我该怎么做?
附言:
发布还有另一个问题。运行持续时间在顶部窗格中报告为4小时59分钟,但在底部详细信息窗格中是正确的10:48.176分钟。4小时59分钟看起来非常像5小时,这是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;
  }
}

由此可见,组装作者认为测试输出仅在测试用例失败时才有用。这是一个不幸的决定,因为他们无权决定何时使用输出。如果它在测试结果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


“output”是什么意思?我可以看到测试列表和结果。 - Rob Bos
该测试会产生控制台输出。即使测试通过,此输出也会产生。而且这个输出会包含在XML中。但是,在构建的测试页面中找不到这个输出。 - mark
1个回答

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
}

我们需要通过创建一个虚假的failure元素来欺骗任务执行我们所需的逻辑,该元素位于output元素旁边。
看哪:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接