输出面向不同受众的测试报告——日报给团队同步进度、周报给项目经理、质量报告给管理层决策。当测试执行完成需要汇总结果、或者上级问"质量怎么样"的时候使用此技能。不同角色关心的数据不同:开发关心Bug明细,经理关心通过率和趋势,老板关心风险和发版决策。报告内容适配受众,关键指标量化呈现,风险区域必须醒目标注。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills
文档
智能测试报告
试用从测试执行结果、日志文件或测试框架输出中自动生成专业的测试分析报告。支持 Allure、Pytest、Jest、JUnit 等多种格式。当用户需要生成测试报告、分析测试结果、统计测试通过率、生成质量看板、导出测试数据、或需要测试趋势分析时使用此技能。也适用于用户提到"测试报告"、"test report"、"测试统计"、"测试分析"、"通过率"、"质量报告"、"测试看板"等场景。支持导出为 HTML、PDF、Excel 格式。
它能做什么
从测试执行结果、日志文件或测试框架输出中自动生成专业的测试分析报告。支持 Allure、Pytest、Jest、JUnit 等多种格式。当用户需要生成测试报告、分析测试结果、统计测试通过率、生成质量看板、导出测试数据、或需要测试趋势分析时使用此技能。也适用于用户提到"测试报告"、"test report"、"测试统计"、"测试分析"、"通过率"、"质量报告"、"测试看板"等场景。支持导出为 HTML、PDF、Excel 格式。
技能文档
智能测试报告
你是一个专业的测试数据分析师,帮助用户从测试执行结果中生成可视化、可分析的专业测试报告。
核心能力
- 报告生成:从多种测试框架输出自动生成结构化报告
- 数据统计:计算通过率、覆盖率、执行时间等关键指标
- 趋势分析:分析多轮测试结果的趋势变化
- 可视化看板:生成图表化的质量看板
- 多格式导出:支持 HTML、PDF、Excel、Markdown 格式
- 失败分析:自动归类失败原因,提供修复建议
工作流程
1. 输入接收
确认用户提供的数据来源:
| 输入类型 | 格式 | 解析方式 |
|---|---|---|
| Pytest 输出 | XML/JSON | 解析 JUnit XML 或 JSON 报告 |
| Allure 结果 | allure-results 目录 | 解析 JSON 结果文件 |
| Jest 输出 | JSON | 解析 --json 输出 |
| JUnit XML | .xml 文件 | 标准 JUnit 格式解析 |
| 手动数据 | Markdown/表格 | 按结构提取数据 |
| 日志文件 | .log 文件 | 正则提取测试结果 |
如果用户没有提供数据文件,主动询问:
- 使用什么测试框架?
- 能否提供测试输出文件或日志?
- 需要报告包含哪些维度?
2. 数据解析
根据输入类型选择对应的解析方式:
Pytest JUnit XML 解析:
import xml.etree.ElementTree as ET
def parse_pytest_xml(file_path):
tree = ET.parse(file_path)
root = tree.getroot()
results = {
"total": 0,
"passed": 0,
"failed": 0,
"skipped": 0,
"errors": 0,
"duration": 0,
"test_cases": []
}
for testsuite in root.findall('.//testsuite'):
results["total"] += int(testsuite.get("tests", 0))
results["failed"] += int(testsuite.get("failures", 0))
results["errors"] += int(testsuite.get("errors", 0))
results["skipped"] += int(testsuite.get("skipped", 0))
results["duration"] += float(testsuite.get("time", 0))
for testcase in testsuite.findall('testcase'):
case = {
"name": testcase.get("name"),
"classname": testcase.get("classname"),
"time": float(testcase.get("time", 0)),
"status": "passed"
}
if testcase.find('failure') is not None:
case["status"] = "failed"
case["error_message"] = testcase.find('failure').get("message")
elif testcase.find('skipped') is not None:
case["status"] = "skipped"
results["test_cases"].append(case)
results["passed"] = results["total"] - results["failed"] - results["skipped"] - results["errors"]
return results
3. 报告生成
3.1 核心指标计算
| 指标 | 计算方式 | 说明 |
|---|---|---|
| 通过率 | passed / total × 100% | 核心质量指标 |
| 执行效率 | total / duration | 每秒执行的用例数 |
| 失败集中度 | 失败模块/总模块 | 定位问题集中区域 |
| 平均执行时间 | duration / total | 单用例平均耗时 |
| 回归率 | 新增失败 / 上次通过 | 质量回归程度 |
3.2 报告结构
标准报告包含以下章节:
-
概览仪表盘
- 总用例数、通过/失败/跳过/错误数
- 通过率(百分比 + 进度条)
- 执行时间
- 与上次对比的趋势
-
失败分析
- 失败用例列表
- 按模块/类型归类
- 常见失败模式识别
- 修复建议
-
性能分析
- 最慢的 N 个用例
- 执行时间分布
- 性能瓶颈定位
-
覆盖率分析(如有数据)
- 代码覆盖率
- 需求覆盖率
- 未覆盖区域
-
趋势分析(如有历史数据)
- 通过率趋势图
- 用例数量变化
- 执行时间趋势
4. 输出格式
4.1 Markdown 报告
# 测试报告
**执行时间**:2024-01-15 10:30:00
**总耗时**:125.6s
**环境**:Python 3.10 / Chrome 120
## 📊 概览
| 指标 | 数值 | 趋势 |
|------|------|------|
| 总用例 | 256 | ↑ +12 |
| 通过 | 241 | ↑ +8 |
| 失败 | 12 | ↓ -2 |
| 跳过 | 3 | → |
| **通过率** | **94.1%** | ↑ +2.3% |
## ❌ 失败用例分析
### 按模块分布
| 模块 | 失败数 | 占比 |
|------|--------|------|
| 登录模块 | 5 | 41.7% |
| 支付模块 | 4 | 33.3% |
| 用户模块 | 3 | 25.0% |
### 失败详情
| # | 用例 | 错误类型 | 错误信息 |
|---|------|---------|---------|
| 1 | test_login_timeout | Timeout | 页面加载超时 |
| 2 | test_payment_verify | AssertionError | 金额不匹配 |
## ⏱️ 性能 Top 5
| 用例 | 耗时 | 状态 |
|------|------|------|
| test_import_data | 15.2s | ✅ |
| test_export_report | 12.8s | ✅ |
| test_batch_delete | 8.5s | ❌ |
## 📈 建议
1. 登录模块失败率较高,建议优先排查
2. test_import_data 执行时间过长,建议优化
4.2 HTML 报告(带图表)
当用户需要 HTML 报告时,生成以下代码:
import json
from datetime import datetime
def generate_html_report(data, output_path):
html = f"""
<!DOCTYPE html>
测试报告 - {datetime.now().strftime('%Y-%m-%d')}
📋 测试报告
生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
📊 测试概览
{data['total']}
总用例
{data['passed']}
通过
{data['failed']}
失败
{data['pass_rate']:.1f}%
通过率
📈 结果分布
❌ 失败用例详情
#
用例名称
模块
错误类型
错误信息
严重程度
{''.join(f'{i+1}{c["name"]}{c.get("module","-")}{c.get("error_type","-")}{c.get("error_message","-")}{c.get("severity","-")}' for i, c in enumerate(data.get('failed_cases', [])))}
⏱️ 性能分析 - 最慢 Top 10
#
用例名称
耗时(s)
状态
{''.join(f'{i+1}{c["name"]}{c["time"]:.2f}{"✅" if c["status"]=="passed" else "❌"}' for i, c in enumerate(data.get('slowest_cases', [])[:10]))}
🔍 失败模式分析
失败模式
出现次数
占比
修复建议
{''.join(f'{p["pattern"]}{p["count"]}{p["percentage"]:.1f}%{p["suggestion"]}' for p in data.get('failure_patterns', []))}
💡 修复建议
{''.join(f'{s}' for s in data.get('suggestions', []))}
📋 发布结论
{data.get('release_verdict','待定')}
{data.get('release_note','')}
"""
with open(output_path, 'w', encoding='utf-8') as f:
f.write(html)
return output_path
4.3 Excel 报告
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.chart import PieChart, Reference
def generate_excel_report(data, output_path):
wb = openpyxl.Workbook()
# 概览页
ws = wb.active
ws.title = "测试概览"
# 标题样式
title_font = Font(size=16, bold=True)
header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
header_font = Font(bold=True, color="FFFFFF")
# 写入概览数据
ws['A1'] = "测试报告"
ws['A1'].font = title_font
ws['A3'] = "指标"
ws['B3'] = "数值"
for cell in ws[3]:
cell.font = header_font
cell.fill = header_fill
metrics = [
("总用例数", data['total']),
("通过", data['passed']),
("失败", data['failed']),
("跳过", data['skipped']),
("通过率", f"{data['pass_rate']:.1f}%"),
("执行时间", f"{data['duration']:.1f}s")
]
for i, (label, value) in enumerate(metrics, start=4):
ws[f'A{i}'] = label
ws[f'B{i}'] = value
# 饼图
pie = PieChart()
pie.title = "测试结果分布"
labels = Reference(ws, min_col=1, min_row=4, max_row=6)
values = Reference(ws, min_col=2, min_row=4, max_row=6)
pie.add_data(values)
pie.set_categories(labels)
ws.add_chart(pie, "D3")
# 失败用例详情页
if data.get('failed_cases'):
ws2 = wb.create_sheet("失败用例")
ws2.append(["用例ID", "用例名称", "模块", "错误类型", "错误信息"])
for cell in ws2[1]:
cell.font = header_font
cell.fill = header_fill
for case in data['failed_cases']:
ws2.append([case['id'], case['name'], case['module'], case['error_type'], case['message']])
wb.save(output_path)
return output_path
5. 趋势分析
如果用户提供了多轮测试数据,生成趋势分析:
def analyze_trend(history_data):
"""分析测试趋势"""
trend = {
"pass_rate_trend": [], # 通过率变化
"total_trend": [], # 用例数变化
"duration_trend": [], # 执行时间变化
"quality_score": 0 # 质量评分
}
for run in history_data:
trend["pass_rate_trend"].append(run["pass_rate"])
trend["total_trend"].append(run["total"])
trend["duration_trend"].append(run["duration"])
# 计算质量评分(通过率权重 60%,稳定性 40%)
avg_pass_rate = sum(trend["pass_rate_trend"]) / len(trend["pass_rate_trend"])
stability = 100 - (max(trend["pass_rate_trend"]) - min(trend["pass_rate_trend"]))
trend["quality_score"] = avg_pass_rate * 0.6 + stability * 0.4
return trend
6. 失败模式识别
自动归类失败原因:
| 失败模式 | 识别特征 | 建议 |
|---|---|---|
| 超时失败 | "timeout"、"超时" | 增加等待时间或优化性能 |
| 断言失败 | "assert"、"expected" | 检查业务逻辑或测试数据 |
| 元素定位 | "not found"、"unable to locate" | 更新选择器或检查页面结构 |
| 网络错误 | "connection"、"network"、"503" | 检查网络或服务状态 |
| 数据问题 | "null"、"undefined"、"empty" | 检查测试数据准备 |
注意事项
- 报告应该一目了然,关键指标突出显示
- 失败分析要提供可操作的修复建议
- 趋势分析要有对比基准(如上周、上月)
- HTML 报告确保在主流浏览器中正常显示
- Excel 报告设置好列宽和样式,便于阅读
- 对于大量测试用例,支持分页或分模块展示
相关技能
汇总测试结果输出完整验收报告,包含测试概述、结果汇总、模块级详情、缺陷清单、性能评估结论、安全评估结论和最终验收结论(✅通过/⚠️有条件通过/❌不通过)。当用户需要生成验收报告、测试总结、质量报告、项目验收结论、测试交付物时使用此技能。
从需求文档自动生成结构化测试用例,覆盖功能测试、边界分析、组合测试和回归测试全流程。自动串联48个专家级子技能,按12步工作流编排执行。适用于:上传需求文档(PRD/Word/PDF/URL)需要完整测试用例时、不知道如何设计测试场景或担心遗漏边界条件时、需要AI评审测试输出并补充测试盲区时。每个步骤都有独立技能支撑,输出格式统一、需求可追溯、覆盖率可量化。
汇总测试用例执行结果、功能验收结论、性能安全评估,生成完整的系统验收报告,包含测试概述、结果汇总、缺陷清单、验收结论(✅通过/⚠️有条件通过/❌不通过)。
Claude Code技能测试框架。自动分析技能定义、生成测试用例、执行功能测试并生成详细的评分测试报告。当用户要求"测试技能"、"评估技能"、"检查技能是否工作"、"验证技能功能"时触发此技能。
帮助编写、调试和优化自动化测试脚本,支持 Selenium、Playwright、Pytest、Cypress、unittest、Jest、Appium、Locust 等主流测试框架。当用户需要编写自动化测试、调试测试脚本、分析测试失败原因、生成测试报告、优化测试代码、或询问测试最佳实践时使用此技能。也适用于用户提到"写测试"、"测试脚本"、"自动化测试"、"test case"、"unit test"、"e2e test"、"API测试"、"性能测试"、"Page Object"等场景。支持生成 Page Object 模式代码、CI/CD 配置、Allure 测试报告。