Как включить выходные данные теста NUnit при публикации результатов тестирования в Azure DevOps?

У меня есть сборка vNext, которая запускает несколько тестов NUnit и публикует результаты. Однако результаты тестов не публикуются, даже если они находятся в соответствующем XML-файле.

Например:

введите здесь описание изображения

Но, если я проверю соответствующие файлы XML - они там:

введите здесь описание изображения

Обратите внимание на элемент <output>.

Я бы очень хотел, чтобы этот вывод был опубликован вместе с результатами тестирования. Как я могу это сделать?

P.S.

Есть еще одна проблема с издательством. Продолжительность пробега отображается как 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


person mark    schedule 29.11.2018    source источник
comment
Что вы подразумеваете под «выходом»? Я могу видеть перечисленные тесты и их результаты.   -  person Rob Bos    schedule 02.12.2018
comment
Рассматриваемый тест производит вывод на консоль. Этот вывод выдается, даже если тест проходит. И этот вывод включен в XML. Но его нигде нет на тестовой странице в сборке.   -  person mark    schedule 03.12.2018


Ответы (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.

И вот:

введите здесь описание изображения

person mark    schedule 03.12.2018