You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可被Azure Pipeline PublishTestResult@2读取的自定义测试结果XML

如何在Azure Pipeline中用最简XML格式发布自定义测试结果

问题场景

我需要在Azure Pipeline中发布自定义测试结果XML,但现有方案多针对NUnit等单元测试框架,格式冗余。目前已将外部工具的命令行输出(示例如下)解析为包含name和result属性的TestResultEntry列表,需生成能被PublishTestResult@2任务识别的最简XML,用于流水线发布测试结果。

外部工具命令行输出示例:

SDCI_TC_0034: ......[Passed]
SDCI_TC_0035: .................[Passed]
SDCI_TC_0306: .[Skipped]
SDCI_TC_0036: ......[Passed]
SDCI_TC_0037: ......[Passed]
SDCI_TC_0038: ......[Passed]
SDCI_TC_0039: ..[Passed]
SDCI_TC_0040: ..[Passed]
SDCI_TC_0041: ....[Passed]
SDCI_TC_0043: .....[Passed]
SDCI_TC_0044: ..........[Passed]
SDCI_TC_0045: ...[Passed]
SDCI_TC_0046: ....[Passed]
SDCI_TC_0047: ......[Passed]
SDCI_TC_0049: .....[Passed]
SDCI_TC_0312: .[Skipped]

最简兼容XML格式

无需照搬NUnit的复杂结构,选择JUnit或NUnit的最简格式即可被PublishTestResult@2识别,以下是两种方案:

方案1:JUnit最简格式(推荐,结构更简洁)

<testsuite tests="16" failures="0" skipped="2">
  <testcase name="SDCI_TC_0034" status="passed"/>
  <testcase name="SDCI_TC_0035" status="passed"/>
  <testcase name="SDCI_TC_0306" status="skipped"/>
  <!-- 其余测试用例依次添加 -->
</testsuite>
  • 核心要求:根节点为<testsuite>,需指定tests(总用例数)、failures(失败数)、skipped(跳过数)属性;子节点<testcase>需包含name(测试名称)和status(状态,小写:passed/failed/skipped)。

方案2:NUnit最简格式

<test-run>
  <test-suite>
    <test-case name="SDCI_TC_0034" result="Passed"/>
    <test-case name="SDCI_TC_0306" result="Skipped"/>
    <!-- 其余测试用例依次添加 -->
  </test-suite>
</test-run>
  • 核心要求:根节点<test-run>下包含<test-suite>,子节点<test-case>需包含name和result(状态,首字母大写:Passed/Failed/Skipped)。

生成XML的脚本示例(PowerShell)

假设已将外部工具输出解析为$testResults数组,每个元素包含Name和Result属性,用以下脚本生成JUnit格式的XML:

# 统计测试结果数量
$total = $testResults.Count
$failed = ($testResults | Where-Object { $_.Result -eq "Failed" }).Count
$skipped = ($testResults | Where-Object { $_.Result -eq "Skipped" }).Count

# 构建XML内容
$xml = @"
<testsuite tests="$total" failures="$failed" skipped="$skipped">
"@

foreach ($test in $testResults) {
    # 将状态转为JUnit要求的小写格式
    $status = $test.Result.ToLower()
    $xml += "  <testcase name=`"$($test.Name)`" status=`"$status`"/>`n"
}

$xml += "</testsuite>"

# 保存到文件
$xml | Out-File -FilePath "./custom-test-results.xml" -Encoding utf8

Azure Pipeline任务配置

在流水线中添加PublishTestResult@2任务,指定对应的格式和结果文件:

- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 如果用NUnit格式则改为'NUnit'
    testResultsFiles: './custom-test-results.xml'
    failTaskOnFailedTests: true # 可选:若有失败测试,让任务失败终止流水线
    testRunTitle: '外部工具批量测试结果'

内容的提问来源于stack exchange,提问作者Sharku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:35:23