我有一个vNext构建,它运行一些NUnit测试并发布结果。但是,即使在相应的XML文件中找到了测试产生的输出,也不会发布。
例如:
但是,如果我检查相应的XML文件-它在那里:
注意<output>
元素。
我非常希望看到此输出随测试结果一起发布。我该怎么办?
P.S。
发布还有另一个问题。在顶部窗格中,“运行持续时间”报告为4h 59m,但在底部详细信息窗格中,这是正确的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;
}
}
由此得出的结论是,汇编作者认为,仅当所讨论的测试用例失败时,测试输出才有用。这是一个不幸的决定,因为这取决于他们来决定何时输出有用。如果它在测试结果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
答案 0 :(得分: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
元素来欺骗任务以执行所需的逻辑。
瞧瞧: