В Azure DevOps вы можете получить результаты тестов на другом этапе, а именно: общее количество выполненных / пройденных / неудачных / игнорированных тестов? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть конвейер DevOps Azure, работающий в YAML.

Я использую задачу VSTest@2 для выполнения некоторых модульных тестов. Все это работает нормально, и я вижу, что результаты теста отображаются в самом интерфейсе обзора этапа и в обзоре «Тесты и покрытие» в заголовке.

Мой конвейер YAML также отправляет сообщение в канал Slack с ссылки на сборку, статус успеха / неудачи и другие вещи. Я тоже хочу добавить результаты теста в сообщение ... просто простой экран "Всего тестов X - Пройдено X - Не пройдено - Пропущено X". Это происходит в отдельном этапе в конце.

Есть ли способ получить результаты тестов предыдущего этапа на более позднем этапе в трубопроводе (работающем на другом агенте)?

Доступны ли тесты как артефакт, и если да, то где они находятся и в каком формате?

Буду ли я прав, думая, что единственный способ сделать это - через Azure API? (Я не могу позаботиться о том, чтобы настроить auth с этим в конвейере только для этой функции, я нигде больше не взаимодействую с API)

1 Ответ

2 голосов
/ 23 марта 2020

Результаты теста должны быть сгенерированы, если вы используете задачу VSTest@2 для выполнения некоторых тестов. Вы можете проверить журнал задачи VSTest, чтобы проверить, куда выводится файл результатов теста. Обычно результатом теста по умолчанию является файл trx. Вы можете изменить расположение вывода, добавив resultsFolder: 'output location' к задаче vstest.

enter image description here

Как только вы получите файл результатов теста, вы можете писать сценарии для Извлеките сводку результатов теста, добавив задачу скрипта.

Для приведенного ниже примера используйте скрипт powershell, чтобы извлечь сводку теста из файла trx, и установите для нее переменную env , которая сделает ее доступной в следующая задача.

- powershell: |
   #get the path of the trx file from the output folder.
   $path = Get-ChildItem -Path $(Agent.TempDirectory)\TestResults -Recurse -ErrorAction SilentlyContinue -Filter *.trx |  Where-Object { $_.Extension -eq '.trx' }

   $appConfigFile = $path.FullName  #path to test result trx file
   #$appConfigFile = '$(System.DefaultWorkingDirectory)\Result\****.trx' #path to test result trx file

   $appConfig = New-Object XML 
   $appConfig.Load($appConfigFile) 
   $testsummary = $appConfig.DocumentElement.ResultSummary.Counters | select total, passed, failed, aborted

   echo "##vso[task.setvariable variable=testSummary]$($testsummary)" #set the testsummary to environment variable


  displayName: 'GetTestSummary'

  condition: always()

Чтобы сделать переменную testSummary доступной на следующем этапе, необходимо добавить зависимость на этом этапе на следующий этап. И используйте выражение dependencies.<Previous stage name>.outputs['<name of the job which execute the task.setvariable >.TaskName.VariableName'] для передачи сводки теста в переменную на следующих этапах.

Пожалуйста, проверьте приведенный ниже пример

stages: 
  - stage: Test
    displayName: 'Publish stage'
    jobs:
    - job: jobA
      pool: Default
  ...
    - powershell: |
        #get the path of the trx file from the output folder.
        $path = Get-ChildItem -Path $(Agent.TempDirectory)\TestResults -Recurse -ErrorAction SilentlyContinue -Filter *.trx |  Where-Object { $_.Extension -eq '.trx' }

        $appConfigFile = $path.FullName  #path to test result trx file
        #$appConfigFile = '$(System.DefaultWorkingDirectory)\Result\****.trx' #path to test result trx file

        $appConfig = New-Object XML 
        $appConfig.Load($appConfigFile) 
        $testsummary = $appConfig.DocumentElement.ResultSummary.Counters | select total, passed, failed, aborted

        echo "##vso[task.setvariable variable=testSummary]$($testsummary)" #set the testsummary to environment variable

      displayName: 'GetTestSummary'

      condition: always()

  - stage: Release
      dependsOn: Test
      jobs:

      - job: jobA
        variables:
          testInfo: $[dependencies.Test.outputs['jobA.GetTestSummary.testSummary']]

        steps:

Затем вы можете получить извлеченную информацию о результатах теста, ссылаясь на переменную $ (testInfo).

Надеюсь, что выше поможет!

...