發佈測試結果工作
Azure DevOps Services |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018
注意
在 Microsoft Team Foundation Server (TFS) 2018 和舊版中,組建和發行管線稱為定義、執行稱為組建、服務連線稱為服務端點、階段稱為環境,而作業稱為階段。
當執行測試以提供完整的測試報告和分析體驗時,此工作會將測試結果發佈至Azure Pipelines或 TFS。 您可以使用您選擇的測試執行器,以支援所需的結果格式。 支援的結果格式包括CTest、JUnit (包括PHPUnit) 、NUnit 2、NUnit 3、Visual Studio Test (TRX) 和xUnit 2。
其他內建工作,例如Visual Studio測試工作和Dot NetCore CLI工作會自動將測試結果發佈至管線,而Ant、Maven、Gulp、Grunt、.NET Core和Xcode等工作則提供發佈結果做為工作內的選項,或建置Cobertura和JaCoCo等程式庫。 如果您使用上述任何工作,則不需要管線中的個別 發行測試結果 工作。
已發佈的測試結果會顯示在管線摘要的 [ 測試 ] 索引標籤中,並協助您測量管線品質、檢閱可追蹤性、疑難排解失敗,以及驅動失敗擁有權。
下列範例顯示設定為發佈測試結果的工作。
您也可以在組建管線中使用此工作,在執行測試以Azure Pipelines或 TFS 以取得涵蓋範圍報告時所產生的程式代碼涵蓋範圍結果。
檢查必要條件
如果您使用Windows自我裝載代理程式,請確定您的電腦已安裝此必要條件:
- .NET Framework 4.6.2 或更新版本
要求
[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
。
testResultsFormat 是 testRunner 輸入名稱的別名。 結果檔案可由多個執行器產生,而不只是特定執行器。 例如,許多執行器都支援 jUnit 結果格式,而不只是 jUnit。
若要使用 YAML 發佈 Python 的測試結果,請參閱這些主題的生態系統中的Python一節,其中也包含其他語言的範例。
引數
注意
以下指定的選項適用于最新版的工作。
引數 | 描述 |
---|---|
testRunner 測試結果格式 |
(必要) 指定您要發佈的結果檔格式。 下列為支援的格式: - CTest、JUnit、NUnit 2、NUnit 3、Visual Studio Test (TRX) 和xUnit 2 預設值: JUnit 引數別名: testResultsFormat |
testResultsFiles 測試結果檔案 |
(必要) 使用此來指定一或多個測試結果檔案。 - 您可以使用單一資料夾萬用字元 ( * ) 和遞迴萬用字元 (** ) 。 例如, **/TEST-*.xml 搜尋名稱開頭 TEST- 為所有子目錄中的所有 XML 檔案。 如果使用 VSTest 做為測試結果格式,則檔案類型應該變更為 .trx ,例如 **/TEST-*.trx - 可以指定多個路徑,並以分行符號分隔。 - 此外,還接受 迷你模式。 例如, !TEST[1-3].xml 排除名為 TEST1.xml 、 TEST2.xml 或 的 TEST3.xml 檔案。 預設值: **/TEST-*.xml |
searchFolder [搜尋] 資料夾 |
(選擇性) 資料夾來搜尋測試結果檔案。 預設值: $(System.DefaultWorkingDirectory) |
mergeTestResults 合併測試結果 |
選取此選項時,將會針對單一 測試回合報告來自所有檔案的測試結果。 如果未選取此選項,將會為每個測試結果檔案建立個別的測試回合。 注意:使用合併測試結果來合併來自相同測試架構的檔案,以確保正確計算結果對應和持續時間。 預設值: false |
failTaskOnFailedTests 如果測試失敗,則失敗 |
(選擇性) 選取時,如果結果檔中的任何測試標示為失敗,工作將會失敗。 預設值為 false,只會從結果檔發佈結果。 預設值: false |
testRunTitle 測試回合標題 |
(選擇性) 使用此選項提供將報告結果的測試回合名稱。 您可以使用組建或發行管線中宣告的變數名稱。 |
platform 組建平台 |
(應報告測試回合的選擇性) 建置平臺。 例如, x64 或 x86 。 如果您已在建置工作中定義平臺的變數,請使用這裡。 引數別名: 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
取得程式碼
使用
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
。若要讓最終映射盡可能小,只包含執行時間和部署成品,請使用下列內容取代現有的
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"]
定義組建管線
如果您有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)
將變更推送至存放庫中的主要分支。
如果您使用 Azure Container Registry,請確定您已在Azure 入口網站中預先建立登錄。 複製Azure 入口網站中登錄設定的 [存取金鑰] 區段中顯示的系統管理員使用者名稱和密碼。
使用下列專案更新您的組建管線
- 代理程式組件區:
Hosted Ubuntu 1604
- dockerId:將值設定為 DockerHub 的 Docker 識別碼或Azure Container Registry的系統管理員使用者名稱。
- dockerPassword:將值設定為 DockerHub 的密碼或管理員密碼Azure Container Registry。
- YAML 檔案路徑:
/.vsts-ci.docker.yml
- 代理程式組件區:
將新的組建排入佇列,並監看它建立 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。 歡迎意見反應和貢獻。
說明及支援
- 請參閱 我們的疑難排解 頁面
- 取得Stack Overflow的建議,並透過開發人員社群取得支援