如何将测试结果从一个Azure DevOps项目发布到另一个项目(YAML)
将Cypress测试结果发布到另一个Azure DevOps项目
要把CI/CD项目中的Cypress测试结果发布到另一个看板项目,默认的PublishTestResults@2任务仅支持当前项目,需要通过Azure DevOps REST API实现跨项目发布,具体步骤如下:
1. 准备权限与变量
- 生成目标项目的PAT:在目标看板项目的用户设置中创建个人访问令牌(PAT),权限至少包含
Test Management (Read & Write)和Build (Read),确保能创建测试运行并上传结果。 - 配置流水线变量:在CI/CD项目的流水线设置中添加两个变量:
TargetProjectId:目标看板项目的GUID(可在项目设置页面的URL中获取,或通过项目概况页面查看)TargetProjectPAT:将上述生成的PAT设为保密变量,避免泄露
2. 修改流水线YAML
在原有PublishTestResults@2任务之后,添加PowerShell任务调用REST API完成跨项目发布。修改后的完整YAML如下:
jobs: - job: Job_2 displayName: 'Cypress' pool: vmImage: windows-latest steps: - checkout: self clean: False - task: Npm@1 displayName: Install Packages inputs: workingDir: $(Build.SourcesDirectory)/Test_Project verbose: false - task: Npm@1 displayName: Run Tests inputs: workingDir: $(Build.SourcesDirectory)/Test_Project command: 'custom' customCommand: 'run cypress:run' - task: PublishTestResults@2 displayName: Publish Test Results to Current Project inputs: testResultsFormat: 'JUnit' testResultsFiles: 'junitreport.xml' searchFolder: '$(System.DefaultWorkingDirectory)/Test_Project/cypress/reports' # 新增:发布测试结果到目标看板项目 - task: PowerShell@2 displayName: 'Publish Test Results to Target Project' inputs: targetType: 'inline' script: | # 定义基础变量 $orgUrl = "$(System.CollectionUri)" $targetProjectId = "$(TargetProjectId)" $pat = "$(TargetProjectPAT)" $testResultsPath = "$(System.DefaultWorkingDirectory)/Test_Project/cypress/reports/junitreport.xml" $runName = "Cypress Test Run - $(Build.BuildNumber)" # 编码PAT用于API认证 $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) # 创建测试运行的请求体(如需关联指定Test Plan,取消注释plan字段并替换ID) $runBody = @{ name = $runName automated = $true # plan = @{ # id = 123 # 替换为目标项目的Test Plan ID # } } | ConvertTo-Json # 创建新的测试运行 $runResponse = Invoke-RestMethod -Uri "$orgUrl/$targetProjectId/_apis/test/runs?api-version=7.1-preview.3" ` -Method Post ` -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ` -ContentType "application/json" ` -Body $runBody $runId = $runResponse.id # 上传JUnit测试结果到新建的测试运行 Invoke-RestMethod -Uri "$orgUrl/$targetProjectId/_apis/test/runs/$runId/results?api-version=7.1-preview.6" ` -Method Post ` -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ` -ContentType "application/xml" ` -InFile $testResultsPath
3. 关键说明
- Test Plan关联:如果需要将测试结果关联到目标项目的特定Test Plan,取消
plan字段的注释并替换为对应的Test Plan ID(可在目标项目的Test Plans页面获取)。 - API版本:示例中使用的是Azure DevOps REST API的预览版本,如需稳定版本可替换为
7.0。 - 权限验证:确保PAT拥有目标项目的测试管理读写权限,否则会出现API调用失败的情况。
内容的提问来源于stack exchange,提问作者Fazeel Mehar
相关产品推荐
相关产品推荐

