PublishTestResults@2 — задача "Публикация результатов теста" версии 2

Публикация результатов теста в Azure Pipelines.

Публикация результатов теста в Azure Pipelines/TFS.

Синтаксис

# Publish Test Results v2
# Publish test results to Azure Pipelines.
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 'JUnit' | 'NUnit' | 'VSTest' | 'XUnit' | 'CTest'. Alias: testRunner. Required. Test result format. Default: JUnit.
    testResultsFiles: '**/TEST-*.xml' # string. Required. Test results files. Default: **/TEST-*.xml.
    #searchFolder: '$(System.DefaultWorkingDirectory)' # string. Search folder. Default: $(System.DefaultWorkingDirectory).
    #mergeTestResults: false # boolean. Merge test results. Default: false.
    #failTaskOnFailedTests: false # boolean. Fail if there are test failures. Default: false.
    #failTaskOnFailureToPublishResults: false # boolean. Fail if there is failure in publishing test results. Default: false.
    #failTaskOnMissingResultsFile: false # boolean. Fail if no result files are found. Default: false.
    #testRunTitle: # string. Test run title. 
  # Advanced
    #buildPlatform: # string. Alias: platform. Build Platform. 
    #buildConfiguration: # string. Alias: configuration. Build Configuration. 
    #publishRunAttachments: true # boolean. Upload test results files. Default: true.
# Publish Test Results v2
# Publish test results to Azure Pipelines.
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 'JUnit' | 'NUnit' | 'VSTest' | 'XUnit' | 'CTest'. Alias: testRunner. Required. Test result format. Default: JUnit.
    testResultsFiles: '**/TEST-*.xml' # string. Required. Test results files. Default: **/TEST-*.xml.
    #searchFolder: '$(System.DefaultWorkingDirectory)' # string. Search folder. Default: $(System.DefaultWorkingDirectory).
    #mergeTestResults: false # boolean. Merge test results. Default: false.
    #failTaskOnFailedTests: false # boolean. Fail if there are test failures. Default: false.
    #testRunTitle: # string. Test run title. 
  # Advanced
    #buildPlatform: # string. Alias: platform. Build Platform. 
    #buildConfiguration: # string. Alias: configuration. Build Configuration. 
    #publishRunAttachments: true # boolean. Upload test results files. Default: true.
# Publish Test Results v2
# Publish Test Results to Azure Pipelines/TFS.
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 'JUnit' | 'NUnit' | 'VSTest' | 'XUnit'. Alias: testRunner. Required. Test result format. Default: JUnit.
    testResultsFiles: '**/TEST-*.xml' # string. Required. Test results files. Default: **/TEST-*.xml.
    #searchFolder: '$(System.DefaultWorkingDirectory)' # string. Search folder. Default: $(System.DefaultWorkingDirectory).
    #mergeTestResults: false # boolean. Merge test results. Default: false.
    #testRunTitle: # string. Test run title. 
  # Advanced
    #buildPlatform: # string. Alias: platform. Build Platform. 
    #buildConfiguration: # string. Alias: configuration. Build Configuration. 
    #publishRunAttachments: true # boolean. Upload test results files. Default: true.

Входные данные

testResultsFormat - Формат результатов теста
Входной псевдоним: testRunner. string. Обязательный. Допустимые значения: JUnit, NUnit, VSTest, XUnit, CTest. Значение по умолчанию: JUnit.

Задает формат файлов результатов, которые требуется опубликовать. Поддерживаются следующие форматы: CTest, JUnit, NUnit 2, NUnit 3, Visual Studio Test (TRX) и xUnit 2.


testResultsFormat - Формат результатов теста
Входной псевдоним: testRunner. string. Обязательный. Допустимые значения: JUnit, NUnit, VSTest, XUnit. Значение по умолчанию: JUnit.

Задает формат файлов результатов, которые требуется опубликовать. Поддерживаются следующие форматы: CTest, JUnit, NUnit 2, NUnit 3, Visual Studio Test (TRX) и xUnit 2.


testResultsFiles - Файлы результатов тестирования
string. Обязательный. Значение по умолчанию: **/TEST-*.xml.

Указывает один или несколько файлов результатов теста.

  • Можно использовать подстановочные знаки с одной папкой (*) и рекурсивные подстановочные знаки (**). Например, выполняет поиск всех XML-файлов, **/TEST-*.xml имена которых начинаются с TEST- во всех подкаталогах. При использовании VSTest в качестве формата результатов теста тип файла следует изменить на .trx , например. **/TEST-*.trx
  • Можно указать несколько путей, разделенных новой строкой.
  • Кроме того, принимает шаблоны мини-сопоставления.

Например, !TEST[1-3].xml исключает файлы с именами TEST1.xml, TEST2.xmlили TEST3.xml.


searchFolder - папка Поиск
string. Значение по умолчанию: $(System.DefaultWorkingDirectory).

Необязательный элемент. Указывает папку для поиска файлов результатов теста.


mergeTestResults - Объединить результаты теста
boolean. Значение по умолчанию: false.

Если значение этого логического значения равно true, задача сообщает результаты теста из всех файлов при одном тестовом запуске. Если значение равно false, задача создает отдельный тестовый запуск для каждого файла результатов теста.

Примечание

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


failTaskOnFailedTests - Сбой при сбое теста
boolean. Значение по умолчанию: false.

Необязательный элемент. Если значение этого логического значения равно true, задача завершится ошибкой, если какой-либо из тестов в файле результатов помечен как неудачный. По умолчанию используется falseзначение , которое просто публикует результаты из файла результатов.


failTaskOnFailureToPublishResults - Сбой при сбое при публикации результатов теста
boolean. Значение по умолчанию: false.

Если trueзадано значение , задача завершается сбоем при публикации результатов теста.


failTaskOnMissingResultsFile - Сбой, если файлы результатов не найдены
boolean. Значение по умолчанию: false.

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


testRunTitle - Заголовок тестового запуска
string.

Необязательный элемент. Указывает имя тестового запуска, для которого будут переданы результаты. Можно использовать имена переменных, объявленные в конвейере сборки или выпуска.


buildPlatform - Платформа сборки
Входной псевдоним: platform. string.

Необязательный элемент. Указывает платформу сборки, о которой следует сообщать о тестовом запуске. Пример: x64 или x86. Если вы определили переменную для платформы в задаче сборки, используйте ее здесь.


buildConfiguration - Конфигурация сборки
Входной псевдоним: configuration. string.

Необязательный элемент. Указывает конфигурацию сборки, о которой следует сообщать о тестовом запуске. Пример: Debug или Release. Если вы определили переменную для конфигурации в задаче сборки, используйте ее здесь.


publishRunAttachments - Отправка файлов результатов теста
boolean. Значение по умолчанию: true.

Необязательный элемент. Если значение этого логического значения равно true, задача отправляет все файлы результатов теста в виде вложений в тестовый запуск.


Параметры управления задачами

Помимо входных данных, все задачи имеют параметры управления. Дополнительные сведения см. в разделе Параметры управления и общие свойства задачи.

Выходные переменные

Нет.

Remarks

Эта задача публикует результаты тестов в Azure Pipelines или TFS при выполнении тестов, чтобы обеспечить комплексные отчеты и аналитику тестов. Вы можете использовать средство выполнения тестов по своему выбору, которое поддерживает нужный формат результатов. Поддерживаемые форматы результатов: CTest, JUnit (включая PHPUnit), NUnit 2, NUnit 3, Visual Studio Test (TRX) и xUnit 2.

Другие встроенные задачи, такие как Задача Тестирования Visual Studio и Задача Cli Dot NetCore , автоматически публикуют результаты теста в конвейере. Такие задачи, как Ant, Maven, Gulp, Grunt и Xcode , предоставляют результаты публикации в рамках задачи или библиотеки сборки, такие как Cobertura и JaCoCo. Если вы используете какую-либо из этих задач, вам не требуется отдельная задача Публикации результатов теста в конвейере.

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

В следующем примере показано, что задача настроена для публикации результатов теста.

Открытие страницы журнала тестов

Эту задачу также можно использовать в конвейере сборки для публикации результатов протестированного кода , полученных при выполнении тестов, в Azure Pipelines или TFS для получения отчетов об охвате.

Предварительные требования

Если вы используете локальный агент Windows, на компьютере должны быть установлены следующие необходимые компоненты:

Значения по умолчанию для задач

Параметр по умолчанию использует формат JUnit для публикации результатов теста. При использовании VSTest в качестве testRunner параметр testResultsFiles следует изменить на **/TEST-*.trx.

testResultsFormat — это псевдоним для входного имени testRunner . Файлы результатов могут быть созданы несколькими средствами выполнения, а не только определенными средствами выполнения. Например, формат результатов jUnit поддерживается многими средствами выполнения, а не только jUnit.

Сведения о публикации результатов тестирования для Python с помощью YAML см. в разделе Python в разделе Экосистемы этих разделов , в котором также содержатся примеры для других языков.

Сопоставление форматов результатов

В этой таблице перечислены поля, указанные на вкладке Тесты в сводке по сборке или выпуску, а также соответствующее сопоставление с атрибутами в поддерживаемых форматах результатов теста.

Область Поле Тест Visual Studio (TRX)
Тестовый запуск Заголовок Заголовок тестового запуска , указанный в задаче
Дата начала /TestRun/Times.Attributes["start"]. Значение
Дата завершения /TestRun/Times.Attributes["finish"]. Значение
Duration Дата завершения — дата начала
Вложения См. раздел поддержки вложений ниже.
Результат теста Заголовок /TestRun/Results/UnitTestResult.Attributes["testName"]. Значение или /TestRun/Results/WebTestResult.Attributes["testName"]. Значение или /testRun/Results/TestResultAggregation.Attributes["testName"]. Значение
Дата начала /TestRun/Results/UnitTestResult.Attributes["startTime"]. Значение или /TestRun/Results/WebTestResult.Attributes["startTime"]. Значение или /testRun/Results/TestResultAggregation.Attributes["startTime"]. Значение
Дата завершения /TestRun/Results/UnitTestResult.Attributes["startTime"]. Значение + /TestRun/Results/UnitTestResult.Attributes["duration"]. Значение или /TestRun/Results/WebTestResult.Attributes["startTime"]. Value + /TestRun/Results/WebTestResult.Attributes["duration"]. Значение или /testRun/Results/TestResultAggregation.Attributes["startTime"]. Value + /TestRun/Results/TestResultAggregation.Attributes["duration"]. Значение
Duration /TestRun/Results/UnitTestResult.Attributes["duration"]. Значение или /TestRun/Results/WebTestResult.Attributes["duration"]. Значение или /testRun/Results/TestResultAggregation.Attributes["duration"]. Значение
Владелец /TestRun/TestDefinitions/UnitTest/Owners/Owner.Attributes["name"]. Значение
Результат /TestRun/Results/UnitTestResult.Attributes["outcome"]. Value или /TestRun/Results/WebTestResult.Attributes["outcome"]. Value или /testRun/Results/TestResultAggregation.Attributes["outcome"]. Значение
Сообщение об ошибке /TestRun/results/UnitTestResult/Output/ErrorInfo/Message.InnerText или /TestRun/results/WebTestResultOutput/ErrorInfo/Message.InnerText или /TestRun/results/testResultAggregation/Output/ErrorInfo/Message.InnerText
трассировка стека; /TestRun/Results/UnitTestResult/Output/ErrorInfo/StackTrace.InnerText или /TestRun/Results/WebTestResultOutput/ErrorInfo/StackTrace.InnerText или /TestRun/Results/TestResultAggregation/Output/ErrorInfo/StackTrace.InnerText
Вложения См. раздел поддержки вложений ниже.
Журнал консоли /TestRun/Results/UnitTestResult/Output/StdOut.InnerText или /TestRun/results/WebTestResultOutput/Output/StdOut.InnerText или /TestRun/Results/TestResultAggregation/Output/StdOut.InnerText
Журнал ошибок консоли /TestRun/Results/UnitTestResult/Output/StdErr.InnerText или /TestRun/results/WebTestResultOutput/Output/StdErr.InnerText или /TestRun/Results/TestResultAggregation/Output/StdErr.InnerText
Имя агента /TestRun/Results/UnitTestResult.Attributes["computerName"]. Значение или /TestRun/Results/WebTestResult.Attributes["computerName"]. Значение или /testRun/Results/TestResultAggregation.Attributes["computerName"]. Значение
Тестовый файл /TestRun/TestDefinitions/UnitTest.Attributes["storage"]. Значение
Приоритет /TestRun/TestDefinitions/UnitTest.Attributes["priority"]. Значение

Примечание

Длительность используется только в том случае, если дата начала и дата завершения недоступны.

Полный формат имени для testNameNamespace.Testclass.Methodname с ограничением символов 512. Если тест управляется данными и имеет параметры, ограничение символов будет включать параметры.

При публикации результата теста может возникнуть следующая ошибка: Не удалось опубликовать результаты теста: указан недопустимый приоритет

Эта ошибка возникает, если какой-либо из методов теста имеет приоритет выше 255, исправьте приоритет метода теста в коде и выполните тесты снова. Вы можете просмотреть созданный файл trx, чтобы увидеть все тесты с приоритетом более 255.

Поддержка вложений

Задача Публикация результатов теста обеспечивает поддержку вложений для тестового запуска и результатов теста в следующих форматах. Для общедоступных проектов поддерживается 2 ГБ общего количества вложений.

Тест Visual Studio (TRX)

Область Тип Путь
Тестовый запуск Сборщик данных /TestRun/ResultSummary/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Значение
Результат теста /TestRun/ResultSummary/ResultFiles/ResultFile.Attributes["path"]. Значение
Покрытие кода /TestRun/TestSettings/Execution/AgentRule/DataCollectors/DataCollector/Configuration/CodeCoverage/Regular/CodeCoverageItem.Attributes["binaryFile"]. Value And /testRun/TestSettings/Execution/AgentRule/DataCollectors/DataCollector/Configuration/CodeCoverage/Regular/CodeCoverageItem.Attributes["pdbFile"]. Значение
Результат теста Сборщики данных /TestRun/Results/UnitTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Значение или /testRun/Results/WebTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Значение или /testRun/Results/TestResultAggregation/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Значение
Результат теста /TestRun/Results/UnitTestResult/ResultFiles/ResultFile.Attributes["path"]. Значение или /TestRun/Results/WebTestResult/ResultFiles/ResultFile.Attributes["path"]. Value Или /TestRun/Results/TestResultAggregation/ResultFiles/ResultFile.Attributes["path"]. Значение

Примечание

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

Примеры

Docker

Для приложений на основе Docker существует множество способов создания приложения и выполнения тестов.

  • Сборка и тестирование в конвейере сборки: сборки и тесты выполняются в конвейере, а результаты тестирования публикуются с помощью задачи Публикация результатов теста .
  • Сборка и тестирование с помощью многоэтапного файла Dockerfile: сборки и тесты выполняются в контейнере с помощью многоэтапного файла Docker, так как результаты теста не публикуются обратно в конвейер.
  • Сборка, тестирование и публикация результатов с помощью Dockerfile: сборки и тесты выполняются внутри контейнера, а результаты публикуются обратно в конвейер. См. пример ниже.

Создание, тестирование и публикация результатов с помощью файла Docker

При таком подходе вы создаете код и выполняете тесты в контейнере с помощью файла Docker. Затем результаты теста копируются на узел для публикации в конвейере. Чтобы опубликовать результаты теста в Azure Pipelines, можно использовать задачу Публикация результатов теста . Окончательный образ будет опубликован в Docker или Реестр контейнеров Azure.

Получите код
  1. Dockerfile.build Создайте файл в корне каталога проекта со следующими параметрами:

    # Build and run tests inside the docker container
    FROM mcr.microsoft.com/dotnet/sdk:2.1
    WORKDIR /app
    # copy the contents of agent working directory on host to workdir in container
    COPY . ./
    # dotnet commands to build, test, and publish
    RUN dotnet restore
    RUN dotnet build -c Release
    RUN dotnet test dotnetcore-tests/dotnetcore-tests.csproj -c Release --logger "trx;LogFileName=testresults.trx"
    RUN dotnet publish -c Release -o out
    ENTRYPOINT dotnet dotnetcore-sample/out/dotnetcore-sample.dll
    

    Этот файл содержит инструкции по сборке кода и выполнению тестов. Затем тесты копируются в файл testresults.trx внутри контейнера.

  2. Чтобы сделать окончательный образ как можно меньше, содержащий только артефакты среды выполнения и развертывания, замените содержимое существующего Dockerfile на следующее:

    # This Dockerfile creates the final image to be published to Docker or
    # Azure Container Registry
    # Create a container with the compiled asp.net core app
    FROM mcr.microsoft.com/dotnet/aspnet:2.1
    # Create app directory
    WORKDIR /app
    # Copy only the deployment artifacts
    COPY /out .
    ENTRYPOINT ["dotnet", "dotnetcore-sample.dll"]
    
Определение конвейера сборки
  1. Если у вас есть учетная запись Docker Hub и вы хотите отправить образ в реестр Docker, замените содержимое .vsts-ci.docker.yml файла следующим:

    # Build Docker image for this app, to be published to Docker Registry
    pool:
      vmImage: 'ubuntu-latest'
    variables:
      buildConfiguration: 'Release'
    steps:
    - script: |
        docker build -f Dockerfile.build -t $(dockerId)/dotnetcore-build:$BUILD_BUILDID .
        docker run --name dotnetcoreapp --rm -d $(dockerId)/dotnetcore-build:$BUILD_BUILDID
        docker cp dotnetcoreapp:app/dotnetcore-tests/TestResults $(System.DefaultWorkingDirectory)
        docker cp dotnetcoreapp:app/dotnetcore-sample/out $(System.DefaultWorkingDirectory)
        docker stop dotnetcoreapp
    
    - task: PublishTestResults@2
      inputs:
        testRunner: VSTest
        testResultsFiles: '**/*.trx'
        failTaskOnFailedTests: true
    
    - script: |
        docker build -f Dockerfile -t $(dockerId)/dotnetcore-sample:$BUILD_BUILDID .
        docker login -u $(dockerId) -p $pswd
        docker push $(dockerId)/dotnetcore-sample:$BUILD_BUILDID
      env:
        pswd: $(dockerPassword)
    

    Кроме того, если вы настроите Реестр контейнеров Azure и хотите отправить образ в этот реестр, замените содержимое .vsts-ci.yml файла следующим:

    # Build Docker image for this app to be published to Azure Container Registry
    pool:
      vmImage: 'ubuntu-latest'
    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: |
        docker build -f Dockerfile.build -t $(dockerId)/dotnetcore-build:$BUILD_BUILDID .
        docker run --name dotnetcoreapp --rm -d $(dockerId)/dotnetcore-build:$BUILD_BUILDID
        docker cp dotnetcoreapp:app/dotnetcore-tests/TestResults $(System.DefaultWorkingDirectory)
        docker cp dotnetcoreapp:app/dotnetcore-sample/out $(System.DefaultWorkingDirectory)
        docker stop dotnetcoreapp
    
    - task: PublishTestResults@2
      inputs:
        testRunner: VSTest
        testResultsFiles: '**/*.trx'
        failTaskOnFailedTests: true
    
    - script: |
        docker build -f Dockerfile -t $(dockerId).azurecr.io/dotnetcore-sample:$BUILD_BUILDID .
        docker login -u $(dockerId) -p $pswd $(dockerid).azurecr.io
        docker push $(dockerId).azurecr.io/dotnetcore-sample:$BUILD_BUILDID 
      env:
        pswd: $(dockerPassword)
    
  2. Отправьте изменение в ветвь main в репозитории.

  3. Если вы используете Реестр контейнеров Azure, убедитесь, что вы предварительно создали реестр в портал Azure. Скопируйте имя администратора и пароль, указанные в разделе Ключи доступа параметров реестра в портал Azure.

  4. Обновите конвейер сборки следующими параметрами:

    • Пул агентов: Hosted Ubuntu 1604
      • dockerId: задайте значение идентификатора Docker для DockerHub или имя пользователя администратора для Реестр контейнеров Azure.
      • dockerPassword: задайте значение пароля для DockerHub или пароля администратора Реестр контейнеров Azure.
    • Путь к файлу YAML: /.vsts-ci.docker.yml
  5. Очередь новой сборки и watch ее создания и отправки образа Docker в реестр, а результаты тестирования — в Azure DevOps.

Требования

Требование Описание
Типы конвейеров YAML, классическая сборка, классический выпуск
Выполняется в Агент, DeploymentGroup
Требования None
Capabilities Эта задача не удовлетворяет требованиям для последующих задач в задании.
Ограничения команд Любой
Устанавливаемые переменные Любой
Версия агента 2.0.0 или более поздней версии
Категория задач Тест