Files
sap-cli-skill/docs/dev/test-coverage-report.md
T
吴让宇 c5905a5b1e refactor: 本仓升为唯一源(原 sap-cli 源码仓归档)
方向反转:此前 SKILL.md 是「模板渲染产物」、sap-cli 是源;现 sap-cli 归档,
sap-cli-skill 承接开发与分发,SKILL.md 回归手工维护的正本。

迁移(来自 sap-cli,共 104 文件):
- tests/           692 例测试(15 个文件的内联 sys.path 改指 assets/)
- openspec/        SDD 规格与归档变更(42 文件)
- docs/            开发文档与 ADT 原理(含 dev/CLAUDE.md、AGENTS.md)
- .claude/         rules 副本 + settings.json(供 Claude Code)
- .github/ .hermes/ .pre-commit-config.yaml .editorconfig CLAUDE.md
- scripts/ 保持仅 setup.py(pack_skill.py 已随旧仓归档,不迁)

修复(迁移暴露的真实缺陷):
- assets/pyproject.toml 的 build-backend 写作 `setuptools.backends._legacy:_Backend`,
  该模块在 setuptools 中不存在 → `pip install -e` 从来装不上。改为 build_meta。
  实测:临时 venv 安装成功,sap-cli --help 正常列出 31 个命令
- pyproject readme 指向不存在的 assets/README.md(editable 安装会失败)→ 改内联文本
- pyproject urls 改指 sap-cli-skill

机制调整:
- .github/workflows/ci.yml 适配 assets/ 布局;顶部注明该工作流仅 GitHub 执行,
  本仓在 Gitee 不会自动跑
- pre-commit 增本地测试门禁(Gitee 上真正生效的那道)
- .gitignore 合并旧仓完整规则(保留 log/ 下 md 知识库入库,只忽略运行日志)
- 大文件上限 100KB→1MB(架构图 512KB)

守卫测试 tests/unit/test_repo_guards.py(10 → 18 例):
- SKILL.md 须记录 parser 全部 CLI 命令 / 铁律 1-5 须为真实小节标题 / 示例不得违反铁律 5
- references/ 规则齐备;.claude/rules 与 references 必须一致(实测抓到一次真实漂移)
- VERSION == sapcli.__version__ == README 版本
- 仓内不得再出现 pack_skill.py / skill-src(防废弃流程回潮)

698 tests OK;editable 安装与 CLI 入口经临时 venv 实测通过。
docs/RELEASING.md 重写为单源开发流程。
2026-09-11 00:40:15 +08:00

104 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# sap-cli 测试覆盖率报告
> 测试时间:2026-06-09
> 测试用例:6863 pass + 5 skip
> 覆盖率工具:coverage.py
---
## 总体概况
| 指标 | 数值 |
|------|------|
| 源码总行数(Stmts | 3,018 |
| 已覆盖行数 | 674 |
| **总体覆盖率** | **22%** |
---
## 按模块覆盖率(从低到高)
### 🔴 严重不足(< 20%)— 占总代码量 71%
| 模块 | 代码行 | 覆盖率 | 未覆盖行 | 说明 |
|------|--------|--------|---------|------|
| `cli/parser.py` | 114 | **4%** | 110 | CLI 参数定义,仅被 import 触发 |
| `commands/crud.py` | 560 | **5%** | 533 | **最大模块**5 个核心命令零覆盖 |
| `commands/batch.py` | 230 | **7%** | 215 | 批量操作 3 个命令零覆盖 |
| `client.py` | 716 | **7%** | 665 | **第二大的**30 个 API 方法零覆盖 |
| `commands/cds.py` | 126 | **10%** | 114 | CDS 命令零覆盖 |
| `commands/quality.py` | 94 | **10%** | 85 | check + format 零覆盖 |
| `commands/search.py` | 100 | **10%** | 90 | list/whereused/search 零覆盖 |
| `commands/transport.py` | 100 | **10%** | 90 | 传输管理零覆盖 |
| `commands/config_cmd.py` | 75 | **11%** | 67 | config 命令零覆盖 |
| `commands/package_cmd.py` | 78 | **12%** | 69 | package 命令零覆盖 |
| `commands/diff_cmd.py` | 59 | **17%** | 49 | diff 命令零覆盖 |
| `auth.py` | 99 | **31%** | 68 | keyring 方法被测,cmd_auth 未测 |
**小计:2,451 行未覆盖(占总量 81%)**
### 🟡 部分覆盖(20%79%
| 模块 | 代码行 | 覆盖率 | 说明 |
|------|--------|--------|------|
| `commands/analyze.py` | 62 | **34%** | 解析逻辑被测,命令入口未测 |
| `commands/scaffold.py` | 64 | **34%** | 4 个模板生成被测,命令入口未测 |
| `cli/output.py` | 25 | **60%** | print 函数被部分调用 |
| `scanner.py` | 52 | **62%** | 基础扫描被测,函数目录未测 |
| `manifest.py` | 82 | **70%** | CRUD 被测,文件 I/O 边界未测 |
| `config.py` | 62 | **77%** | 环境变量被测,profile/load 未测 |
### 🟢 良好(≥ 80%
| 模块 | 代码行 | 覆盖率 | 说明 |
|------|--------|--------|------|
| `exceptions.py` | 35 | **83%** | 核心异常被测 |
| `ddic.py` | 128 | **84%** | XML/DDL 构建被测 |
| `types.py` | 69 | **90%** | 注册+解析被测,新注册 6 种未测 |
| `sorter.py` | 68 | **96%** | 几乎全覆盖 |
| `xml_utils.py` | 5 | **100%** | 全覆盖 |
| `__init__.py` 系列 | 15 | **100%** | 全覆盖 |
---
## 三层覆盖率分析
```
项目架构 代码行 覆盖率 未覆盖
──────────────────────────────────────────────
CLI 层 parser+app 139 5% 132
命令层 commands/* 1,548 8% 1,424
API 层 client.py 716 7% 665
基础层 其他模块 615 74% 159
──────────────────────────────────────────────
合计 3,018 22% 2,344
```
### 关键发现
1. **CLI 层 + 命令层 + API 层 = 2,403 行,覆盖率仅 7%**
— 这三层占总代码量的 80%,但几乎没有测试
— 原因:现有 68 用例全部测的是基础层(types/config/ddic/manifest/sorter
2. **基础层覆盖率 74%** — 已经不错
— types.py 的 6 种新注册类型需要补充测试
— config.py 的 `load_config(profile=...)` 需要补充测试
3. **单文件代码量 Top 3**
- `client.py` (716行) — 0 测试 ← 最大风险点
- `commands/crud.py` (560行) — 0 测试
- `commands/batch.py` (230行) — 0 测试
---
## 提升路径
| 目标覆盖率 | 需要新增测试 | 预计工时 |
|-----------|-------------|---------|
| 50% | client.py + commands 核心方法 (~130 用例) | 6h |
| 70% | 所有命令 + cli 入口 (~90 用例) | 4h |
| 80% | 边界条件 + 错误路径 (~50 用例) | 3h |
| 90% | 极端场景 + 集成测试 (~40 用例) | 3h |
> HTML 详细报告已生成:`tests/coverage_html/index.html`