如何为Azure DevOps PublishTestResults@2任务添加额外测试附件?
解决Azure DevOps PublishTestResults任务无法附加整个文件夹的问题
问题原因
你当前的配置无法生效,核心原因是对PublishTestResults@2的参数逻辑理解有误:
publishRunAttachments: true仅会解析测试结果XML文件,自动上传XML中引用的附属文件(比如测试框架生成的截图、关联日志等),不会直接遍历并上传指定文件夹的所有内容。searchFolder参数仅用于定位testResultsFiles指定的XML测试结果文件,不是用来设置要附加的文件夹路径。
解决方法
方法1:在测试代码中关联附件到测试结果XML(推荐)
通过测试框架的API,将需要附加的文件路径写入测试结果XML的关联节点,这样PublishTestResults任务会自动识别并上传这些文件。
以xUnit框架为例,可通过ITestOutputHelper输出附件路径:
using Xunit; using Xunit.Abstractions; using System.IO; public class SampleTests { private readonly ITestOutputHelper _testOutput; public SampleTests(ITestOutputHelper testOutput) { _testOutput = testOutput; } [Fact] public void TestWithAttachment() { // 指定要附加的文件路径 string attachmentPath = Path.Combine(Directory.GetCurrentDirectory(), "test-results", "test-log.txt"); // 将路径写入测试输出,xUnit会自动将其纳入测试结果XML _testOutput.WriteLine($"Attachment:{attachmentPath}"); // 执行测试逻辑... } }
方法2:使用UploadTestResultsAttachments@1任务手动上传文件夹
通过专门的UploadTestResultsAttachments@1任务,直接指定文件夹路径,将其中所有文件作为附件上传到测试运行。需注意该任务要在PublishTestResults之后执行,且需引用测试运行ID。
示例YAML配置:
- task: PublishTestResults@2 displayName: 'Publish Test Results' inputs: testResultsFiles: | $(System.DefaultWorkingDirectory)/outputxunit.xml publishRunAttachments: true condition: succeededOrFailed() name: PublishTestResultsTask # 定义任务名称,用于后续获取测试运行ID - task: UploadTestResultsAttachments@1 displayName: 'Upload Test Folder Attachments' inputs: testRunId: $(PublishTestResultsTask.TestRunId) # 引用上一步生成的测试运行ID attachmentType: 'GeneralAttachment' attachmentPath: '$(System.DefaultWorkingDirectory)/test-results' condition: succeededOrFailed()
方法3:通过Azure DevOps REST API上传附件
如果需要更灵活的控制,可调用Azure DevOps REST API手动上传附件:
- 在
PublishTestResults任务执行后,通过任务输出变量TestRunId获取测试运行ID。 - 调用
POST https://dev.azure.com/{组织名}/{项目名}/_apis/test/Runs/{测试运行ID}/attachments?api-version=7.1-preview.1接口,传入文件内容及元数据完成上传。
内容的提问来源于stack exchange,提问作者Sebastian G.
相关产品推荐
相关产品推荐

