在Azure DevOps创建Bug工单时关联测试运行中的附件
在Azure DevOps中自动将测试失败截图关联到Bug工单并支持预览
问题核心
测试运行失败后生成的截图已保存到测试运行的附件中,但从测试运行创建Bug时,附件不会自动同步到Bug,且测试运行中的截图无法预览。
解决方案
1. 让测试运行中的截图支持预览
修改你的TearDown代码,在添加附件时明确指定附件MIME类型,Azure DevOps会根据类型识别图片并启用预览:
if (TestContext.CurrentContext.Result.Outcome != ResultState.Success) { Screenshot screenshot = ((ITakesScreenshot)Page.GetDriver()).GetScreenshot(); string fileName = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss.fffff}.png"; string path = Path.Combine(Directory.GetCurrentDirectory(), fileName); // 用Path.Combine避免路径拼接问题 screenshot.SaveAsFile(path, ScreenshotImageFormat.Png); // 指定附件类型为image/png,触发DevOps的图片预览支持 TestContext.AddTestAttachment(path, "image/png"); }
修改后重新运行测试,测试运行的Attachments页面中,截图的预览按钮应该会正常启用。
2. 将截图自动关联到Bug工单
Azure DevOps默认不会自动将测试附件复制到Bug,可通过以下两种方式实现:
方式一:手动关联(快速临时场景)
在测试运行的Attachments标签页:
- 右键目标截图 → 选择
Link to work item - 在弹窗中选择对应的Bug工单,确认后截图会出现在Bug的Attachments标签页,且支持预览。
方式二:流水线自动化关联(批量/持续场景)
通过Azure DevOps REST API,在测试完成后自动将测试附件上传到新创建的Bug:
- 在测试流水线的后续阶段添加PowerShell任务,配置如下脚本(替换占位符为你的实际信息):
# 配置参数 $orgUrl = "https://dev.azure.com/你的组织名" $projectName = "你的项目名" $pat = "你的PAT令牌(需包含Work Item Write和Test Management Read权限)" $testRunId = "$(Test.RunId)" # 流水线自动传入的测试运行ID变量 $bugId = "$(刚创建的BugID)" # 需提前通过API获取或传入BugID # 构建请求头 $headers = @{ "Authorization" = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) } # 获取测试运行的所有附件 $attachmentsUrl = "$orgUrl/$projectName/_apis/test/runs/$testRunId/attachments?api-version=7.1-preview.1" $attachments = Invoke-RestMethod -Uri $attachmentsUrl -Headers $headers -Method Get # 逐个将附件上传到Bug foreach ($attachment in $attachments.value) { # 仅处理图片附件 if ($attachment.name.EndsWith(".png")) { # 下载附件到临时文件 $tempPath = Join-Path $env:TEMP $attachment.name Invoke-RestMethod -Uri $attachment.url -Headers $headers -Method Get -OutFile $tempPath # 上传到Bug工单 $uploadUrl = "$orgUrl/$projectName/_apis/wit/workitems/$bugId/attachments?api-version=7.1-preview.3&fileName=$($attachment.name)" Invoke-RestMethod -Uri $uploadUrl -Headers $headers -Method Post -InFile $tempPath -ContentType "image/png" # 删除临时文件 Remove-Item $tempPath } }
- 确保PAT令牌拥有
Work Items (Write)和Test Management (Read)权限,避免API调用失败。
注意事项
- 若使用自动化关联,需确保流水线能获取到测试运行ID和BugID,可通过Azure DevOps的预定义变量或API查询实现。
- 截图文件名需以
.png等图片格式后缀结尾,配合MIME类型参数才能触发预览功能。
内容的提问来源于stack exchange,提问作者Robert Gabriel
相关产品推荐
相关产品推荐

