PublishTestResults@2 – Tarefa Publicar Resultados do Teste v2

Publicar resultados de teste no Azure Pipelines.

Publicar resultados de teste no Azure Pipelines/TFS.

Syntax

# 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.

Entradas

testResultsFormat - Formato de resultado do teste
Alias de entrada: testRunner. string. Obrigatórios. Valores permitidos: JUnit, , NUnit, VSTest, XUnit, CTest. Valor padrão: JUnit.

Especifica o formato dos arquivos de resultados que você deseja publicar. Há suporte para os seguintes formatos: CTest, JUnit, NUnit 2, NUnit 3, TRX (Visual Studio Test) e xUnit 2.


testResultsFormat - Formato de resultado do teste
Alias de entrada: testRunner. string. Obrigatórios. Valores permitidos: JUnit, NUnit, , VSTest. XUnit Valor padrão: JUnit.

Especifica o formato dos arquivos de resultados que você deseja publicar. Há suporte para os seguintes formatos: CTest, JUnit, NUnit 2, NUnit 3, TRX (Visual Studio Test) e xUnit 2.


testResultsFiles - Arquivos de resultados de teste
string. Obrigatórios. Valor padrão: **/TEST-*.xml.

Especifica um ou mais arquivos de resultados de teste.

  • Você pode usar um curinga de pasta única (*) e curingas recursivos (**). Por exemplo, **/TEST-*.xml pesquisa todos os arquivos XML cujos nomes começam com TEST- em todos os subdiretórios. Se estiver usando o VSTest como o formato de resultados de teste, o tipo de arquivo deverá ser alterado para .trx, por exemplo, **/TEST-*.trx
  • Vários caminhos podem ser especificados, separados por uma nova linha.
  • Além disso, aceita padrões de minimatch.

Por exemplo, !TEST[1-3].xml exclui arquivos chamados de TEST1.xml, TEST2.xml ou TEST3.xml.


searchFolder - pasta Pesquisa
string. Valor padrão: $(System.DefaultWorkingDirectory).

Opcional. Especifica a pasta para pesquisar os arquivos de resultado do teste.


mergeTestResults - Resultados do teste de mesclagem
boolean. Valor padrão: false.

Quando o valor desse booliano é true, a tarefa relata os resultados de teste de todos os arquivos em uma única execução de teste. Se o valor for false, a tarefa criará uma execução de teste separada para cada arquivo de resultado de teste.

Observação

Use a configuração de resultados de teste de mesclagem para combinar arquivos da mesma estrutura de teste para garantir que o mapeamento e a duração dos resultados sejam calculados corretamente.


failTaskOnFailedTests - Falhar se houver falhas de teste
boolean. Valor padrão: false.

Opcional. Quando o valor desse booliano for true, a tarefa falhará se algum dos testes no arquivo de resultados for marcado como com falha. O padrão é false, que simplesmente publicará os resultados do arquivo de resultados.


failTaskOnFailureToPublishResults - Falha se houver falha na publicação dos resultados do teste
boolean. Valor padrão: false.

Quando true, falha na tarefa se houver falha na publicação dos resultados do teste.


failTaskOnMissingResultsFile - Falha se nenhum arquivo de resultado for encontrado
boolean. Valor padrão: false.

Falha na tarefa se nenhum arquivo de resultado for encontrado.


testRunTitle - Título da execução de teste
string.

Opcional. Especifica um nome para a execução de teste na qual os resultados serão relatados. Os nomes de variáveis declarados no pipeline de build ou de lançamento podem ser usados.


buildPlatform - Plataforma de Build
Alias de entrada: platform. string.

Opcional. Especifica a plataforma de build na qual a execução do teste deve ser relatada. Por exemplo: x64 ou x86. Se você definiu uma variável para a plataforma em sua tarefa de build, use-a aqui.


buildConfiguration - Configuração de build
Alias de entrada: configuration. string.

Opcional. Especifica a configuração de build na qual a execução do teste deve ser relatada. Por exemplo: Debug ou Release. Se você definiu uma variável para a configuração em sua tarefa de build, use-a aqui.


publishRunAttachments - Carregar arquivos de resultados de teste
boolean. Valor padrão: true.

Opcional. Quando o valor desse booliano é true, a tarefa carrega todos os arquivos de resultado de teste como anexos à execução do teste.


Opções de controle da tarefa

Todas as tarefas têm opções de controle além de suas entradas de tarefa. Para obter mais informações, consulte Opções de controle e propriedades comuns da tarefa.

Variáveis de saída

Nenhum.

Comentários

Essa tarefa publica os resultados de teste no Azure Pipelines ou no TFS, quando os testes são executados para fornecer uma experiência abrangente de análise e relatórios de teste. Você pode usar o executor de teste de sua escolha que dá suporte ao formato de resultados necessário. Os formatos com suporte incluem CTest, JUnit (incluindo PHPUnit), NUnit 2, NUnit 3, Teste do Visual Studio (TRX) e xUnit 2.

Outras tarefas internas, como a tarefa Teste do Visual Studio e a tarefa da CLI do Dot NetCore , publicam automaticamente os resultados do teste no pipeline. Tarefas como Ant, Maven, Gulp, Grunt e Xcode fornecem resultados de publicação como uma opção dentro da tarefa ou criam bibliotecas como Cobertura e JaCoCo. Se você estiver usando qualquer uma dessas tarefas, não precisará de uma tarefa Publicar Resultados de Teste separada no pipeline.

Os resultados do teste publicado são exibidos na guia Testes no resumo do pipeline. Os resultados ajudam você a medir a qualidade do pipeline, examinar a rastreabilidade, solucionar problemas de falhas e impulsionar a propriedade de falhas.

O exemplo a seguir mostra que a tarefa está configurada para publicar os resultados do teste.

Página Abrir histórico de testes

Você também pode usar essa tarefa em um pipeline de build para publicar os resultados de cobertura de código produzidos ao executar testes no Azure Pipelines ou no TFS para obter relatórios de cobertura.

Pré-requisitos

Se você estiver usando um agente auto-hospedado do Windows, seu computador deverá ter esse pré-requisito instalado:

Padrões da tarefa

A opção padrão usa o formato JUnit para publicar os resultados de teste. Ao usar o VSTest como testRunner, a opção testResultsFiles deve ser alterada para **/TEST-*.trx.

testResultsFormat é um alias para o nome de entrada testRunner. Os arquivos de resultados podem ser produzidos por vários executores, não apenas por um executor específico. Por exemplo, o formato de resultados jUnit tem suporte de muitos executores e não apenas jUnit.

Para publicar resultados de teste para Python usando YAML, confira Python na seção Ecossistemas desses tópicos, que também inclui exemplos para outras linguagens.

Mapeamento de formatos de resultado

Esta tabela lista os campos relatados na guia Testes em um resumo de build ou versão e o mapeamento correspondente com os atributos nos formatos de resultado de teste com suporte.

Escopo Campo Teste do Visual Studio (TRX)
Execução de teste Título Título da execução de teste especificado na tarefa
Data de início /TestRun/Times.Attributes["start"].Value
Data de conclusão /TestRun/Times.Attributes["finish"].Value
Duration Data de conclusão – Data de início
Anexos Veja a seção Suporte a anexos abaixo
Resultado de teste Título /TestRun/Results/UnitTestResult.Attributes["testName"].Value Or /TestRun/Results/WebTestResult.Attributes["testName"].Value Or /TestRun/Results/TestResultAggregation.Attributes["testName"].Value
Data de início /TestRun/Results/UnitTestResult.Attributes["startTime"].Value Or /TestRun/Results/WebTestResult.Attributes["startTime"].Value Or /TestRun/Results/TestResultAggregation.Attributes["startTime"].Value
Data de conclusão /TestRun/Results/UnitTestResult.Attributes["startTime"].Value + /TestRun/Results/UnitTestResult.Attributes["duration"].Value Or /TestRun/Results/WebTestResult.Attributes["startTime"].Value + /TestRun/Results/WebTestResult.Attributes["duration"].Value Or /TestRun/Results/TestResultAggregation.Attributes["startTime"].Value + /TestRun/Results/TestResultAggregation.Attributes["duration"].Value
Duration /TestRun/Results/UnitTestResult.Attributes["duration"].Value Or /TestRun/Results/WebTestResult.Attributes["duration"].Value Or /TestRun/Results/TestResultAggregation.Attributes["duration"].Value
Proprietário /TestRun/TestDefinitions/UnitTest/Owners/Owner.Attributes["name"].Value
Resultado /TestRun/Results/UnitTestResult.Attributes["outcome"].Value Or /TestRun/Results/WebTestResult.Attributes["outcome"].Value Or /TestRun/Results/TestResultAggregation.Attributes["outcome"].Value
Mensagem de erro /TestRun/Results/UnitTestResult/Output/ErrorInfo/Message.InnerText Or /TestRun/Results/WebTestResultOutput/ErrorInfo/Message.InnerText Or /TestRun/Results/TestResultAggregation/Output/ErrorInfo/Message.InnerText
Rastreamento de pilha /TestRun/Results/UnitTestResult/Output/ErrorInfo/StackTrace.InnerText Or /TestRun/Results/WebTestResultOutput/ErrorInfo/StackTrace.InnerText Or /TestRun/Results/TestResultAggregation/Output/ErrorInfo/StackTrace.InnerText
Anexos Veja a seção Suporte a anexos abaixo
Log de console /TestRun/Results/UnitTestResult/Output/StdOut.InnerText Or /TestRun/Results/WebTestResultOutput/Output/StdOut.InnerText Or /TestRun/Results/TestResultAggregation/Output/StdOut.InnerText
Log de erros do console /TestRun/Results/UnitTestResult/Output/StdErr.InnerText Or /TestRun/Results/WebTestResultOutput/Output/StdErr.InnerText Or /TestRun/Results/TestResultAggregation/Output/StdErr.InnerText
Nome do agente /TestRun/Results/UnitTestResult.Attributes["computerName"].Value Or /TestRun/Results/WebTestResult.Attributes["computerName"].Value Or /TestRun/Results/TestResultAggregation.Attributes["computerName"].Value
Arquivo de teste /TestRun/TestDefinitions/UnitTest.Attributes["storage"].Value
Prioridade /TestRun/TestDefinitions/UnitTest.Attributes["priority"].Value

Observação

A Duração é usada somente quando a Data de início e Data de conclusão não estão disponíveis.

O formato de nome totalmente qualificado para testName é Namespace.Testclass.Methodname com um limite de caracteres de 512. Se o teste for controlado por dados e tiver parâmetros, o limite de caracteres incluirá os parâmetros.

Ao publicar o resultado do teste, você pode receber este erro: Falha ao publicar os resultados do teste: Prioridade inválida especificada

Esse erro ocorrerá se qualquer um dos métodos de teste tiver prioridade definida acima de 255, corrija a prioridade do método de teste no código e execute os testes novamente. Você pode examinar o arquivo trx gerado para ver todos os testes com prioridade maior que 255.

Suporte a anexos

A tarefa Publicar Resultados de Teste fornece suporte para anexos para resultados de teste e execução de teste para os seguintes formatos. Para projetos públicos, damos suporte a 2 GB de anexos totais.

Teste do Visual Studio (TRX)

Escopo Tipo Caminho
Execução de teste Coletor de Dados /TestRun/ResultSummary/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"].Value
Resultado do teste /TestRun/ResultSummary/ResultFiles/ResultFile.Attributes["path"].Value
Cobertura de código /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"].Value
Resultado de teste Coletores de Dados /TestRun/Results/UnitTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"].Value Or /TestRun/Results/WebTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"].Value Or /TestRun/Results/TestResultAggregation/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"].Value
Resultado do teste /TestRun/Results/UnitTestResult/ResultFiles/ResultFile.Attributes["path"].Value Or /TestRun/Results/WebTestResult/ResultFiles/ResultFile.Attributes["path"].Value Or /TestRun/Results/TestResultAggregation/ResultFiles/ResultFile.Attributes["path"].Value

Observação

A opção para carregar o arquivo de resultados de teste como um anexo é uma opção padrão na tarefa, aplicável a todos os formatos.

Exemplos

Docker

Para aplicativos baseados no Docker, há várias maneiras de criar seu aplicativo e executar testes:

  • Compilar e testar em um pipeline de build: os builds e os testes são executados no pipeline e os resultados do teste são publicados usando a tarefa Publicar Resultados do Teste .
  • Compilar e testar com um Dockerfile de vários estágios: compilações e testes são executados dentro do contêiner usando um arquivo docker de vários estágios, pois esses resultados de teste não são publicados de volta no pipeline.
  • Criar, testar e publicar resultados com um Dockerfile: compilações e testes são executados dentro do contêiner e os resultados são publicados de volta no pipeline. Veja o exemplo abaixo.

Compilar, testar e publicar resultados com um arquivo do Docker

Nessa abordagem, você compila seu código e executa testes dentro do contêiner usando um arquivo do Docker. Os resultados de teste são copiados para o host a ser publicado no pipeline. Para publicar os resultados de teste no Azure Pipelines, você pode usar a tarefa Publicar Resultados de Teste. A imagem final será publicada no Docker ou Registro de Contêiner do Azure.

Obter o código
  1. Crie um arquivo Dockerfile.build na raiz do diretório do projeto com o seguinte:

    # 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
    

    Esse arquivo contém as instruções para compilar o código e executar testes. Em seguida, os testes serão copiados para um arquivo testresults.trx dentro do contêiner.

  2. Para tornar a imagem final o menor possível, contendo apenas os artefatos de runtime e implantação, substitua o conteúdo do Dockerfile existente pelo seguinte:

    # 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"]
    
Defina o pipeline de build
  1. Se você tiver uma conta Docker Hub e quiser enviar a imagem para o registro do Docker, substitua o conteúdo do arquivo .vsts-ci.docker.yml pelo seguinte:

    # 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)
    

    Como alternativa, se você configurar um Registro de Contêiner do Azure e quiser enviar a imagem para esse registro, substitua o conteúdo do arquivo .vsts-ci.yml pelo seguinte:

    # 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. Envie a alteração para a ramificação principal no repositório.

  3. Se você usar o Registro de Contêiner do Azure, crie previamente o registro no portal do Azure. Copie o nome de usuário e a senha do administrador mostrados na seção Chaves de acesso das configurações de registro no portal do Azure.

  4. Atualizar o pipeline de build com o seguinte

    • Pool de agentes: Hosted Ubuntu 1604
      • dockerId: defina o valor como sua ID do Docker para DockerHub ou o nome de usuário do administrador para Registro de Contêiner do Azure.
      • dockerPassword: defina o valor como sua senha do DockerHub ou a senha de administrador do Registro de Contêiner do Azure.
    • Caminho do arquivo YAML: /.vsts-ci.docker.yml
  5. Enfileire um novo build e veja-o criar e enviar uma imagem do Docker para o registro e os resultados de teste para o Azure DevOps.

Requisitos

Requisito Descrição
Tipos de pipeline YAML, build clássico, versão clássica
Executa em Agent, DeploymentGroup
Demandas Nenhum
Funcionalidades Essa tarefa não atende a nenhuma demanda para tarefas subsequentes no trabalho.
Restrições de comando Qualquer
Variáveis configuráveis Qualquer
Versão do agente 2.0.0 ou superior
Categoria da tarefa Teste