# Defect Report Generator

> 将缺陷/任务清单 CSV 自动转换成一份自包含的 HTML 测试缺陷报告。当用户给出一份 CSV（含任务状态/标题/负责人/模块/逾期等列）并要求"生成测试报告""出一份缺陷分析报告""根据缺陷清单做统计报告"时使用。脚本仅用 Python 标准库，图表为内联 SVG + CSS（无 CDN），离线可打开。也适用于任务清单、Bug 列表、工单导出的质量分析。

- Skill: `seazhusp/defect-report-generator` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add seazhusp/defect-report-generator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/seazhusp/defect-report-generator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: seazhusp (https://skillmd.com/u/seazhusp)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/seazhusp/defect-report-generator

---


# Defect Report Generator（缺陷/任务清单 → 测试报告）

## Overview

把一份缺陷（或任务/工单）CSV 清单，一键生成一份**自包含、可离线打开**的 HTML 测试缺陷报告。
报告包含：KPI 概览卡片、状态分布环形图、模块分布条形图、各模块状态明细表、负责人分布、
未完成（未关闭）缺陷清单、逾期清单、测试结论与改进建议、数据说明共 8 个章节。

设计要点：仅依赖 Python 标准库（csv/re/math/html/argparse），不联网、不装包；图表手写内联
SVG + CSS，因此双击 HTML 即可打开，不会因缺 CDN 而白屏。

## WHEN to use

- 用户给出一份 CSV 并说："生成测试报告 / 出缺陷分析报告 / 根据这份清单做统计 / 帮我看看缺陷情况"。
- 源文件是缺陷管理、Bug 跟踪、任务看板（TAPD/Jira/禅道等）导出的 CSV。
- 任务列表、工单列表、需求清单的"质量/进度"分析同样适用（列结构相同即可）。

## Workflow（使用流程）

1. **确认输入**：拿到 CSV 路径。若用户没给标题/项目名/测试周期，可用 `--title` / `--project` /
   `--period` 覆盖，或从 CSV 表头（项目列、开始/截止列）自动推断。
2. **运行脚本**（隔离 Python 环境，不要污染用户系统）：
   ```bash
   /Users/zhushengping/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
     ~/.workbuddy/skills/defect-report-generator/scripts/generate_report.py \
     "<CSV路径>" -o "<输出HTML路径>" \
     [--title "报告标题"] [--project "项目名"] [--period "2026-07-10 ~ 2026-07-31"]
   ```
3. **核对输出**：脚本会打印总数、各状态计数、未关闭数、逾期数、解决率、关闭率。
   与业务预期对一下（例如"已验收=45、未关闭=11"是否合理）。
4. **交付**：用 `present_files` 打开 HTML 预览交付；有必要则补充说明口径。

## 列自动识别规则（无需固定表头）

`detect_columns()` 按关键词模糊匹配表头，定位以下列（找不到则为空，统计降级）：

| 逻辑列 | 命中关键词 |
|---|---|
| 状态 | 状态 / status |
| 标题 | 标题 / title / 名称 / summary / 主题 / 描述 |
| 负责人 | 负责人 / 处理人 / owner / assignee / 经办 |
| 模块 | 模块 / module |
| 逾期 | 逾期 / overdue / late |
| 任务ID | 任务id / 缺陷id / bug id / id / 编号 / 序号 |
| 项目/开始/截止 | 项目 / 开始 / 截止·due·完成日期·结束 |

- **模块**优先从标题首段 `【xxx】` 或 `[xxx]` 解析（`extract_module`），无括号才回退到模块列，都没有记"未分类"。
- 编码按 `utf-8-sig → utf-8 → gbk → gb18030` 依次尝试，兼容带 BOM / 中文导出的 CSV。

## 状态映射规则（6 桶模型）

业务状态千奇百怪，脚本用关键词**顺序**匹配把它们归一成 6 个标准桶
（`CANON_RULES`，顺序很重要，先匹配更具体的）：

| 标准桶 | 命中关键词（节选） | 业务含义 |
|---|---|---|
| 已验收 | 已验收/已关闭/验收/closed/verified/已解决 | 测试确认关闭 |
| 已拒绝 | 已拒绝/拒绝/rejected/wontfix/不予修复/不是缺陷/设计如此/重复/不修复 | 开发拒绝或无效缺陷（视为已处理） |
| 修复中 | 修复中/处理中/进行中/in progress/开发中 | 处理中 |
| 已修复 | 已修复/修复/fixed/resolved | 待验证 |
| 待确认 | 待确认/待处理/待验证/待修复/pending/新建/打开/重新打开/待 | 未关闭 |
| 其他 | （以上都不匹配） | 无法归类 |

**口径**：「未关闭」= 已修复 + 修复中 + 待确认 + 其他；
「解决率」= (已验收 + 已拒绝) / 总数；「关闭率」= 已验收 / 总数。

> ⚠️ 维护提示：若"修复中"被错误并入"已修复"，说明 `CANON_RULES` 里 `修复中` 元组不在 `已修复` 之前，
> 保持顺序即可（`修复中` 必须在 `已修复` 之上，否则子串"修复"会把两者吞掉）。

## 输出报告章节

1. 顶部信息条（项目 / 测试周期 / 生成日期 / 总数）
2. KPI 卡片：缺陷总数、已验收、已拒绝、未关闭、逾期
3. 一、缺陷状态分布（环形图 + 图例 + 解决进度说明）
4. 二、缺陷模块分布（条形图，Top10 + 其他）
5. 三、各模块状态明细表
6. 四、负责人分布
7. 五、未完成（未关闭）缺陷清单
8. 六、逾期情况
9. 七、测试结论与建议（结论 + 改进建议两栏）
10. 八、数据说明与局限

## 局限与扩展

- 原数据若缺严重程度 / 优先级 / 发现版本等字段，报告不做相应分析（已在"数据说明"注明）。
- 可在脚本中扩展 `CANON_RULES` 适配更多状态词；需要 Word/PDF 输出可叠加 docx/pptx 技能。
- 换一份同结构 CSV，改路径重跑即更新，无需改代码。

## Resources

### scripts/
- `generate_report.py` —— 核心脚本，标准库实现，见上方"使用流程"。

