Добавление и обновление тестов в Azure DevOps Pipeline программным способом с использованием API - PullRequest
1 голос
/ 17 октября 2019

Я конвертирую один из наших проектов для использования DevOps Azure, а не AppVeyor для CI. В качестве части сборки мы используем пользовательский тестовый прогон для выполнения определенных тестов.

При запуске в AppVeyor мы вызываем REST API напрямую из тестового прогона, чтобы сообщить серверу сборки о выполняемых тестах и ​​обновить ихстатус. Это довольно просто, как показано в разделах REST их документации Add Tests и Update Tests , и дает нам прекрасную интеграцию с пользовательским интерфейсом AppVeyor.

изучал, как сделать то же самое в DevOps Azure. Я нашел раздел API REST для с добавлением и , обновляющим результаты теста. Из документации API не совсем понятно, использовал ли я это во время работающего конвейера, или это для какого-то другого сценария. Я искал других, пытающихся сделать то же самое, но пока безуспешно. В большинстве примеров говорится о загрузке файла результатов теста, но это кажется довольно косвенным способом опубликования результатов теста, тем более что я хотел бы зарегистрировать все тесты до их запуска, а затем обновить их статус по мере их завершения.

Есть ли у кого-нибудь указания или примеры публикации результатов тестирования с использованием API DevOps Azure во время сборки?


Подробное решение:

СОтвет Мерлина Ляна для руководства Теперь у меня все получилось.

Шаг 1. Сначала я создал новый тестовый прогон, который я сделал в конце своей работы по сборке (под названием * 1026). *) использование сценария powershell:

  - powershell: |
      $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/test/runs?api-version=5.0"
      $body = @{
          "name" = "IntegrationTests"
          "build" = @{
              "id" = $env:BUILD_BUILDID
          }
          "isAutomated" = $TRUE
          "state" = "InProgress"
      }
      $json = $body | ConvertTo-Json
      $result = Invoke-RestMethod -Method 'Post' -Uri $url -Body $json -ContentType 'application/json' -Headers @{
          Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
      }
      $runId = $result.id
      echo "##vso[task.setvariable variable=INTEGRATION_TEST_RUN_ID;isOutput=true]$runId"
    displayName: 'Create test run'
    name: CreateTestRun
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

Обратите внимание, что необходимо явно предоставить сценарию доступ к System.AccessToken в разделе env, так как эта переменная по умолчанию не включена в переменную среды,Состояние тестового прогона должно быть InProgress, чтобы убедиться, что тесты отображаются в списке тестов сборки во время их выполнения.

Шаг 2. Затем мои конвейерные вентиляторы запускаются в параллельные задания для запускатесты, которым нужен доступ к переменной INTEGRATION_TEST_RUN_ID, которую я создал выше, поэтому я импортирую ее в работу:

  - job: IntegrationTests
    dependsOn: Build
    variables:
      INTEGRATION_TEST_RUN_ID: $[ dependencies.Build.outputs['CreateTestRun.INTEGRATION_TEST_RUN_ID'] ]
    strategy:
      parallel: 2
    ...

Мой тестовый прогон (написанный на C #) может затем создать URL для POSTing и PATCH ing тесты:

$"{this.apiUrl}{this.projectName}/_apis/test/runs/{this.testRunId}/results?api-version=5.0"

и добавление тестовых вложений:

$"{this.apiUrl}{this.projectName}/_apis/test/runs/{this.testRunId}/results/{testResultId}/attachments?api-version=5.0-preview.1"

Где эти переменные-члены класса просто читаются из обычных переменных среды, а testResultId - этоидентификатор, возвращаемый API, когда я первоначально POST выполняю тест.

Опять же, я явно устанавливаю SYSTEM_ACCESSTOKEN в разделе env, когда вызываю тестировщика из YAML конвейера Azure,и используя его в заголовке авторизации.

Шаг 3. Наконец я снова отмечаю тестовый прогон как завершенный в выделенном задании, которое зависит от заданий интеграционного тестирования и всегда должно выполнятьсядаже если тесты не пройдены:

  - job: EndIntegrationTests
    dependsOn:
      - Build
      - IntegrationTests
    condition: always()
    variables:
      INTEGRATION_TEST_RUN_ID: $[ dependencies.Build.outputs['CreateTestRun.INTEGRATION_TEST_RUN_ID'] ]
    steps:
    - checkout: none

    - powershell: |
        $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/test/runs/$($env:INTEGRATION_TEST_RUN_ID)?api-version=5.0"
        Write-Host "URL: $url"
        $body = @{
            "state" = "Completed"
        }
        $json = $body | ConvertTo-Json
        Invoke-RestMethod -Method 'Patch' -Uri $url -Body $json -ContentType 'application/json' -Headers @{
            Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
        }
      displayName: 'Complete test run'
      env:
        SYSTEM_ACCESSTOKEN: $(System.AccessToken)

Обратите внимание, что это задание должно явно зависеть от Build, чтобы я мог прочитать выходную переменную INTEGRATION_TEST_RUN_ID, и оно, очевидно, зависит от IntegrationTests, чтобы не завершить тестовый прогонпока все тесты не будут закончены.

1 Ответ

1 голос
/ 18 октября 2019

Вы очень близки к ответу. См. Этот документ: Результаты испытаний поверхности на вкладке "Тесты" .

Кроме загрузки результатов испытаний с помощью таких задач, как задача "Опубликовать результаты теста", тест VS и т. Д. Мы также предоставляем способзагрузить результаты с помощью Rest api :

enter image description here

Чтобы достичь желаемого, вы должны сначала создать тестовый запуск с одним известнымномер сборки, затем отправьте результаты теста на него.

  1. Создайте новый тест для существующей сборки, укажите buildID в теле запроса.

Образец:

POST https://dev.azure.com/{org name}/{project}/_apis/test/Runs/{runId}/results?api-version=5.0

{
 "name": "NewTest", 
 "build": { "id": "162" }, 
 "isAutomated": true, 
 "state": "Waiting" 
}

Запустите тестирование, чтобы результаты теста стали доступны.

Теперь опубликуйте этот новый результат теста в тесте, который был создан ранее.

[{"testCaseTitle": "ReferBuild", "automaticTestName": "ReferBuildAuto", "priority": 1, "result": "Passed"}]

Здесь вы можете обратиться к примеру, приведенному в doc .

Наконец, вы можете использовать update api.
...