方向反转:此前 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 重写为单源开发流程。
10 KiB
10 KiB
title, created, tags, parent, prev, next
| title | created | tags | parent | prev | next | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 检查代码 - 原理 | 2026-05-18 |
|
sap-cli/README | sap-cli/03.修改代码-原理 | sap-cli/05.提交与传输-原理 |
检查代码 — 原理
[!abstract] 概述 ADT 提供三层代码检查能力:语法检查 (Syntax Check)、ABAP Test Cockpit (ATC) 静态分析** 和 单元测试执行。检查结果通过 REST API 返回,在 Eclipse 中以结构化问题列表展示。
1. 三层代码检查体系
┌──────────────────────────────────────────────────────┐
│ Level 3: 单元测试 (ABAP Unit) │
│ • 执行实际的测试代码 │
│ • 验证运行时行为 │
│ • REST: /sap/bc/adt/oo/classes/{name}/testruns │
├──────────────────────────────────────────────────────┤
│ Level 2: ATC 质量检查 (ABAP Test Cockpit) │
│ • 静态代码分析(功能/性能/安全) │
│ • 可在激活时自动触发 │
│ • REST: /sap/bc/adt/atc/runs │
├──────────────────────────────────────────────────────┤
│ Level 1: 语法检查 (Syntax Check) │
│ • 编译期错误检测 │
│ • 激活前必须通过 │
│ • REST: 集成在 activation 端点中 │
└──────────────────────────────────────────────────────┘
2. 语法检查 (Syntax Check)
原理
语法检查是 最低级别 的代码检查,验证 ABAP 代码是否能够成功编译。它作为激活流程的一部分自动执行,也可以手动触发。
触发时机
| 场景 | 自动/手动 | 说明 |
|---|---|---|
| 激活对象前 | 自动 | 激活框架首先执行语法检查 |
| 编辑器中保存后 | 可配置 | 可设置为保存时自动检查 |
| 手动触发 | 手动 | Ctrl+F2 或菜单 |
工作流程
1. 客户端触发语法检查请求
↓
2. ADT Framework 调用 ABAP 编译器 (ABAP Compiler)
↓
3. 编译器分析源代码:
├── 关键字拼写检查
├── 类型兼容性检查
├── 接口实现完整性检查
└── 引用对象存在性检查
↓
4. 返回检查结果:
├── Errors (错误) — 阻止激活
├── Warnings (警告) — 不阻止但建议修复
└── Information (信息) — 代码改进建议
↓
5. Eclipse 在编辑器中以标记形式展示
(红色波浪线 = Error,黄色 = Warning)
与 SAP GUI 的对比
| ADT 语法检查 | SAP GUI 等效 |
|---|---|
| 自动检查 + 编辑器标记 | SE38 → Check (Ctrl+F2) |
| 保存时可自动检查 | 需要手动触发 |
| 实时错误提示 | 无实时检查 |
3. ABAP Test Cockpit (ATC)
原理
ATC 是 SAP 的 标准化代码质量检查工具,提供比语法检查更深入的静态分析能力,涵盖功能正确性、性能优化和安全合规。
REST API 调用
创建 ATC 运行
POST /sap/bc/adt/atc/runs
Content-Type: application/xml
<?xml version="1.0" encoding="utf-8"?>
<atc:run xmlns:atc="http://www.sap.com/adt/atc"
maximumViolations="100">
<objectSets xmlns:adtcore="http://www.sap.com/adt/core">
<objectSet kind="inclusive">
<adtcore:objectReferences>
<adtcore:objectReference
adtcore:uri="/sap/bc/adt/oo/classes/{class_name}"/>
</adtcore:objectReferences>
</objectSet>
</objectSets>
</atc:run>
获取 ATC 结果
GET /sap/bc/adt/atc/runs/{run_id}/results
响应格式
<atc:findings xmlns:atc="http://www.sap.com/adt/atc">
<atc:finding priority="1"
messageTitle="Possible SQL injection"
location="ZCL_EXAMPLE=>METHOD_X line 42"
checkId="SQL_INJECTION"/>
<atc:finding priority="2"
messageTitle="SELECT * should be avoided"
location="ZCL_EXAMPLE=>METHOD_Y line 15"
checkId="PERFORMANCE_SELECT_STAR"/>
</atc:findings>
ATC 检查类别
| 类别 | 说明 | 示例检查项 |
|---|---|---|
| 功能检查 | 逻辑错误、空引用 | 未处理的异常、未使用的变量 |
| 性能检查 | 性能反模式 | SELECT *、嵌套 SELECT、缺少索引 |
| 安全检查 | 安全漏洞 | SQL 注入、权限检查缺失 |
| 编程规范 | 编码标准 | 命名规范、注释要求 |
| Cloud Readiness | 云兼容性 | 不允许的语句/对象 |
ATC 运行模式
┌──────────────────────────────────────────────────────────┐
│ 模式 1: 手动检查 │
│ 开发者右键 → Run ATC Check │
│ → 立即执行,结果展示在 ATC Results 视图中 │
├──────────────────────────────────────────────────────────┤
│ 模式 2: 激活时自动检查 │
│ 配置 Preferences → ABAP → ATC │
│ → 每次激活时自动触发 ATC │
│ → 发现问题时提示开发者 │
├──────────────────────────────────────────────────────────┤
│ 模式 3: 传输发布时检查 │
│ 传输发布前自动运行 ATC │
│ → 基于 Baseline 只检查新增/修改的代码 │
│ → 确保不会将质量问题引入生产环境 │
├──────────────────────────────────────────────────────────┤
│ 模式 4: 远程代码分析 (Remote Code Analysis) │
│ 在中央 ATC 系统上分析代码 │
│ → 使用最新检查规则 │
│ → 跨系统的代码质量监控 │
└──────────────────────────────────────────────────────────┘
ATC Baseline 概念
[!info] Baseline 的作用 Baseline 允许团队将现有代码标记为"已接受",只对新增或修改的代码运行检查。这避免了在遗留代码上产生大量已知问题。
首次使用:
1. 对整个仓库运行 ATC → 生成 Baseline
2. Baseline 记录所有已知问题
3. 后续检查只报告 Baseline 之后新增的问题
传输检查:
1. 传输发布时运行 ATC
2. 与 Baseline 比对
3. 只有新增问题会阻止传输发布
4. ABAP Unit 测试
原理
ABAP Unit 是 ABAP 的内置单元测试框架。测试方法使用 FOR TESTING 标记,在专门的测试会话中执行。
REST API 调用
POST /sap/bc/adt/oo/classes/{test_class_name}/testruns
后端执行流程
1. ADT 接收测试执行请求
↓
2. ABAP Runtime 创建测试隔离环境
↓
3. 执行标记为 FOR TESTING 的方法
↓
4. 收集测试结果:
├── Passed (通过)
├── Failed (失败) + 失败原因
└── Error (错误) + 异常信息
↓
5. 返回结果给客户端
5. 代码检查与 CI/CD 集成
自动化检查流水线
代码修改 → 语法检查 → ATC 检查 → ABAP Unit → 传输发布
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
保存成功 无错误 无严重问题 全部通过 发布到目标系统
通过 REST API 实现自动化
# 完整的自动检查流程
def automated_code_check(client, object_uri):
# 1. 语法检查(通过激活预检)
activation_result = activate_object(client, object_uri)
if activation_result.get("errors"):
return "BLOCKED: Syntax errors"
# 2. ATC 检查
atc_result = run_atc_check(client, object_uri)
critical_findings = [f for f in atc_result["findings"]
if f["priority"] == "1"]
if critical_findings:
return "BLOCKED: Critical ATC findings"
# 3. 单元测试
test_result = run_unit_tests(client, test_class_uri)
if test_result["failed"] > 0:
return "BLOCKED: Unit test failures"
return "PASSED: All checks green"
6. Eclipse 中的检查结果展示
| 视图 | 说明 |
|---|---|
| Problems View | 语法检查和编译错误 |
| ATC Results View | ATC 检查发现,按严重级别分组 |
| ABAP Unit Results | 单元测试执行结果 |
| Editor Markers | 编辑器中的行内错误/警告标记 |
🔗 相关笔记
- sap-cli/03.修改代码-原理 — 激活流程中集成语法检查
- sap-cli/05.提交与传输-原理 — 传输发布时触发 ATC