發佈測試結果工作

Azure DevOps Services |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018

注意

在 Microsoft Team Foundation Server (TFS) 2018 和舊版中,組建和發行管線稱為定義執行稱為組建服務連線稱為服務端點階段稱為環境,而作業稱為階段

當執行測試以提供完整的測試報告和分析體驗時,此工作會將測試結果發佈至Azure Pipelines或 TFS。 您可以使用您選擇的測試執行器,以支援所需的結果格式。 支援的結果格式包括CTestJUnit (包括PHPUnit) 、NUnit 2NUnit 3、Visual Studio Test (TRX) 和xUnit 2

其他內建工作,例如Visual Studio測試工作Dot NetCore CLI工作會自動將測試結果發佈至管線,而AntMavenGulpGrunt.NET CoreXcode等工作則提供發佈結果做為工作內的選項,或建置CoberturaJaCoCo等程式庫。 如果您使用上述任何工作,則不需要管線中的個別 發行測試結果 工作。

已發佈的測試結果會顯示在管線摘要的 [ 測試 ] 索引標籤中,並協助您測量管線品質、檢閱可追蹤性、疑難排解失敗,以及驅動失敗擁有權。

下列範例顯示設定為發佈測試結果的工作。

Open the test history page

您也可以在組建管線中使用此工作,在執行測試以Azure Pipelines或 TFS 以取得涵蓋範圍報告時所產生的程式代碼涵蓋範圍結果

檢查必要條件

如果您使用Windows自我裝載代理程式,請確定您的電腦已安裝此必要條件:

要求

[none]

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 選項應變更為 **/TEST-*.trx

testResultsFormattestRunner 輸入名稱的別名。 結果檔案可由多個執行器產生,而不只是特定執行器。 例如,許多執行器都支援 jUnit 結果格式,而不只是 jUnit。

若要使用 YAML 發佈 Python 的測試結果,請參閱這些主題的生態系統中的Python一節,其中也包含其他語言的範例。

引數

注意

以下指定的選項適用于最新版的工作。

引數 描述
testRunner
測試結果格式
(必要) 指定您要發佈的結果檔格式。 下列為支援的格式:
- CTestJUnitNUnit 2NUnit 3、Visual Studio Test (TRX) 和xUnit 2
預設值:JUnit
引數別名: testResultsFormat
testResultsFiles
測試結果檔案
(必要) 使用此來指定一或多個測試結果檔案。
- 您可以使用單一資料夾萬用字元 (*) 和遞迴萬用字元 (**) 。 例如, **/TEST-*.xml 搜尋名稱開頭 TEST- 為所有子目錄中的所有 XML 檔案。 如果使用 VSTest 做為測試結果格式,則檔案類型應該變更為 .trx ,例如 **/TEST-*.trx
- 可以指定多個路徑,並以分行符號分隔。
- 此外,還接受 迷你模式
例如, !TEST[1-3].xml 排除名為 TEST1.xmlTEST2.xml 或 的 TEST3.xml 檔案。
預設值:**/TEST-*.xml
searchFolder
[搜尋] 資料夾
(選擇性) 資料夾來搜尋測試結果檔案。
預設值:$(System.DefaultWorkingDirectory)
mergeTestResults
合併測試結果
選取此選項時,將會針對單一 測試回合報告來自所有檔案的測試結果。 如果未選取此選項,將會為每個測試結果檔案建立個別的測試回合。
注意:使用合併測試結果來合併來自相同測試架構的檔案,以確保正確計算結果對應和持續時間。
預設值:false
failTaskOnFailedTests
如果測試失敗,則失敗
(選擇性) 選取時,如果結果檔中的任何測試標示為失敗,工作將會失敗。 預設值為 false,只會從結果檔發佈結果。
預設值:false
testRunTitle
測試回合標題
(選擇性) 使用此選項提供將報告結果的測試回合名稱。 您可以使用組建或發行管線中宣告的變數名稱。
platform
組建平台
(應報告測試回合的選擇性) 建置平臺。
例如,x64x86。 如果您已在建置工作中定義平臺的變數,請使用這裡。
引數別名: buildPlatform
configuration
組建設定
建置應該報告測試回合的組態。 例如,偵錯或發行。 如果您已在建置工作中定義組態的變數,請使用這裡。
引數別名: buildConfiguration
publishRunAttachments
Upload測試結果檔案
(選擇性) 選取時,工作會將所有測試結果檔案上傳為測試回合的附件。
預設值:true

結果格式對應

下表列出組建或發行摘要中 [ 測試 ] 索引標籤中報告的欄位,以及與支援測試結果格式之屬性的對應。

範圍 欄位 Visual Studio測試 (TRX)
測試執行 標題 在工作中指定的測試回合標題
開始日期 /TestRun/Times.Attributes[「start」]。價值
完成日期 /TestRun/Times.Attributes[「finish」]。價值
持續時間 完成日期 - 開始日期
附件 請參閱下方 的附件支援 一節
測試結果 標題 /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」]。值 + /TestRun/Results/WebTestResult.Attributes[「duration」]。值或 /TestRun/Results/TestResultAggregation.Attributes[「startTime」]。值 + /TestRun/Results/TestResultAggregation.Attributes[「duration」]。價值
Duration1 /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[「result」]。值或 /TestRun/Results/WebTestResult.Attributes[「result」]。值或 /TestRun/Results/TestResultAggregation.Attributes[「result」]。價值
錯誤訊息 /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」]。價值

1只有在 [開始日期]和 [日期完成] 無法使用時,才會使用Duration

2 完整名稱格式為 Namespace.Testclass.Methodname ,字元限制為 512。 如果測試是資料驅動且具有參數,字元限制將會包含參數。

Docker

針對 Docker 型應用程式,有許多方式可以建置您的應用程式並執行測試:

  • 在建置管線中建置和測試:建置和測試會在管線中執行,並使用 [發佈測試結果] 工作發佈測試結果
  • 使用多階段 Dockerfile 建置及測試:使用多階段 Docker 檔案在容器內執行組建和測試,例如測試結果不會發佈回管線。
  • 使用 Dockerfile 建置、測試及發佈結果:建置和測試會在容器內執行,並將結果發佈回管線。 請參閱下方的範例。

使用 Docker 檔案建置、測試及發佈結果

在此方法中,您會使用 Docker 檔案建置程式碼,並在容器內執行測試。 測試結果接著會複製到要發佈至管線的主機。 若要將測試結果發佈至Azure Pipelines,您可以使用[發佈測試結果] 工作。 最終映射將會發佈至 Docker 或Azure Container Registry

取得程式碼

  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 Container Registry,並想要將映射推送至該登錄,請使用下列內容取代檔案的內容 .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 Container Registry,請確定您已在Azure 入口網站中預先建立登錄。 複製Azure 入口網站中登錄設定的 [存取金鑰] 區段中顯示的系統管理員使用者名稱和密碼。

  4. 使用下列專案更新您的組建管線

    • 代理程式組件區Hosted Ubuntu 1604
      • dockerId:將值設定為 DockerHub 的 Docker 識別碼或Azure Container Registry的系統管理員使用者名稱。
      • dockerPassword:將值設定為 DockerHub 的密碼或管理員密碼Azure Container Registry。
    • YAML 檔案路徑/.vsts-ci.docker.yml
  5. 將新的組建排入佇列,並監看它建立 Docker 映射,並將 Docker 映射推送至您的登錄,並將測試結果推送至Azure DevOps。

TFS 上尚未提供 YAML 組建。

附件支援

[發佈測試結果] 工作提供下列格式之測試回合和測試結果附件的支援。 對於公用專案,我們支援總附件的 2GB。

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」]。值和 /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」]。值或 /TestRun/Results/TestResultAggregation/ResultFiles/ResultFile.Attributes[「path」]。價值

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。 歡迎意見反應和貢獻。

說明及支援