发布测试结果任务

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 - TFS 2015

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

此任务在执行测试时将测试结果发布到 Azure Pipelines 或 TFS,以提供全面的测试报告和分析体验。 可以使用你选择的测试运行程序,该运行程序支持你要求的结果格式。 支持的结果格式包括CTest、JUnit (包括PHPUnit) 、NUnit 2、NUnit 3、Visual StudioTest (TRX) 和xUnit 2。

其他内置任务(如Visual Studio Test任务和 Dot NetCore CLI任务)会自动将测试结果发布到管道,而Ant、Maven、Gulp、Grunt、.NETCoreXcode等任务提供发布结果作为任务中的选项,或生成库(如CoberturaJaCoCo)。 如果使用上述任何任务,则管道中不需要单独的 "发布测试结果 任务。

已发布的测试结果显示在管道摘要的"测试"选项卡中,可帮助你度量管道质量、查看可跟踪性、排查故障和驱动器故障所有权。

以下示例演示配置为发布测试结果的任务。

打开测试历史记录页

还可以在生成管道中使用此任务将运行测试时生成的代码覆盖率结果发布到 Azure Pipelines 或 TFS,以获取覆盖率报告。

检查先决条件

如果使用的是自Windows代理,请确保计算机已安装此必备组件:

需求

[无]

YAML 代码片段

# Publish Test Results
# Publish test results to Azure Pipelines
- task: PublishTestResults@2
  inputs:
    #testResultsFormat: 'JUnit' # Options: JUnit, NUnit, VSTest, xUnit, cTest
    #testResultsFiles: '**/TEST-*.xml' 
    #searchFolder: '$(System.DefaultWorkingDirectory)' # Optional
    #mergeTestResults: false # Optional
    #failTaskOnFailedTests: false # Optional
    #testRunTitle: # Optional
    #buildPlatform: # Optional
    #buildConfiguration: # Optional
    #publishRunAttachments: true # Optional

默认选项使用 JUnit 格式发布测试结果。 将 VSTest 用作testRunner 时,testResultsFiles选项应更改为

testResultsFormattestRunner 输入名称的 别名。 结果文件可以由多个运行程序生成,而不只是由特定的运行程序生成。 例如,许多运行程序支持 jUnit 结果格式,而不只是 jUnit。

若要使用 YAML 发布 Python 的测试结果,请参阅这些主题的"生态系统"部分中的Python,其中还包括其他语言的示例。

参数

注意

下面指定的选项适用于任务的最新版本。

参数 说明
testRunner
测试结果格式
(必需) 指定要发布的结果文件的格式。 支持以下格式:
- - CTest、JUnit、NUnit 2、NUnit3、Visual StudioTest (TRX) 和 xUnit 2
默认值:30JUnit
参数别名: testResultsFormat
testResultsFiles
测试结果文件
(必需) 使用此参数指定一个或多个测试结果文件。
- 可以使用单文件夹通配符 () 递归 * 通配符 ** () 。 例如, **/TEST-*.xml 在所有子目录中搜索名称以 开始的所有 XML TEST- 文件。 如果使用 VSTest 作为测试结果格式,则文件类型应更改为, .trx 例如 **/TEST-*.trx
- 可以指定多个路径,用新行分隔。
- 此外, 还接受微型匹配模式
例如, !TEST[1-3].xml 排除名为 、 TEST1.xmlTEST2.xml 或 的文件 TEST3.xml
默认值:30**/TEST-*.xml
searchFolder
搜索文件夹
(可选) 文件夹"以搜索测试结果文件。
默认值:30$(System.DefaultWorkingDirectory)
mergeTestResults
合并测试结果
选择此选项后,将针对单个测试运行报告所有文件的 测试结果。 如果未选择此选项,将针对每个测试结果文件创建单独的测试运行。
注意:使用合并测试结果合并来自同一测试框架的文件,以确保正确计算结果映射和持续时间。
默认值:30false
failTaskOnFailedTests
如果测试失败,则失败
(可选) 选中后,如果结果文件的任何测试都标记为失败,则任务将失败。 默认值为 false,它将仅发布结果文件的结果。
默认值:30false
testRunTitle
测试运行标题
(可选) 使用此选项可为测试运行提供将报告结果的名称。 可以使用在生成或发布管道中声明的变量名称。
platform
生成平台
(可选) 生成平台,应报告测试运行。
例如,x64x86。 如果在生成任务中为平台定义了变量,请在此处使用该变量。
参数别名: buildPlatform
configuration
生成配置
应报告测试运行的生成配置。 例如"调试"或"发布"。 如果在生成任务中定义了用于配置的变量,请在此处使用该变量。
参数别名: buildConfiguration
publishRunAttachments
Upload测试结果文件
(可选) 选中后,任务将上传所有测试结果文件作为附件上传到测试运行。
默认值:30true

结果格式映射

下表列出了生成或发布摘要中"测试"选项卡中报告的字段,以及具有支持测试结果格式的属性的相应映射。

范围 字段 Visual Studio TRX (测试)
测试运行 标题 任务中指定的 测试运行标题
开始日期 /TestRun/Times.Attributes["start"]。价值
完成日期 /TestRun/Times.Attributes["完成"]。价值
持续时间 完成日期 - 开始日期
Attachments 请参阅下面的 附件 支持部分
测试结果 标题 /TestRun/Results/UnitTestResult.Attributes["testName"]。Value 或 /TestRun/Results/WebTestResult.Attributes["testName"]。Value 或 /TestRun/Results/TestResultAggregation.Attributes["testName"]。价值
开始日期 /TestRun/Results/UnitTestResult.Attributes["startTime"]。Value 或 /TestRun/Results/WebTestResult.Attributes["startTime"]。Value 或 /TestRun/Results/TestResultAggregation.Attributes["startTime"]。价值
完成日期 /TestRun/Results/UnitTestResult.Attributes["startTime"]。值 + /TestRun/Results/UnitTestResult.Attributes["duration"]。Value 或 /TestRun/Results/WebTestResult.Attributes["startTime"]。值 + /TestRun/Results/WebTestResult.Attributes["duration"]。Value 或 /TestRun/Results/TestResultAggregation.Attributes["startTime"]。值 + /TestRun/Results/TestResultAggregation.Attributes["duration"]。价值
持续时间1 /TestRun/Results/UnitTestResult.Attributes["duration"]。Value 或 /TestRun/Results/WebTestResult.Attributes["duration"]。Value 或 /TestRun/Results/TestResultAggregation.Attributes["duration"]。价值
所有者 /TestRun/TestDefinitions/UnitTest/Owners/Owner.Attributes["名称"]。价值
业务成效 /TestRun/Results/UnitTestResult.Attributes["结果"]。Value 或 /TestRun/Results/WebTestResult.Attributes["结果"]。Value 或 /TestRun/Results/TestResultAggregation.Attributes["结果"]。价值
错误消息 /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
Attachments 请参阅下面的 附件 支持部分
控制台日志 /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"]。Value 或 /TestRun/Results/WebTestResult.Attributes["computerName"]。Value 或 /TestRun/Results/TestResultAggregation.Attributes["computerName"]。价值
测试文件 /TestRun/TestDefinitions/UnitTest.Attributes["存储"]。价值
优先级 /TestRun/TestDefinitions/UnitTest.Attributes["priority"]。价值

1只有在 日期开始日期 结束日期不可用 ,才使用持续时间。

2 完全限定的名称格式为 Namespace.Testclass.Methodname, 字符限制为 512。 如果测试是数据驱动的并且具有参数,则字符限制将包括参数。

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. 将更改推送到存储库中的主分支。

  3. 如果使用 Azure 容器注册表, 请确保已预先 在 Azure 门户。 复制注册表设置中注册表设置的"访问密钥"部分中显示的管理员用户名和密码Azure 门户。

  4. 使用以下内容更新生成管道

    • 代理池
      • dockerId:将值设置为 DockerHub 的 Docker ID 或 dockerHub 的管理员Azure 容器注册表。
      • dockerPassword:将值设置为 DockerHub 的密码或管理员密码Azure 容器注册表。
    • YAML 文件路径
  5. 将新生成排队并观察其创建 Docker 映像,以及将测试结果推送到注册表Azure DevOps。

YAML 生成在 TFS 上尚不可用。

附件支持

发布测试结果任务为以下格式的测试运行和测试结果提供附件支持。 对于公共项目,我们支持总附件 2GB。

Visual Studio TRX (测试)

作用域 类型 路径
测试运行 数据收集器 /TestRun/ResultSummary/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]。价值
测试结果 /TestRun/ResultSummary/ResultFiles/ResultFile.Attributes["路径"]。价值
代码覆盖率 /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"]。Value 或 /TestRun/Results/WebTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]。Value 或 /TestRun/Results/TestResultAggregation/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]。价值
测试结果 /TestRun/Results/UnitTestResult/ResultFiles/ResultFile.Attributes["路径"]。Value 或 /TestRun/Results/WebTestResult/ResultFiles/ResultFile.Attributes["路径"]。Value 或 /TestRun/Results/TestResultAggregation/ResultFiles/ResultFile.Attributes["路径"]。价值

NUnit 3

范围 路径
测试运行 /test-suite/attachments/attachment/filePath
测试运行 /test-suite[@type='Assembly']/test-case/attachments/attachment/filePath

注意

将测试结果文件作为附件上传的选项是任务中的默认选项,适用于所有格式。

常见问题

FQN 的最大允许限制是什么?

FQN 最大限制为 512 个字符。

对于数据驱动的测试,FQN 字符限制是否还包括属性及其值?

是的,FQN 字符限制包括属性及其值。

子结果的 FQN 会有所不同吗?

目前,数据驱动测试的子结果不会显示在相应的数据中。

示例:我有一个测试用例:将产品添加到购物车数据 1:产品 = 中国数据 2:产品 = 页脚

发布的所有测试子结果将只有测试用例名称和第一行的数据。

开源

此任务在 上是开源GitHub。 欢迎提供反馈和建议。

帮助和支持