将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.
相关产品推荐
相关产品推荐

