Neatbo.

JUnit离线测试报告

读取本地JUnit XML结果,区分测试用例实际状态与声明计数,将完整失败详情和日志下载为离线报告。

浏览器本地处理输入JUnit XML文件输出离线HTML / JSON / CSV单个文件最多 5 MiB · 最多 20 个
  1. 1添加输入
  2. 2调整设置
  3. 3获取结果

工具输入和文件在当前浏览器处理,不会上传。

输入内容

切换工具时在当前标签页临时保留输入。刷新或关闭后清除,较大的结果可能需要重新生成。

⌘ / Ctrl + Enter 运行

或将文件拖到这里

文件留在当前设备,原始文件不会被覆盖。

.xml

单个文件最多 5 MiB · 最多 20 个

    0 个字符 · 0 字节
    处理选项

    先填写标记为必填的选项,其余可保留默认值。

    正在准备处理工具…

    开始之前

    把CI导出的测试XML转换为可读报告,无需运行测试。保留嵌套测试套件路径、重名用例、多条失败事件及原样文本日志,并一并交付原文件。

    如何使用

    1. 选择一份或多份导出的JUnit XML,或粘贴一个文档。
    2. 检查用例状态、混合事件、嵌套路径及独立保留的套件声明计数。
    3. 下载完整离线HTML、JSON/CSV,并另行保留原XML。

    支持范围与限制

    最多20个UTF-8文件,每个5 MiB、合计10 MiB;或粘贴一个最大5 MiB的XML文档。所有输入合计最多10,000个用例、50,000个XML元素和64层元素深度。选择文件优先于粘贴。下载总计最多10 MiB,完整报告超限时整体拒绝;表格预览前200个用例。

    支持嵌套testsuites/testsuites及testsuite/testcase、failure/error/skipped事件、普通properties和system-out/system-err。一个用例可含多条事件,摘要仍只计一次;不同状态同时出现会标为mixed。重名用例保持独立序号,不合并。

    用例属性支持name、classname、time、assertions、file、line、url和id。未知状态元素或属性、flaky/rerun扩展、DTD和外部实体均拒绝。空套件必须明确声明tests="0"。需要修正或重新导出不支持的生产者格式,不会将其归为通过。

    套件/容器声明的计数与time独立保留。只有每个用例都提供有限非负time时,measuredSeconds才给出其总和,否则为null/未知;该值不等于套件墙钟时间。HTML将所有文本转义,不执行脚本或读取源码路径。JSON保留全部事件、套件日志及属性,CSV保留全部用例,可启用公式保护;原XML另行保留,不复制到下载文件中。

    报告超过20,000字符时,结果文本与复制动作使用紧凑预览。完整report.json、CSV和HTML请下载。 表格长单元格超过2000字符时仅显示前2000加省略号;完整下载不截断。

    操作示例

    示例输入

    <testsuites tests="3" time="99"><testsuite name="unit" tests="3" failures="1" skipped="1"><testcase name="ok" time="0.1"/><testcase name="fails" time="0.2"><failure message="expected 2">actual 1</failure><failure message="second assertion">trace</failure></testcase><testcase name="later" time="0"><skipped message="pending"/></testcase></testsuite></testsuites>
    示例参数
    {"secondary":"","params":{"spreadsheetSafe":true}}

    示例输出

    {"format":"JUnit XML scoped report","summary":{"files":1,"suites":1,"cases":3,"passed":1,"failure":1,"error":0,"skipped":1,"mixed":0,"events":3,"measuredSeconds":0.30000000000000004,"measuredCaseTimes":3,"xmlNodes":8},"sourceFiles":["pasted.xml"],"containers":[{"file":0,"path":[],"attributes":{"tests":"3","time":"99"},"logs":[],"properties":[],"caseIndices":[0,1,2]}],"suites":[{"file":0,"path":["unit"],"attributes":{"name":"unit","tests":"3","failures":"1","skipped":"1"},"logs":[],"properties":[],"caseIndices":[0,1,2]}],"cases":[{"index":0,"file":0,"suitePath":["unit"],"attributes":{"name":"ok","time":"0.1"},"name":"ok","classname":"","time":0.1,"outcome":"passed","events":[],"logs":[],"properties":[]},{"index":1,"file":0,"suitePath":["unit"],"attributes":{"name":"fails","time":"0.2"},"name":"fails","classname":"","time":0.2,"outcome":"failure","events":[{"tag":"failure","attributes":{"message":"expected 2"},"children":[],"text":"actual 1"},{"tag":"failure","attributes":{"message":"second assertion"},"children":[],"text":"trace"}],"logs":[],"properties":[]},{"index":2,"file":0,"suitePath":["unit"],"attributes":{"name":"later","time":"0"},"name":"later","classname":"","time":0,"outcome":"skipped","events":[{"tag":"skipped","attributes":{"message":"pending"},"children":[],"text":""}],"logs":[],"properties":[]}]}

    出现问题时

    去掉DTD/外部实体,检查XML闭合、支持的用例属性和状态、空套件明确零计数,以及有限非负耗时。由生产者重新导出不支持的格式;完整下载超过10 MiB时减少本次输入,再运行。

    常见问题

    三条失败事件为什么不是三个失败用例?

    事件属于用例。同一用例包含多条failure时摘要只计一个失败用例,详情保留全部事件;同时含skipped和failure则标为mixed。

    measuredSeconds应与套件time相同吗?

    不应。它仅在全部用例有时间时求和。套件/容器time和计数作为生产者声明保留,两者含义不同。

    不认识的flaky结果会被计为通过吗?

    不会。未知flaky/rerun/自定义状态会拒绝。请由生产者导出支持的格式,或保留原始文件并在生产者工具中检查。

    文档与延伸阅读

    相关工具