JUnit测试报告通过率计算

SKILL研究检索

原名 test-report-analyzer

研究检索 未标注权限 许可证不明确
安装这个技能

解析 JUnit XML 格式的测试报告并计算通过率,仅在明确提到 JUnit XML 且要求计算通过率的场景下使用,泛泛分析测试报告不适用。

一句话选型结论

按资料字段整理

JUnit测试报告通过率计算是研究检索类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类研究检索 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_f6b5330f/test-report-analyzer
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

研究检索
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_f6b5330f仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验2026-11-06上游最后核验时间 · 数据更新 2026-11-06
正文体量9.7 KBSKILL.md 原文大小,越大说明说明书写得越细

能做什么

0 项能力
上游给出的能力概览与适用场景
计算测试通过率解析JUnit报告核对XML测试结果

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
查资料并整理出处

让模型按主题查资料,并把引用来源整理成清单。

网页与文献要点提炼

把长文、论文、网页压成能直接看的要点。

竞品与行业汇总

按关键词汇总竞品动态与行业信息。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在研究检索场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
JUnit测试报告通过率计算当前 未标注权限 未标注 未标注 未标注 有
寻找技能 浏览器控制 GitHub 仓库 3120.0 万 Codex、Claude、Cursor 有
自我改进 Agent 接触敏感数据 ClawHub 市场 1646.4 万 OpenClaw 有
灵魂追踪 联网访问 GitHub 仓库 758.9 万 Codex、Claude、Cursor 有
自我完善 联网访问 ClawHub 市场 682.9 万 OpenClaw 有
微软代工厂 调用外部服务 GitHub 仓库 661.4 万 Codex、Claude、Cursor 有

SKILL.md 全文

9.7 KB
模型实际读到的说明书原文,来自技能仓库

JUnit XML 测试报告分析

1. 触发条件(Trigger)

本 skill 仅在以下两个条件同时满足时调用:

  1. 用户明确提到 JUnit XML(指名 JUnit 格式的 XML 测试报告;泛泛的"测试报告"不算);
  2. 用户明确要求计算通过率(pass rate / 通过率;仅"看一下报告"不算)。

任一条件不满足即不调用,并向用户说明本 skill 的适用场景:解析 JUnit XML 测试报告并计算通过率。

正例(应触发)

  • "帮我分析这份 JUnit XML 报告,算一下通过率"
  • "Parse the surefire JUnit XML report and tell me the pass rate"
  • "这是 CI 产出的 JUnit XML(TEST-xxx.xml),帮我统计一下通过率"

反例(不应触发)

  • "看一下这份测试报告" —— 未指名 JUnit XML,也未要求通过率
  • "分析这份 JUnit XML,告诉我哪些用例失败了" —— 指名了 JUnit XML,但未要求通过率
  • "统计一下这次测试的通过率" —— 要求了通过率,但未指名 JUnit XML 格式

2. 输入契约

项 约定
参数名 xml_path(必填,字符串)
允许形式 本地文件路径(以 .xml 结尾,不区分大小写);或 http:// / https:// URL
  • xml_path 必须为非空字符串;不满足直接失败,不进入解析。
  • 仅当输入以 http:// 或 https:// 开头时才启用网络加载分支;file://、ftp://、data: 等其他协议一律拒绝。
  • 路径处理一律使用 pathlib:收到相对路径时先转为绝对路径再处理,并在 message 中回显解析后的绝对路径(便于排查 cwd 问题);禁止字符串拼接路径。
  • 唯一输入源就是 xml_path:不接受目录、不扫描通配符、不接受内联 XML 文本。
  • 本地文件按二进制读取后自行解码,兼容 UTF-8 与 UTF-8-BOM;解码失败按失败返回。

3. 调用方式

触发条件满足后执行(脚本可从任意 cwd 调用,建议使用绝对路径):

python "<skill-root>/scripts/parse_junit_xml.py" --xml-path "<xml_path>"
  • stdout 只允许输出一个 JSON 对象:单行、ensure_ascii=False、UTF-8。所有日志、warning、traceback 一律走 stderr,stdout 不允许出现任何其他内容。
  • exit code 语义固定:0 = status success;非 0 = status failed,与 JSON 的 status 字段保持一致。
  • 脚本内部以自身文件位置定位依赖模块,不依赖调用时的 cwd。
  • Agent 行为约束:将脚本 stdout 的 JSON 原样作为本 skill 的输出返回给用户,不得增删改字段、不得二次加工结构。 如需额外解释,可在 JSON 之外附加说明文字,但 JSON 本身保持原样。

4. 输出契约(JSON,字段固定)

顶层字段为 source / summary / suites / status / message 五个,固定不变,不允许增删(以下示例值仅供参考):

{
  "source": "<原始输入 xml_path,原样回显>",
  "summary": {
    "total": 0, "passed": 0, "failed": 0,
    "skipped": 0, "errors": 0, "pass_rate": 0.0
  },
  "suites": [
    {
      "name": "<suite 名称>",
      "total": 0, "passed": 0, "failed": 0,
      "skipped": 0, "errors": 0, "pass_rate": 0.0
    }
  ],
  "status": "success | failed",
  "message": "<成功/失败原因的可读中文描述>"
}

统计口径(写死,脚本严格一致):

  • 计数优先级:优先使用 <testsuite> 属性上的 tests / failures / errors / skipped;属性缺失或非数字时,回退为统计子元素数量;属性值与子元素统计不一致时,以子元素统计为准,并在 message 中追加一条 warning。
  • total 为该 suite 的 testcase 总数;failed 与 errors 来自两个不同来源(<failure> / <error>),分字段输出;passed = total − failed − skipped − errors,结果不为负。
  • 参数化测试、重试产生的同名 testcase 按实际条数计数,不按名字去重。
  • summary 为全部 suite 之和;suites 中每个最内层含 testcase 的 <testsuite> 一项,按出现顺序排列;同名 suite 不合并;嵌套 <testsuite> 只统计最内层含 testcase 的 suite,避免父子重复计数。
  • pass_rate = round(passed / total, 4),为 0~1 的小数,不使用百分比字符串;total=0 时 pass_rate=0.0 且 status 仍为 success,message 提示"无测试用例",不得抛 ZeroDivisionError。
  • 类型约束:所有计数输出为 int,pass_rate 输出为 float,禁止输出字符串数字。
  • 成功 message 至少包含:suite 数、用例总数、通过率、解析后的绝对路径;发生口径回退或不一致时追加 warning。
  • 失败时:status="failed",summary 各计数为 0,suites 为空数组 [],message 写明原因;source 仍回显原始输入。

5. 边界与异常规则

统一要求:所有失败都必须以上述契约 JSON 返回,不允许崩溃或静默吞错。失败 message 必须以失败类别开头(参数 / 路径 / 网络 / 解析 / 口径 / 资源)并包含关键上下文(路径、文件大小、耗时、重试次数、解析器报错摘要等),让人不看源码也能定位。脚本顶层必须有统一异常兜底:任何未捕获异常都转换为契约 JSON 输出(exit code 非 0,message 含异常类型与摘要);traceback 不允许出现在 stdout;兜底 except 只允许存在于最外层,内部不得用 except: pass 或宽泛捕获后继续执行。

路径与文件

情形 行为
xml_path 为空 / 非字符串 / 非法形式 [参数] 失败,不进入解析
路径不存在 [路径] 失败,指明路径;不重试
路径是目录 [路径] 失败(与"不存在"分别报错,不合并)
无读权限 [路径] 失败
文件为空(0 字节) [路径] 失败
文件大小超过 200MB(读取前用 getsize 预检) [资源] 失败,报告实际大小与上限
内容不是 UTF-8 / UTF-8-BOM,解码失败 [解析] 失败

网络(仅 http/https 输入启用)

情形 行为
非 http(s) 协议(file://、ftp://、data: 等) [参数] 失败
重定向到非 http(s),或解析到内网私有地址(127.0.0.0/8、10/8、172.16/12、192.168/16、169.254/16、::1) [网络] 立即失败,说明被拒绝的目标(初始 URL 与每一跳重定向同等校验)
重定向次数超过 3 [网络] 失败
连接+读取总超时 单次尝试上限 10 秒(覆盖该次尝试的全部重定向跳转);最多尝试 3 次(固定间隔 1 秒);超时/连接类错误参与重试,3 次均失败 → [网络] 失败,message 记录尝试次数与最后一次错误原因。重试序列总时长(3×10s + 2×1s = 32s)必须落在 wall-clock 上限内,重试耗尽的消息优先于超时兜底
响应体超过 100MB [资源] 立即失败
HTTP 状态码非 200 [网络] 失败,message 含状态码

XML 解析

情形 行为
文档含 DOCTYPE 或 ENTITY 声明 [解析] 解析前直接拒绝(防 XXE/实体膨胀),不进入解析器
XML 格式非法 / 解析失败 [解析] 失败,message 含解析器报错摘要(含行/列)
根节点(剥离命名空间后)既不是 testsuites 也不是 testsuite [解析] 失败,message 说明期望的根节点名,不得当成功处理
空文档 / 不含任何 <testsuite> [解析] 失败
有 <testsuite> 但用例总数为 0 success,total=0,pass_rate=0.0,message 提示无测试用例;不得抛 ZeroDivisionError

资源与运行

情形 行为
脚本整体 wall-clock 超过 40 秒 [资源] 失败,message 明确说明是超时而非解析错误(上限须高于重试序列总时长 32s,保证重试路径优先)
其他任何未捕获异常 顶层兜底转为契约 JSON(类别 + 异常类型与摘要),exit code 非 0

其他硬性要求:所有文件句柄用 with 管理;URL 下载流式读取且不落盘(无临时文件、无缓存目录残留);脚本可重复调用、无副作用——不写业务数据到磁盘,不在 skill 目录生成缓存。

6. 功能边界(禁项)

  • 本 skill 只做"本地 XML 文件解析 + 通过率计算"(URL 加载仅作为 xml_path 的可选输入形式):不包含任何数据库访问代码——无 DB 连接、无 SQL 语句、无相关注释占位。
  • 不读取目录、不解压归档、不调用外部程序、不做本契约之外的任何分析。
  • 仅使用 Python 3.8+ 标准库(xml.etree、pathlib、urllib、json、argparse、sys、os、time 等);不引入第三方库。若未来确需第三方库,必须先在本文件声明,且脚本启动时探测缺失并以契约 JSON 报错,而不是 ImportError 崩溃。

7. 实现位置

  • scripts/parse_junit_xml.py —— CLI 入口:参数接入、统一异常兜底、wall-clock 上限、JSON 输出与 exit code
  • scripts/junit_common.py —— 契约常量(各项上限)、失败类别、统一结果构造
  • scripts/junit_loader.py —— 参数校验、本地/URL 加载(超时、重试、重定向与私网地址校验、响应体大小上限)
  • scripts/junit_parser.py —— XML 解析(命名空间剥离、DOCTYPE 拒绝、嵌套 suite、计数口径与 warning)
  • 本文件(SKILL.md)只描述规范与契约,不包含可执行代码或算法实现。

常见问题

5 问
答案由本站依据条目字段整理
JUnit测试报告通过率计算怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_f6b5330f/test-report-analyzer。安装方式为未标注。装完刷新技能列表或重开客户端。

JUnit测试报告通过率计算支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

JUnit测试报告通过率计算权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

JUnit测试报告通过率计算收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

JUnit测试报告通过率计算用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 2026-11-06。