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

将NUnit测试结果文件上传至GitHub Actions时遇格式无效问题求助

GitHub Actions提示NUnit测试结果XML格式无效的原因?

我正在为我的C#项目配置GitHub Actions,希望能在GitHub中展示测试结果。我使用了对应工具,YML配置的相关步骤如下:

steps:
- name: 🎉 Test
  run: dotnet test --no-restore --verbosity normal --logger:"nunit"
- name: ⏫ Publish Unit Test Results
  uses: EnricoMi/publish-unit-test-result-action@v1
  if: always()
  with:
    files: ${{ github.workspace }}/*/TestResults/*.xml

测试可正常运行,TestResults.xml文件已生成并完成上传,但GitHub Actions却提示:Error processing result file Invalid format。

目前相关文档较为匮乏,不过根据我了解的信息,GitHub Actions与NUnit均应采用JUnit测试结果格式,且生成的XML文件内容如下:

<test-run id="2" duration="0.028704999999999998" testcasecount="18" total="18" passed="18" failed="0" inconclusive="0" skipped="0" result="Passed" start-time="2022-02-19T 11:32:34Z" end-time="2022-02-19T 11:32:36Z">
  <test-suite type="Assembly" name="HelloCSharp.Api.Tests.dll" fullname="/home/runner/work/hello-c-sharp/hello-c-sharp/HelloCSharp.Api.Tests/bin/Debug/net6.0/HelloCSharp.Api.Tests.dll" total="18" passed="18" failed="0" inconclusive="0" skipped="0" result="Passed" start-time="2022-02-19T 11:32:36Z" end-time="2022-02-19T 11:32:36Z" duration="0.028705">
    <test-case name="DisplayNameForAll" fullname="HelloCSharp.Api.Tests.Models.RelationshipTypeTest.DisplayNameForAll" methodname="DisplayNameForAll" classname="RelationshipTypeTest" result="Passed" start-time="2022-02-19T 11:32:36Z" end-time="2022-02-19T 11:32:36Z" duration="0.006137" asserts="0" seed="1714534364" />
    <!-- snip -->
    <errors />
  </test-suite>
</test-run>

请问出现该问题的原因可能是什么?


问题原因分析

你遇到的问题核心是测试结果XML的格式与EnricoMi/publish-unit-test-result-action@v1默认期望的格式不匹配。虽然NUnit和JUnit的测试报告结构相似,但它们的XML schema(比如根节点、元素命名)有明确差异:

  • 你生成的是NUnit格式的报告,根节点是<test-run>,测试套件用<test-suite>,测试用例用<test-case>;
  • 而该Action默认会以JUnit格式解析报告,JUnit的根节点通常是<testsuites>或<testsuite>,测试用例是<testcase>,元素属性和结构也有区别。

所以Action无法识别你生成的NUnit XML,才会抛出Invalid format错误。

两种可行解决方案

方案1:生成JUnit格式的测试报告

直接修改dotnet test命令,让它生成JUnit兼容的XML报告,这样Action就能直接识别:

steps:
- name: 🎉 Test
  # 修改logger参数为junit,并指定输出路径(可选,方便后续匹配文件)
  run: dotnet test --no-restore --verbosity normal --logger:"junit;LogFilePath=TestResults/junit-test-results.xml"
- name: ⏫ Publish Unit Test Results
  uses: EnricoMi/publish-unit-test-result-action@v1
  if: always()
  with:
    files: ${{ github.workspace }}/*/TestResults/junit-test-results.xml

方案2:让Action明确解析NUnit格式

如果你想保留NUnit格式的报告,只需在Action的with参数中添加format: NUnit,告诉Action按照NUnit的schema解析XML:

steps:
- name: 🎉 Test
  run: dotnet test --no-restore --verbosity normal --logger:"nunit"
- name: ⏫ Publish Unit Test Results
  uses: EnricoMi/publish-unit-test-result-action@v1
  if: always()
  with:
    files: ${{ github.workspace }}/*/TestResults/*.xml
    format: NUnit  # 显式指定格式为NUnit

这样Action就能正确识别你的测试结果文件,不会再抛出格式错误了。


内容的提问来源于stack exchange,提问作者Stefan S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:37:35