Я конвертирую один из наших проектов для использования 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 для POST
ing и 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
, чтобы не завершить тестовый прогонпока все тесты не будут закончены.